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