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