Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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/4/sql-server-2008/3.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 使用mysqli bind_param()时出错_Php_Mysql_Mysqli - Fatal编程技术网

Php 使用mysqli bind_param()时出错

Php 使用mysqli bind_param()时出错,php,mysql,mysqli,Php,Mysql,Mysqli,我试图在PHP项目中搜索数据库中的29个字段。我正在使用mysqli连接到我的数据库。当我不尝试使用bind_param()时,我的查询工作正常,但在处理错误时失败: PHP Warning: mysqli_stmt::bind_param() [<a href='mysqli-stmt.bind-param'>mysqli-stmt.bind-param</a>]: Number of variables doesn't match number of paramet

我试图在PHP项目中搜索数据库中的29个字段。我正在使用mysqli连接到我的数据库。当我不尝试使用bind_param()时,我的查询工作正常,但在处理错误时失败:

PHP Warning:  mysqli_stmt::bind_param() [<a href='mysqli-stmt.bind-param'>mysqli-stmt.bind-param</a>]: Number of variables doesn't match number of parameters in prepared statement in /search.php on line 6
PHP警告:mysqli_stmt::bind_param()[]:变量的数量与第6行/search.PHP中准备好的语句中的参数数量不匹配
我的代码如下:

<?php 
$find = $_POST['find'];
if (strcasecmp($_POST['in'], 'users') == 0) {

$query = $db->prepare("SELECT u.id, u.group_id, u.username, u.email, m.credits, m.first_name, m.last_name, m.address1, m.address2, m.city, m.state, m.country, m.zipcode, m.about, m.account_status, m.vacation_status FROM kf_users u JOIN kf_usermeta m ON u.id = m.id WHERE u.id LIKE  '%?%' OR u.group_id LIKE  '%?%' OR u.ip_address LIKE  '%?%' OR u.username  LIKE  '%?%' OR u.password LIKE  '%?%' OR u.salt LIKE  '%?%' OR u.email LIKE  '%?%' OR u.activation_code LIKE  '%?%' OR u.forgotten_password_code LIKE  '%?%' OR u.remember_code LIKE  '%?%' OR u.created_on LIKE  '%?%' OR u.last_login LIKE '%?%' OR u.active LIKE  '%?%' OR u.FUID LIKE  '%?%' OR m.id LIKE  '%?%' OR m.credits LIKE  '%?%' OR m.rating LIKE  '%?%' OR m.user_id LIKE  '%?%' OR m.first_name LIKE  '%?%' OR m.last_name LIKE  '%?%' OR m.address1 LIKE  '%?%' OR m.address2 LIKE  '%?%' OR m.city LIKE  '%?%' OR m.state LIKE  '%?%' OR m.country LIKE  '%?%' OR m.zipcode LIKE  '%?%' OR m.about LIKE  '%?%' OR m.account_status LIKE  '%?%' OR m.vacation_status LIKE '%?%'");
$query->bind_param('sssssssssssssssssssssssssssss',$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find,$find);
$query->execute();
$query->bind_result($id, $group, $username, $email, $credits, $first_name, $last_name, $address1, $address2, $city, $state, $country, $zipcode, $about, $account_status, $vacation_status);

while ($query->fetch()) {
    $result['id'] = $id;
    $result['group'] = $group;
    $result['username'] = $username;
    $result['email'] = $email;
    $result['credits'] = $credits;
    $result['first_name'] = $first_name;
    $result['last_name'] = $last_name;
    $result['address1'] = $address1;
    $result['address2'] = $address2;
    $result['city'] = $city;
    $result['state'] = $state;
    $result['country'] = $country;
    $result['zipcode'] = $zipcode;
    $result['about'] = $about;
    $result['account_status'] = $account_status;
    $result['vacation_status'] = $vacation_status; 
    $output[] = $result;
}

$query->close();

}
?>


同样,如果我注释掉我的bind_param()行,并用搜索词替换查询中的
,则返回数据,此时我得到一个错误,没有数据。有人知道这里可能存在什么问题吗?

您有29个
是您的查询,29个
s
数据类型条目在
bind_param
列表中,以及29个要绑定的
$find
变量,但是,当您将
占位符封装在引号中时,它们不再是占位符,它们只是字符串。因此,MySQL没有看到要绑定的参数,而您正试图绑定29个

要使用准备好的语句执行一个简单的
LIKE
子句,您可以执行以下操作:

$query = $db->prepare("SELECT * FROM some_table WHERE field LIKE ?");
$query->bind_param('s',$find);
在您的情况下,您希望匹配
%$find%
。您可以通过以下方式执行此操作:

