PHP中的操作mysqli的預先處理prepare

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP中的操作mysqli的預先處理prepare ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

PHP中的操作mysqli的預先處理prepare

1、【PHP錯誤】Cannot pass parameter 2 by reference

這個錯誤的意思是不能按引用傳遞第2個參數
出現這個錯誤的原因是bind_param()方法裡的除表示資料類型的第一個參數外,
均需要用變數,而不能用直接量,因為其它參數都是按引用傳遞的

$sql = "select * from tmp where myname=? or sex =?";$stmt = $mysqli->conn->prepare($sql);$name ="a";$sex="b";$stmt->bind_param('ss',$name,$sex);//必須要這樣傳參,且在mysqli等的預先處理參數綁定中,必須要指定參數的類型且只能一次性綁定全部參數,不能像PDO那樣一個個綁定//$stmt->bind_param('ss',"a","b");//這種方式的會報錯:Fatal error: Cannot pass parameter 2 by reference$stmt->execute();if($mysqli->conn->affected_rows){    $result = $stmt->get_result();    while($row = $result->fetch_assoc()){        var_dump($row);    }}

2、PHP防SQL注入不要再用addslashes和mysql_real_escape_string了

  不論是使用addslashes還是mysql_real_escape_string,都可以利用編碼的漏洞來實現輸入任意密碼就能登入伺服器的注入攻擊!!!!(攻擊的原理我就不多說了,感興趣的同學可以研究下字元編碼中單位元組和多位元組的問題)

  mysql_real_escape_string之所以能夠防注入是因為mysql_escape_string本身並沒辦法判斷當前的編碼,必須同時指定服務端的編碼和用戶端的編碼,加上就能防編碼問題的注入了。雖然是可以一定程度上防止SQL注入,但還是建議以下的完美解決方案。

完美解決方案就是使用擁有Prepared Statement機制的PDO和MYSQLi來代替mysql_query(註:mysql_query自 PHP 5.5.0 起已廢棄,並在將來會被移除):

PDO:

  1. $pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');$stmt->execute(array('name' => $name)); foreach ($stmt as $row) {// do something with $row

MYSQLI:

  1. $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');$stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result();while ($row = $result->fetch_assoc()) {// do something with $row}

PDO:

$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');$stmt->execute(array('name' => $name)); foreach ($stmt as $row) {// do something with $row}

MYSQLi:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');$stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result();while ($row = $result->fetch_assoc()) {// do something with $row}

這個錯誤的意思是不能按引用傳遞第2個參數
出現這個錯誤的原因是bind_param()方法裡的除表示資料類型的第一個參數外,
均需要用變數,而不能用直接量,因為其它參數都是按引用傳遞的

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.