4

我花了几个小时尝试使用 PDO 插入查询,最后我意识到我做不到(不知道怎么做)。问题实际上是列名有“?” 在里面。其中一列名为“如果 HSM 签证到哪一年?”。因此,每次插入时,我都会得到:-传递的参数数量错误或-不能混合名称和?在查询中。

我放弃了,我将改变我必须使用的 mysql 表(谁在用问号命名列?),但我仍然很好奇。

INSERT INTO `tbl_maindetails` (`Id`,`Title`,`If HSM Visa to what year?`) VALUES (?, ?, ?)

谢谢, 戈兰

4

3 回答 3

1
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

会解决问题的,我相信。

于 2013-01-21T16:39:10.077 回答
1

我也有同样的问题!我试图绕过字符“?”之间的混淆。在列(字段)名称和相同的字符“?” 作为PDO中的位置(未命名)占位符,通过切换到命名参数绑定......但问题仍然存在:(

现在,PDO 看到“?” 在列名中,并认为我混淆了命名参数和位置参数!

例如:

UPDATE myTable SET `title` = :title, `Underwater?` = :Underwater 
WHERE ID='123'

连同以下绑定:

 Array ( [:title] => test  [:Underwater] => 0)

产生以下错误消息:

"SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters"

请注意,我避免放置任何“?” 在占位符本身内部(它是":Underwater"而不是":Underwater?",但这无济于事......)

显然,这是一个错误!PDO 看到“?” 在列名中,并得出结论,它是一个位置占位符,即使我们严格使用 NAME 参数绑定!

我看看能不能报告这个bug...

由于 MySQL 允许在列名中使用问号,我看不出我们必须避免使用问号的令人信服的理由!(虽然,在短期内,我会这样做,叹息......)

于 2016-02-19T01:09:31.460 回答
0

这是我能想出的唯一(丑陋的)解决方案:

$db->query("SET @column_name = 'question?'");
$db->query("SET @sql_text = CONCAT('INSERT INTO table1 SET `', @column_name, '` = ?')");
$db->query("PREPARE stmt FROM @sql_text;");
$db->query("SET @v = ?", 'something');
$db->query("EXECUTE stmt USING @v");
echo $db->insert_id();

这将在 table1 中插入一个新行,有问题?='东西'

此代码使用 PDO 包装器,因此您需要对此进行调整。

从长远来看,我认为您通过重命名列做出了正确的选择。

于 2013-01-21T16:28:24.873 回答