<?php
$mysqli=new mysqli("localhost","root","123","books");
if($stmt=$mysqli->prepare("SELECT id FROM computers WHERE id LIKE ?")) 
{
    $stmt->bind_param("s",$code); //这里只是匿名绑定啊
    $code='29'; 
    $stmt->execute(); 
    $stmt->bind_result($col1);
    while($stmt->fetch()){ 
        printf("%s ",$col1); 
    }
    $stmt->close();
    $mysqli->close();
}
?>

解决方案 »

  1.   

    接上面,
    补充另外问题$sql="set @v=123;select * from my_table where col=@v;"
    mysqli_multi_query($handle, $sql);这样的查询是否安全,有没有注入危险?
      

  2.   

    就是按顺序绑定,不能按名称绑定。oracle/sqlserver都能按名称绑定。我做了个测试,觉得没有注入风险。$sql="set @v='123;select version()';select * from my_table where col=@v;";直接拿《set @v='123;select version()';select * from my_table where col=@v;》到mysql里执行,select versoin()不回会起作用。能够给一个危险的事例语句吗?
      

  3.   

    1、
    mysqli 只能匿名,按顺序绑定
    pdo 就可以按名称绑定了
    你使用 mysqli 就不如使用 pdo 了2、
    不存在注入风险
    $sql="set @v=123;select * from my_table where col=@v;"

    $sql="select * from my_table where col=123;"
    一样。
    既然没有外部数据传入,当然也就没有注入风险了
      

  4.   

    $v=123;
    $sql="set @v=$v;select * from my_table where col=@v;"或许我写成这样就看的更明白了