预准备语句和绑定参数冲突


prepared statement and binding parameters conflict

请看一下PHP代码:

$val = $_POST['name']; 
$stmt = $mysqli->stmt_init(); 
$stmt->prepare("SELECT id, name, email FROM some_table WHERE name LIKE ?%"); 
$stmt->bind_param('s', $val); 
$stmt->execute(); 

当我运行此查询时;我收到以下错误:警告:mysqli_stmt::bind_param():无效的对象或资源mysqli_stmt

这是怎么回事?

更改如下:

$val = $_POST['name'] . '%'; 
$stmt = $mysqli->stmt_init(); 
$stmt->prepare("SELECT id, name, email FROM some_table WHERE name LIKE ?"); 
$stmt->bind_param('s', $val);
$stmt->execute();

基本上,准备好的 stmt 应该仍然只有占位符 '?',而你的变量末尾应该有通配符 '%'

问题是?应该保留为 SQL 表达式中的占位符,或者 - 再次作为占位符,在 SQL 函数中使用。因此,您在这里有两个选择:只需将%添加到提供的值,如下所示:

$val = $_POST['name'] . '%';
$stmt->prepare("SELECT id, name, email FROM some_table 
  WHERE name LIKE ?"); 
$stmt->bind_param('s', $val); 

。或者保留该值,改为修改 SQL:

$stmt->prepare("SELECT id, name, email FROM some_table 
  WHERE name LIKE CONCAT(?, '%')"); 
$stmt->bind_param('s', $val);