php pdo插入到名称中带有问号的列

php pdo插入到名称中带有问号的列,php,pdo,Php,Pdo,我花了几个小时试图使用PDO插入一个查询,最后我意识到我不能这样做(不知道怎么做)。 问题是,实际上列名中有“?”。其中一列名为“如果HSM签证到哪一年?”。因此,每次插入时,我都会得到: -传递的参数数目错误,或 -不能把名字和名字混在一起?在查询中 我放弃了这一点,我打算修改我要使用的mysql表(到底是谁在用问号命名列?),但我仍然很好奇 INSERT INTO `tbl_maindetails` (`Id`,`Title`,`If HSM Visa to what year?`) VAL

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

我放弃了这一点,我打算修改我要使用的mysql表(到底是谁在用问号命名列?),但我仍然很好奇

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

以下是我能想到的唯一(丑陋的)解决方案:

$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();
这将在表1中插入一个新行,其中有问题?='有事

这段代码使用的是PDO包装器,因此您需要对此进行调整

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

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

我相信这会解决问题。

我也有同样的问题!我试图通过切换到命名参数绑定来避免列(字段)名称中的字符“?”与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?”,但没有任何帮助…)

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

我看看能不能报告这个错误


由于MySQL允许在列名中使用问号,我看不出有什么令人信服的理由我们必须避免使用问号!(不过,在短期内,我会这么做,叹气……)

听起来你可能在PDO中发现了一个错误,因为你在查询中似乎正确地引用了列名-我会继续。但是就像你说的,有一个带有问号的列名听起来像是一个糟糕的DB设计,重命名列名才是问题的实际答案。我同意@DaveRandom。我建议你只使用u在列名中唱数字、字母或破折号(远离下划线)。没有帮助。\?不要做任何事情。如果有人找到解决方案,我很乐意听到。