更新以准备好Mysqli选择语句 - 它找不到该行



我被建议更新我的代码以防止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();

相关内容

最新更新