【问题标题】:mysqli bind_param giving error: (1210) Incorrect arguments to mysql_stmt_executemysqli bind_param 给出错误:(1210)mysql_stmt_execute 的参数不正确
【发布时间】:2012-04-20 16:32:58
【问题描述】:

我有完全相同的代码在另一台服务器上运行良好:

$mysqli_Cxn = new mysqli($SQL_HOST,$SQL_USER,$SQL_PASS,$SQL_DB);
if($mysqli_Cxn->connect_errno){
echo 'Unable to connect!!';
exit();
}

$userID=12345;
$userFirstName = 'Charley';
$userLocale = 'en_US';

$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";

if($stmt = $mysqli_Cxn->prepare($sql)){
 if(!$stmt->bind_param('ssi',$userFirstName,$userLocale,$userID)){
  echo "<br/><br/>Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
 }
 if($stmt->execute()){
  totalAffected=$stmt->affected_rows;
  if($totalAffected>=1){
   echo '<br/><br/>UPDATE OK: Affected rows = '. $totalAffected;
  }
 }else{
  echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
 }
}
$stmt->close();

该代码给了我以下输出: 执行失败:(1210) mysql_stmt_execute 的参数不正确

如果我改变这两行:

$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";
$stmt->bind_param('ssi',$userFirstName,$userLocale,$userID);

到这里:

$sql = "UPDATE userProfile SET userFirstName=?, userLocale='en_US' WHERE id=12345";
$stmt->bind_param('s',$userFirstName);

...然后更新成功,我没有收到任何错误。

有人知道为什么我不能在这段代码中绑定多个参数吗?

我让这段代码在 Centos 4.9、PHP 5.3.3、MySQL 5.0.91/5.0.91-community-log 上完美运行

我需要在我当前的服务器 Centos 6.2、PHP 5.3.10、MySQL 5.0.95-community-log 上运行它

【问题讨论】:

  • 为什么这里的第一个参数不同( 'ssi' 和 's' )?这可能是个问题吗?
  • 他的意思是,如果他将其更改为接受单个参数,则它可以在多个参数不接受的情况下工作。
  • 仅供参考:我 did 重新编译了 PHP+mysqli(至少 5 次),并且我对源文件进行了 md5sum(与此代码工作正常的服务器相比) .唯一非常奇怪的是,我的错误日志中经常出现以下条目“sendmail:未使用正确的有效 GID 运行。sendmail 二进制 setgid 邮件陷阱吗?”...但我确信这是一个完全不同的问题
  • 投票并收藏。我找不到任何相关内容,也找不到任何关于 PHP 版本中可能改变 bind_param 工作方式或代码中任何错误的任何可能更改的文档。祝你好运哥们,希望我能帮忙:(期待答案。
  • 以防万一这对将来的某人有所帮助...尽管使用了 PDO,但我还是遇到了此错误。就我而言,这是因为我的 PHP 逻辑有缺陷,我无意中在 LIMIT,OFFSET 查询中传递了一个负的 OFFSET。

标签: php mysqli


【解决方案1】:

我做了一些研究,结合您的 GCC 版本和您使用的优化标志,这似乎是 MySQL 源代码中报告的错误。 如果您无法更改 MySQL 版本,请尝试在 CFLAGS 中添加 -fno-strict-aliasing 重新编译 MySQL。

更多详情请见http://bugs.mysql.com/bug.php?id=48284

【讨论】:

  • 我无法在这台服务器上重新编译 MySQL(已经更改了源代码来解决这个问题),所以如果我无法在一周内在我的新服务器上重现这个问题,我'将此标记为正确答案并奖励赏金。
  • 不是 100% 相信这是 100% 正确的答案......但我为将来可能遇到此问题的任何人提供了我自己的答案和最终结论。再次感谢您的反馈!
【解决方案2】:

我建议你明确地将$userID 转换为整数并重新测试它是否仍然失败。

由于默认情况下 PHP 变量是变量,因此在将非字符串(在本例中为整数)绑定到查询时可能会遇到问题。

你可以试试:

$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";
$stmt->bind_param('ssi',$userFirstName,$userLocale,(int)$userID);

【讨论】:

  • 您好 StormByte,感谢您的贡献。我忘了提到我确实尝试过转换值......但问题与我不能添加多个标记(即使用多个参数)的事实严格相关,无论参数的类型或我尝试使用它们的顺序。它仍然只接受一个(如果 >= 2 参数则给出错误)
  • 哦!那么我很抱歉,在这种情况下它超出了我的范围:(如果可以的话,请尝试按照@jornare 的建议重新编译(或升级)。
【解决方案3】:

关于这个问题的最后说明。

我使用以下配置启动并运行了一个新服务器:

PHP 5.3.10
MySQL 5.1.61-cll

我让新服务器接受外部连接并在第一台服务器上测试了相同的代码(这次将“localhost”替换为我的新服务器的 IP)。

当我尝试在查询中使用多个参数时,它给了我完全相同的错误。

最后我在新服务器上测试了代码(使用多参数查询),它没有任何问题。

我的逻辑可能有问题,但我想问题出在 mysqli 的客户端版本上:

第一台服务器:

printf("Client library version: %d\n", mysqli_get_client_version());
//Output:
//Client library version: 50095 

新服务器:

printf("Client library version: %d\n", mysqli_get_client_version());
//Output:
//Client library version: 50161 

所以我可以提出两个建议:

  1. 帮自己一个忙,然后转到PDO
  2. 想要/必须只使用 mysqli?确保您的服务器的 mysqli 客户端版本不是 50095

感谢大家的cmets/帮助!

PS:我正在使用带有 CPanel 的 VPS 服务器。我尝试在第一台服务器上使用 WHM 中的 EasyApache 重新编译 mysqli 客户端 - 并且完全是一个菜鸟 - 我想我坚持使用通过 Cpanel 提供的版本(直到我的下一次升级)。

【讨论】:

    【解决方案4】:

    我遇到了完全相同的问题。

    (绑定参数不接受多个参数)

    我使用这个命令的mysql版本:

    printf ("Client library Version:% d \ n", mysqli_get_client_version ());
    

    原为:50094

    50095 版本在此问题上存在争议:

    https://www.liketly.com/forum/thread/27005/mysqli-bind_param-giving-error-1210-incorrect-arguments-to-mysql_stmt_execute/

    在 PHP 5.4 更新到 5.6(在共享服务器上)后,mysql 版本也更新了,问题消失了。

    我的新mysql版本是50011

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多