我正在建立一个带有搜索功能的网站,其中包含一个运行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)}
答案 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。