PHP中的Prepared语句错误
我使用PHP执行以下SQL查询,$q是一个包含字符串的变量PHP中的Prepared语句错误,php,sql,prepared-statement,Php,Sql,Prepared Statement,我使用PHP执行以下SQL查询,$q是一个包含字符串的变量 $sql =$conn->prepare('SELECT * FROM namebase WHERE name LIKE "%?%"'); $sql->bind_param('s', $q); $sql->execute(); 执行时,我收到一条错误消息,上面说 Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number o
$sql =$conn->prepare('SELECT * FROM namebase WHERE name LIKE "%?%"');
$sql->bind_param('s', $q);
$sql->execute();
执行时,我收到一条错误消息,上面说
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\xampp\htdocs\file\s.php on line 39
第39行是$sql->bind_参数',$q
是什么导致了这个错误?我只向查询传递一个变量。那么为什么会显示此错误消息呢?如果您可以访问数据库,我建议您创建一个存储过程 然后创建如下所示:
getNames(
IN nameVAR VARCHAR(256)
)
SELECT * FROM namebase WHERE name LIKE ‘%nameVAR%’;
然后,在php调用getName时,不要使用当前语句,而是查看mysqli_stmt::bind_param方法文档页面上的注释,有人遇到了完全相同的问题: 我和LIKE操作员有问题 此代码不起作用:
<?php
$test = $sql->prepare("SELECT name FROM names WHERE name LIKE %?%");
$test->bind_param("s", $myname);
?>
解决办法是:
<?php
$test = $sql->prepare("SELECT name FROM names WHERE name LIKE ?");
$param = "%" . $myname . "%";
$test->bind_param("s", $param);
?>
$q可能是数组吗?@Jeff,将bind_参数更改为bind value并检查它again@Jeff它只是一个字符串。像%这样的通配符应该是值的一部分,而不是查询的一部分。此外,引号也是值的一部分。您可能应该注意。您真的应该避免使用closing?>标记您应该特别设置该过程预期的变量数量为什么要为简单的SELECT查询创建存储过程?这确实使一个简单的问题变得过于复杂。使用存储过程并为数据库调用增加最大的安全性也是一个好做法。我认为为每个查询创建存储过程是一个不好的做法。数据库可以同时为多个应用程序提供数据。这些应用程序可能从相同的需求开始,并随着时间的推移逐渐分离。要么你改变程序以适应一个应用程序,可能会搞乱其他应用程序,要么你的数据库在每次应用程序的要求改变时都会充斥着新的程序。那将是一片混乱。只要让应用程序以他们直接需要的方式获取他们需要的数据就行了。我认为这是一种情境和偏好,但它可以帮助您更轻松地维护代码,因为任何sql都将位于同一个位置,而不是混合在您的php中