我花了几个小时尝试使用PDO插入查询,最后我意识到我不能这样做(不知道如何)。 问题实际上是列名有“?”在里面。其中一个专栏名为“如果HSM签证到哪一年?”。因此,每次我插入时,我得到: - 传递的参数数量错误或 - 不能混合名称和?在查询中。
我放弃了这个,我将改变我必须使用的mysql表(无论如何命名带有问号的列?),但我仍然很好奇。
INSERT INTO `tbl_maindetails` (`Id`,`Title`,`If HSM Visa to what year?`) VALUES (?, ?, ?)
谢谢, 戈兰
答案 0 :(得分: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包装器,因此您需要对其进行调整。
从长远来看,我认为你通过重命名专栏做出了正确的选择。
答案 1 :(得分:0)
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
我相信会解决这个问题。
答案 2 :(得分:0)
我有同样的问题!我试图绕过角色“?”之间的困惑。在列(字段)名称和相同的字符“?”作为PDO中的位置(未命名)占位符,通过切换到NAMED参数绑定...但问题仍然存在:(
现在,PDO看到“?”在列名称中,我认为我混淆了命名和位置参数!
例如:
UPDATE myTable SET `title` = :title, `Underwater?` = :Underwater
WHERE ID='123'
以及以下绑定:
Array ( [:title] => test [:Underwater] => 0)
在ERROR MESSAGE之后产生:
"SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters"
请注意,我避免放置任何“?”占位符本身内部(它是“:水下”而不是“:水下?”,但它没有帮助...)
显然,这是一个错误! PDO正在看到“?”在列名中,并得出它是位置占位符的结论,即使我们严格使用NAME参数绑定!
我会看看能不能报告这个错误......
由于MySQL允许列名中有问号,因此我认为没有令人信服的理由可以避免它们! (虽然,在短期内,我会这样做,叹息......)