错误:sqlstate [hy093]:参数号无效

时间:2016-07-29 13:49:32

标签: php mysql pdo

我可以将echo的输出转换为在phpMyAdmin中执行的SQL语句...

来自:

  

INSERT INTO crumbs(ip_address,ip_address_2,device_info,user_id,connections)VALUES(?,?,?,?,?)值:' 00.000.000.000',' 00.000.000.000 ',0,0000,1

进入:

  

INSERT INTO crumbs(ip_address,ip_address_2,device_info,user_id,connections)VALUES(&#39; 00.000.000.000&#39;,&#39; 00.000.000.000&#39;,0,0000,1)< / p>

它将数据插入到数据库中,没有错误,但是它通过PHP-PDO ...

执行

。通过

  

SQLSTATE [HY093]:参数号无效

代码:

        $columns = '('.implode(',', array_keys($user_connection)).''.",user_id,connections)";
        $inserts="(".implode(',',array_fill(0,count($user_connection)+2, '?')).")";
        $values = implode(', ',($user_connection)).",$user_id, 1";

        $sql_insert = "INSERT INTO crumbs ".$columns." VALUES".$inserts;
        $stmt = $this->_db->prepare($sql_insert);
        $stmt->execute(array($values)); 

编辑 - 添加$ user_connection

$user_connection [ 'ip_address'] = "'".$_SERVER['REMOTE_ADDR']."'";
$user_connection [ 'ip_address_2']="'".$_SERVER['HTTP_X_FORWARDED_FOR']."'";
$user_connection ['device_info']=0;

在执行SQL代码期间发生错误。我已经浏览了所有的例子,没有发现任何相同的东西,我认为它是一个简单的东西,我缺少(规则?),因为代码在本地执行。

1 个答案:

答案 0 :(得分:-1)

你必须做这样的事情:

// ..code..
$values = $user_connection;
$values[] = $user_id;
$values[] = 1;
// ..code..
$stmt->execute($values);

问题说明:

如果您有多个?占位符,则可以将每个值传递为数组的值(请参阅the manual中的Example #3)。

现在,由于您使用的是implode$values将是一个字符串,例如

'192.168.0.1', '8.8.8.8', 0, 'userid', 1

这意味着当你打电话给execute(array($values))时,它实际上会像这样绑定它(仅限于表示,它不是真的像这样)

INSERT INTO crumbs (ip_address,ip_address_2,device_info,user_id,connections) VALUES ("'192.168.0.1', '8.8.8.8', 0, 'userid', 1", ?, ?, ?, ?)

因为你只发送了一个有一个值的数组:另一个数组的内爆。由于您没有提供与占位符(5)相同数量的值(1),因此您最终得到了

  

参数编号无效