Php选择语句与id作为记录选择器工作,但如果我使用不同的列作为选择器将不起作用


Php Select Statement works with id as record selector but will not work if I use a different column as a selector

Php Select语句使用id(具有唯一值)作为记录选择器,但如果我使用不同的列(具有唯一值)作为选择器,则无法工作

这是

$Idart = "4";
$sql2 = "SELECT * FROM articles where id in ({$Idart})";
$results2 = $conn->query($sql2);
$row2 = $results2->fetch_assoc();

这行不通

$Idart = "5-6142-8906-6641";
$sql2 = "SELECT * FROM articles where IDStamp in ({$Idart})";
$results2 = $conn->query($sql2);
$row2 = $results2->fetch_assoc();

我已经尝试了各种不同的事情与MYSQL,包括删除"id"列和使"IDStamp"为主键。

因为您将字符串放在IN语句中,没有引号。

$sql2 = "SELECT * FROM articles where IDStamp in ('{$Idart}')";

应该工作。但是,您应该查看prepare语句

尝试在第二个语句的值周围添加引号:where IDStamp in ("'". $value."'")

正如@Bogdan Kuštan在他的回答中提到的,使用准备好的语句。不要选这个作为正确答案,这只是一个如何将其转换为使用准备好的语句的例子(对于mysqli,我个人更喜欢PDO),因为其他人在我之前已经正确回答了。

$Idart = "5-6142-8906-6641";
$sql2 = "SELECT * FROM articles where IDStamp in ( ? )";
if ($stmt = $conn->prepare($sql2)) {
    $stmt->bind_param("s", $Idart);
    $stmt->execute();
    $row2 = $stmt->fetch_assoc();
}

在当今世界,使用预处理语句是非常必要的。有太多的脚本小子在那里寻找黑客网站。甚至在开发和"实践"中。用正确的方法练习。

通过将$Idart放入查询中,有人可以将其用于值'); Drop Table articles; --并擦除数据库表。这是有效的,因为你的then查询变成这样:

       "SELECT * FROM articles where IDStamp in (''); Drop Table articles; --')"
SQL中的

注释使用--完成,因此末尾被忽略。这允许我们完成第一个查询');注入第二个查询,并注释掉第一个查询的其余部分。真的不值得为两三行代码而冒险。