$query = $db->prepare("SELECT * FROM some_table WHERE field LIKE ?");
$query->bind_param('s', '%'.$find.'%');
更复杂的是,您可以对每个参数使用
CONCAT()

$query = $db->prepare("SELECT * FROM some_table WHERE field LIKE CONCAT('%', ?, '%')");
$query->bind_param('s',$find);
使用现有代码和第一个方法
(“%”.$find.“%”)进行复制+粘贴


您有29个
是您的查询,29个
s
数据类型条目在
bind_param
列表中,29个
$find
变量要绑定,但是,当您将
占位符封装在引号中时,它们不再是占位符,它们只是字符串。因此,MySQL没有看到要绑定的参数,而您正试图绑定29个

要使用准备好的语句执行一个简单的
LIKE
子句,您可以执行以下操作:

$query = $db->prepare("SELECT * FROM some_table WHERE field LIKE ?");
$query->bind_param('s',$find);
在您的情况下,您希望匹配
%$find%
。您可以通过以下方式执行此操作:

$query = $db->prepare("SELECT * FROM some_table WHERE field LIKE ?");
$query->bind_param('s', '%'.$find.'%');
更复杂的是,您可以对每个参数使用
CONCAT()

$query = $db->prepare("SELECT * FROM some_table WHERE field LIKE CONCAT('%', ?, '%')");
$query->bind_param('s',$find);
使用现有代码和第一个方法
(“%”.$find.“%”)进行复制+粘贴


绑定参数与字符串插值不同;不能仅用
替换变量,也不应引用它们。占位符代表整个值

相反,您应该像这样准备查询

$query = $db->prepare('SELECT ... WHERE u.id LIKE ? OR u.group_id LIKE ? ... ');
然后将值包装在通配符中

$find = '%' . $find . '%';
更新 我强烈建议使用PDO而不是MySQLi。例如,您可以使用命名占位符

$stmt = $pdo->prepare('SELECT ... WHERE u.id LIKE :term OR u.group_id LIKE :term ... ');
$find = '%' . $find . '%';
$stmt->bindParam('term', $find);
$stmt->execute();

这样,您可以在整个查询中重用相同的占位符

绑定参数与字符串插值不同;不能仅用
替换变量,也不应引用它们。占位符代表整个值

相反,您应该像这样准备查询

$query = $db->prepare('SELECT ... WHERE u.id LIKE ? OR u.group_id LIKE ? ... ');
然后将值包装在通配符中

$find = '%' . $find . '%';
更新 我强烈建议使用PDO而不是MySQLi。例如,您可以使用命名占位符

$stmt = $pdo->prepare('SELECT ... WHERE u.id LIKE :term OR u.group_id LIKE :term ... ');
$find = '%' . $find . '%';
$stmt->bindParam('term', $find);
$stmt->execute();

通过这种方式,您可以在整个查询中重复使用相同的占位符

如果这不起作用,那么您可能正在使用mariadb而不是mysql。这个问题是两者之间的细微差别

我对我的代码所做的是使用以下内容对其进行修改:

$search_text=$db->real_escape_string($search_text);
$stmt=$db->prepare("SELECT * FROM rentals WHERE search_text LIKE '%{$search_text}%'");
//TODO Put the bind_param back when it works someday; plus take out the escape.
//$stmt=$db->prepare("SELECT * FROM rentals WHERE search_text LIKE ?");
//$stmt->bind_param('s', '%'.$search_text.'%');
$stmt->execute();

粗糙,但目前是一个有效的解决方案。

如果这不起作用,那么您可能正在使用mariadb而不是mysql。这个问题是两者之间的细微差别

我对我的代码所做的是使用以下内容对其进行修改:

$search_text=$db->real_escape_string($search_text);
$stmt=$db->prepare("SELECT * FROM rentals WHERE search_text LIKE '%{$search_text}%'");
//TODO Put the bind_param back when it works someday; plus take out the escape.
//$stmt=$db->prepare("SELECT * FROM rentals WHERE search_text LIKE ?");
//$stmt->bind_param('s', '%'.$search_text.'%');
$stmt->execute();
粗糙但暂时是一个有效的解决方案。

强调“当你用引号封装你的占位符时——它们不再是占位符,它们只是字符串”,这就是为什么bind_param对我不起作用。强调“当你用引号封装你的占位符时——它们不再是占位符,它们只是字符串”,这就是为什么bind_param不为我工作。