我无法使用带有以下代码的预准备语句从数据库中检索值:
`$conn=new
mysqli("localhost","username","password","DBname");
$stmt=$conn->prepare("SELECT tag_name FROM tag WHERE tag_name LIKE '%?%' ORDER BY tag_name LIKE '?%',tag_name LIKE '%?%', tag_id DESC LIMIT 5");
$stmt->bind_param("sss", $search, $search, $search);
$result=$stmt->execute();
$stmt->store_result();
while($row=$result->fetch_assoc()){
echo '$row["tag_name"];
}`
当我查看我的服务器的错误日志时,它表示"变量的数量与准备好的语句中的参数数量不匹配",但是问号的数量和变量的数量在bind_param函数是匹配的,所以我真的不知道如何解决这个问题。有谁知道如何使这个东西工作?
答案 0 :(得分:0)
如果您将问号放在字符串中,就像您在此处一样,SQL解析器将不会在查询中将它们视为参数。它假设它们是字符串文字值的一部分,这将解释参数/查询不匹配。
要执行您在此处尝试执行的操作(在转义它们之前将其他值附加到您的值),您需要对通过bind_param
传递的有界变量或变量参数执行此操作。
$conn=new
mysqli("localhost","username","password","DBname");
$stmt=$conn->prepare("SELECT tag_name FROM tag
WHERE tag_name LIKE ?
ORDER BY tag_name LIKE ?,
tag_name LIKE ?,
tag_id DESC
LIMIT 5");
/* Modify values for wildcard search here */
$search1 = "%$search%";
$search2 = "$search%";
$search3 = "%$search%";
$stmt->bind_param("sss", $search1, $search2, $search3);
$result=$stmt->execute();
$stmt->store_result();
while($row=$result->fetch_assoc()){
echo $row["tag_name"];
}
区别在于SQL解析器实际上可以正确地检测查询中代码的值,这正是您想要的。否则,您将返回字符串中旧的连接值,并通过mysqli::real_escape_string
方式运行它们。