Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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中的Prepared语句错误_Php_Sql_Prepared Statement - Fatal编程技术网

PHP中的Prepared语句错误

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

我使用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 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中