Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 准备语句并检索所选值_Php_Mysql_Sql - Fatal编程技术网

Php 准备语句并检索所选值

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-

使用带有以下代码的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->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中很可能有语法错误,导致准备好的语句失败,或者由于其他原因失败。有关如何在失败时获取错误信息的详细信息,请参阅上的手册。