我被建议更新我的代码以防止SQL注入。这就是我拥有的。
url
变量$Idarticle = "5-6142-8906-6641";
这项工作 - 旧
$sql2 = "SELECT * FROM articles WHERE IDArticle IN ('{$Idarticle}')";
$results2 = $conn->query($sql2);
$row2 = $results2->fetch_assoc();
这不起作用 - 新
$sql2 = "SELECT * FROM articles WHERE IDArticle IN ( ? )";
if ($stmt = $conn->prepare($sql2)) {
$stmt->bind_param("s", $Idarticle);
$stmt->execute();
$row2 = $stmt->fetch();
}
我的连接脚本
$conn = new mysqli($servername, $username, $password, $db);
在第二个示例中,我在第一个中没有得到任何结果(也没有错误)经文,它找到了正确的行。我已经阅读了以前提出的许多类似问题,尽管那里可能有答案,但我没有找到它。我还尝试了其中一些答案而没有任何成功。感谢任何帮助。
每个注释更新代码
$sql2 = "SELECT * FROM articles WHERE IDArticle = ?";
if (!$stmt = $conn->prepare($sql2)) {
if (!$stmt->bind_param("s", $Idarticle));
echo "error: " . $stmt->error;
if (!$stmt->execute());
echo "error: " . $stmt->error;
$row2 = $stmt->fetch();
}
仍然找不到记录/未报告错误
我的解决方案
花了接近两天的研究并试图解决这个问题,我认为Mysqli是问题的核心。为什么我确定这个问题确实对Mysqli有解决方案,最终我转到了PDO。我最初拒绝这样做,但是经过几个小时的学习,我认为这是其他许多人都更好的了。最重要的是,它现在完美无缺,更改很少。我的建议,如果您在Mysqli方面挣扎,请切换到PDO。
非常感谢那些试图提供帮助的人
btw:有什么特殊的使用原因吗?
"SELECT * FROM articles WHERE IDArticle = ?"
这是您的问题:
$row2 = $stmt->fetch();
mysqli_stmt::fetch
返回布尔元素true/false成功,您正在尝试将其用作row2
您必须先用mysqli_stmt::bind_result
绑定结果,然后用fetch
请参阅此创意答案,以了解如何从bind_result
最好是安装了MySQL本地驱动程序,则可以直接使用mysqli_stmt::get_result
另外,您没有检查语句错误。
if ( !$stmt->bind_param("s", $Idarticle) )
echo "error: " . $stmt->error;
if ( !$stmt->execute() )
echo "error: " . $stmt->error;
,您应该确保使用PHP错误报告。
如果$ resucty1/$ resucts2不是错字,那么新代码非常不同,因为必须有两个独立的查询。
$sql2 = "SELECT * FROM articles WHERE IDArticle IN ( ? )";
if ($stmt = $conn->prepare($sql2)) {
$stmt->bind_param("s", $Idarticle);
$stmt->execute();
}
,但尚不清楚代码以后用$ Resucty2所做的事情。Row2可能与
完全无关$row2 = $results1->fetch_assoc();