如何使用sqlsrv_prepare函数

时间:2018-05-04 14:16:42

标签: php sqlsrv

我正在建立一个带有搜索功能的网站,其中包含一个运行SQL服务器的数据库。因此,我决定使用sqlsrv函数来使用数据库。由于我想要针对SQL注入攻击清理我的PHP代码,我决定使用sqlsrv_prepare函数,正如一个stackoverflower的建议。我的问题是我无法绕过函数。这是我使用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)&#34; SELECT table1.column1,table1.column2,table1.column3,table2.column1,table2.column2 FROM table1 INNER JOINtable2 ON table1.column1 = table2.column3 WHERE column4 =&#39 ;我给予的价值&#39;和column1喜欢? ORDER BY column1 ASC&#34; array(2){[0] =&gt; &amp; string(12)&#34;%searchtest%&#34; [1] =&GT; int(4)}

1 个答案:

答案 0 :(得分:0)

经过一番挖掘后,我在微软论坛上发现了一个帖子,给出了一个更好的例子。问题在于,在准备参数之后,我没有执行sql代码,就像我在使用参数时所做的那样。我也停止使用变量来调用数组。这是工作代码:

    <?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。