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');
  2.  
     
  3.  
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  4.  
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.  
    $stmt = $pdo->prepare( 'SELECT * FROM employees WHERE name = :name');
  6.  
    $stmt->execute( array( 'name' => $name));
  7.  
     
  8.  
    foreach ($stmt as $row) {
  9.  
    // do something with $row
  10.  
    }

MYSQLI:

 

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

詳細參考:https://blog.csdn.net/hornedreaper1988/article/details/43520257

PDO:

 

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

 

MYSQLi:

 

 

  1.  
    $stmt = $dbConnection->prepare( 'SELECT * FROM employees WHERE name = ?');
  2.  
    $stmt->bind_param( 's', $name);
  3.  
     
  4.  
    $stmt->execute();
  5.  
     
  6.  
    $result = $stmt->get_result();
  7.  
    while ($row = $result->fetch_assoc()) {
  8.  
    // do something with $row
  9.  
    }
  10.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM