Php 更新到准备好的mysqli SELECT语句-找不到该行

Php 更新到准备好的mysqli SELECT语句-找不到该行,php,select,mysqli,Php,Select,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 * F

有人建议我更新代码以防止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


非常感谢那些试图帮助你的人

顺便问一下:使用IN有什么特别的原因吗

"SELECT * FROM articles WHERE IDArticle = ?"

如果$results1/$results2不是打字错误,那么新代码就非常不同,因为必须有两个独立的查询

$sql2 = "SELECT * FROM articles WHERE IDArticle IN ( ? )";
if ($stmt = $conn->prepare($sql2)) {
  $stmt->bind_param("s", $Idarticle);
  $stmt->execute();
}
但不清楚代码后面对$results2做了什么。第2行可能与

$row2 = $results1->fetch_assoc();
这就是你的问题:

$row2 = $stmt->fetch();
成功时返回布尔值true/false,您试图将其用作
行2的数组

您必须先将结果与绑定,然后
fetch

有关如何从
bind\u结果

最好是,如果已安装,则可以直接使用


此外,您没有检查语句错误

if ( !$stmt->bind_param("s", $Idarticle) )
    echo "error: " . $stmt->error;

if ( !$stmt->execute() )
    echo "error: " . $stmt->error;

你应该确保你正在使用。

花括号在这里没有帮助。op在中使用的原因是他试图从多个帖子中提取记录。$Idarticle=“5-6142-8906-6641”;问题中只有一个值,而不是一个列表<代码>(“{$Idarticle}”)
在工作示例中向参数添加大括号。啊,关于中的参数,您可能是对的。但是大括号用于php变量扩展,在您的使用中不正确。我尝试了大括号,但抛出了一个错误-无法通过引用传递参数(指的是行号。到目前为止,这是旧脚本的残余。马上回来,必须遛狗。好的,根据我的评论,我去掉了括号,回到了我开始的地方。没有记录没有错误。旧代码无法工作,因为
$results2
不是
$results1
,所以你可能应该修复这个打字错误。非常好很抱歉对结果1造成混淆,这是我的问题中的一个输入错误,但不是在我的工作示例中。我更正了这个问题。@spaceman:NP,您是否尝试了=?变量?否则,请几乎保留原始代码,但
$IDarticleEscape=mysqli\u real\u escape\u string($Idarticle);$sql2=“选择*自Idarticle所在的文章(${$IDArticleSeverit}');
是的,我尝试了=?。在发布这个问题之前,我最初的想法是你对变量进行清理的解决方案,但我想他让我尝试一下的是什么。几个小时后我还在想。我将按照Puckett的建议进行错误检查。
$Idarticle=“5-6142-8906-6641”
;这不是整数;)但是如果-你是对的。不管怎样,错误检查总是一个很好的做法。谢谢你撤销下一票。@lexx LOL你对这一票了如指掌!我不应该在我的手机上这么做。谢谢你抓住了那个。谢谢我会这么做并跟进,所以我添加了错误检查,我没有收到任何错误,它仍然没有找到任何结果。在这一点上,我在想这是一匹死马。它不会去任何地方。感谢你的时间和想法。@Spaceman好的,我终于到了一台真正的计算机上并加载了这个。问题现在非常明显,我已经更新了我的答案。