【问题标题】:prepared statement and binding parameters conflict准备好的语句和绑定参数冲突
【发布时间】:2013-10-05 12:59:37
【问题描述】:

请看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

这里有什么问题?

【问题讨论】:

  • 你没有检查返回值;我还建议使用 mysqli_error 来查看实际错误是什么。猜测一下,我会说查询中的?% 是错误的,并且% 应该是$val 的一部分
  • % 是绑定值的一部分,而不是准备好的查询的一部分

标签: php prepared-statement


【解决方案1】:

问题是? 应该作为占位符保留在 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); 

【讨论】:

  • 当我做了你提到的,这是我收到的错误:致命错误:无法通过引用传递参数 2
  • 更新了答案:它是 bindParam,而不是 bindValue,所以值确实应该通过引用传递。
【解决方案2】:

如下修改:

$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 应该仍然只有占位符 '?',而你的变量应该在末尾有通配符 '%'

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多