【问题标题】:Error:sqlstate[hy093]: invalid parameter number错误:sqlstate[hy093]:参数号无效
【发布时间】:2016-12-04 06:35:45
【问题描述】:

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

来自:

INSERT INTO crumbs (ip_address,ip_address_2,device_info,user_id,connections) VALUES(?,?,?,?,?)Value:'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('00.000.000.000', '00.000.000.000', 0,0000, 1)

它将数据插入数据库,没有错误,但是它通过 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 代码期间发生错误。我浏览了所有示例,没有发现任何等效的内容,我认为这是我缺少的一些简单的东西(规则?),因为代码是在本地执行的。

【问题讨论】:

  • 我已经发布了$user_connection的结构,我可能对它的理解有误,但我几乎完全用'array'或上面的方式封装了我的执行命令:execute(array($values) );这些值变成逗号分隔的数组值(或者我的经验如此)。不过给我一分钟,我会尝试将它封装在一个单独的数组中。
  • 好吧,这行得通,我很困惑为什么 array() 在这种情况下不起作用,而它在我的代码中的其他任何地方都起作用。
  • 也许其他地方有点不同。。我不能不看就肯定地说(确保值正确存储在 batabase 中)
  • 评论转换成答案..

标签: php mysql pdo


【解决方案1】:

你必须这样做:

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

问题说明:

当您有多个 ? 占位符时,您可以将 每个值 传递为数组的值(参见 Example #3the manual)。

现在,由于您使用的是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),因此您最终会得到

参数号无效

【讨论】:

  • 好吧,如果你不让我知道出了什么问题,我将无法修复它,@Downvoter
  • 我的主要问题是如何动态构建值,在放入数组时从字符串中去除引号?
  • @Chris 我建议您首先不要添加引号(
  • @Chris 请注意,如果您正确使用准备好的语句并绑定值,如果字符串中有引号,它们将被插入表中,它不会sql injectyou
  • 这不是我担心sql注入,更多的是懒惰,我想在一点初始化值,而不用担心其余的行:) 所以对现在我正在找出一个带有爆炸的功能......
猜你喜欢
  • 2017-10-15
  • 2014-07-21
  • 2023-01-09
  • 2022-08-05
  • 2016-03-04
  • 2019-09-28
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多