如何使用sqlsrv_prepare函数

How to use sqlsrv_prepare function

我正在制作一个具有搜索功能的网站,该网站的数据库运行 SQL 服务器。因此,我决定使用 sqlsrv 函数来使用数据库。因为我想清理我的 php 代码以防止 SQL 注入攻击,所以我决定使用 sqlsrv_prepare 函数,正如其他人所建议的 Whosebuger.My 问题是我不能把我的脑袋放在函数上。这是我使用 php.net.

中的示例和注释制作的 php 代码
    <?php
$search = $_POST["search"];
$search = "%$search%";
$sql = "SELECT table1.column1, table1.column2, table1.column3, table2.column1, table2.column2
        FROM table1
        INNER JOIN table2 ON table1.column1 = table2.column3
        WHERE column1 LIKE ?
        ORDER BY den_produs ASC";
$params= array(&$search);
var_dump($sql, $params);
$stmt = sqlsrv_prepare($conn, $sql, $params);
if( !$stmt ) {
    die( print_r( sqlsrv_errors(), true));
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) { 
    if (sqlsrv_execute($stmt)) {
        echo $row['column1']."--> ".$row['column2']."--> ".$row['column3']."|| ".$row['column1'].$row['column2']."<br />";
    }
}
?>

基本上,我有一个包含产品的数据库(因为它是一个电子商务网站),我想搜索产品的名称。 SQL 代码有效(列名和表名已通用,因为它们有奇怪的名称并且又长又不必要),因为我在直接使用 $search 变量搜索时测试了它(这不是当然安全)。感谢您的时间!

编辑: 如果我删除 WHERE 子句,我会得到相同的结果,即使我只删除了第一部分或两者。 var_dump的输出为:

输入 cstring(425) "SELECT table1.column1, table1.column2, table1.column3,table2.column1,table2.column2 FROM table1 INNER JOINtable2 ON table1.column1 =table2.column3 WHERE column4 = 'value given by me' AND column1 LIKE ? ORDER BY column1 ASC" array(2) { [0]=> &string(12) "%searchtest%" [1]=> int(4) }

经过更多的挖掘,我在微软论坛上找到了 post,给出了一个更好的例子。问题是,在准备参数后,我没有执行 sql 代码,正如我在使用参数时应该执行的那样。我也停止使用变量来调用 array.Here 是工作代码:

    <?php
        $search = $_POST["search"];
        $search = "%$search%";
        $sql = "SELECT table1.column1, table1.column2, table1.column3, table2.column1, table2.column2
                FROM table1
                INNER JOIN table2 ON table1.column1 = table2.column3
                WHERE column1 LIKE ?
                ORDER BY den_produs ASC";
        $stmt = sqlsrv_prepare($conn, $sql, array($search));
        if( !$stmt ) {
            die( print_r( sqlsrv_errors(), true));
        }
        sqlsrv_execute($stmt);
    if(sqlsrv_execute($stmt)){
      while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
        echo $row['column1']."--> ".$row['column2']."--> ".$row['column3']."|| ".$row['column1'].$row['column2']."
";
      }
    }else{
      die( print_r( sqlsrv_errors(), true));
    } 
    ?>

如果有人对这个问题有实际的解释,我会非常乐意将其作为已批准的答案,因为我对 php 和 sqlsrv 了解不多。