ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

PHP-mysqli和bound语句,2031:语句中无参数数据

2019-12-08 14:30:47  阅读:290  来源: 互联网

标签:mysqli prepared-statement php


这是我的代码,不起作用,不知道为什么:

$sql = `INSERT INTO `_translations` (id, module, item_id, name_id, output, language) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE output = ?`
$stmt = mysqli_prepare($this->connection, $sql);
$params = array($stmt, $types);
foreach($array as $k=>&$v){
    $params[] =& $v;
}
// this call is update call, therefore parameters are merged
if($update && $_update) $params = array_merge($params, $_update);
call_user_func_array('mysqli_stmt_bind_param', $params); # i think the problem is in this line..
if(mysqli_stmt_execute($stmt)){
    if($this->transaction){ $this->affected++; }
    else{ $this->affected = 1; }
}else{ 
    $error = mysqli_stmt_error($stmt); 
    $errno = mysqli_stmt_errno($stmt);
    die("{$sql}<br/><pre>".var_export($params, true)."</pre><br/>{$errno}: {$error}");
}

die()结果为:

INSERT INTO `_translations` (id, module, item_id, name_id, output, language) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE output = ?
array (
  0 => 
  mysqli_stmt::__set_state(array(
     'affected_rows' => NULL,
     'insert_id' => NULL,
     'num_rows' => NULL,
     'param_count' => NULL,
     'field_count' => NULL,
     'errno' => NULL,
     'error' => NULL,
     'sqlstate' => NULL,
     'id' => NULL,
  )),
  1 => 'isissss',
  2 => '',
  3 => 'seo',
  4 => '',
  5 => 'keywords',
  6 => 'tesoutput',
  7 => 'en',
  8 => 'tesoutput',
)

2031: No data supplied for parameters in prepared statement

好吧,类型计数等于参数,一切都应该正常工作,但事实并非如此.由于此功能可用于简单插入,因此我知道它可以工作…如果需要更多数据,请随时提出.

有什么办法吗?

提前致谢!

更新#1:
这是$array,$types和$update打印输出.
附言在设置所有这三个变量之前,都有一个链,但是它们确实包含所需的内容!

// $array
array(6) {
  ["id"]=>
  string(0) ""
  ["module"]=>
  string(3) "seo"
  ["item_id"]=>
  string(0) ""
  ["name_id"]=>
  string(8) "keywords"
  ["output"]=>
  string(9) "tesoutput"
  ["language"]=>
  string(2) "en"
}
// $types
string(7) "isissss"
// $update
array(1) {
  [0]=>
  string(9) "tesoutput"
}

我已经认为问题可能出在$types字符串而不是$array值类型,因为所有值都是字符串.不过,我不确定,因为在不进行更新的情况下插入就可以了,即使这些是字符串也是如此.

更新#2:
看来这是一个与版本相关的错误,驱动程序错误-http://bugs.php.net/bug.php?id=43568 …任何人都设法使其起作用> 5.2与mysqlnd吗?而且,是的,在本地主机上,我使用默认的mysql驱动程序运行5.2.6,在生产服务器上,PHP使用mysqlnd运行5.3.5版本.

解决方法:

在对http://bugs.php.net/bug.php?id=43568进行了更多研究之后,我设法通过替换以下内容解决了该问题:

foreach($array as $k=>&$v){
    $params[] =& $v;
}
if($update && $_update) $params = array_merge($params, $_update); # this is the actual line, that I've replaced

与:

// did a little housekeeping too
foreach($array as $k=>&$v) $params[] =& $v;
if($update && $_update) foreach($_update as $kk => $vv) $params[] =& $v; # instead of merging, I'm populating values the hard way.

呵呵,有趣的是5.2如何允许常量值绑定,而5.3则不允许.无论如何,我很高兴我已经解决了这个问题,希望以后对其他人有帮助.

这实际上解释了为什么无论版本如何都可以执行插入操作…这些值开始时都被引用变量填充.

标签:mysqli,prepared-statement,php
来源: https://codeday.me/bug/20191208/2092055.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有