Php 准备语句并检索所选值
使用带有以下代码的prepared语句从数据库检索值时遇到问题:Php 准备语句并检索所选值,php,mysql,sql,Php,Mysql,Sql,使用带有以下代码的prepared语句从数据库检索值时遇到问题: `$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-
`$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"];
}`
当我查看服务器的errorlog时,它说“变量的数量与准备语句中的参数数量不匹配”,但问号的数量与bind_param函数中的变量数量是匹配的,所以我真的不知道如何解决这个问题。有人知道如何使这项工作正常吗?如果将问号放在字符串中,就像这里一样,SQL解析器将不会将它们视为查询中的参数。相反,它假定它们是字符串文本值的一部分,这将解释参数/查询不匹配的原因 要执行此处尝试执行的操作(在转义之前将附加值连接到值),您需要对通过
bind_param
传递的有界变量或变量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解析器实际上可以从查询中的代码中正确地检测值,这正是您所需要的。否则,您将返回到旧的字符串连接值,并通过执行操作的方式运行它们。非常感谢您回答我的问题。我尝试了你的代码,现在它并没有给我“numer of variables not match”错误,相反,我得到的错误是“调用非对象上的成员函数fetch_assoc()”你知道它为什么告诉我这个吗?你的SQL中很可能有语法错误,导致准备好的语句失败,或者由于其他原因失败。有关如何在失败时获取错误信息的详细信息,请参阅上的手册。