PHP PDO::准备查询构建-mysql函数的问题

PHP PDO::准备查询构建-mysql函数的问题,php,pdo,Php,Pdo,相关问题,但对我没有帮助: 交易是这样的:我正在为PHPPDO编写一个抽象层,并实现一个查询生成器。 这个确切的问题只发生在INSERT语句中。下面是我的代码示例: $db->insert('table_name') ->keys(array('abc', 'def', 'ghi')) ->values(array($var1, $var2, $var3)) // can take a 2D array if you want to insert multipl

相关问题,但对我没有帮助:

交易是这样的:我正在为PHPPDO编写一个抽象层,并实现一个查询生成器。 这个确切的问题只发生在INSERT语句中。下面是我的代码示例:

$db->insert('table_name')
    ->keys(array('abc', 'def', 'ghi'))
    ->values(array($var1, $var2, $var3)) // can take a 2D array if you want to insert multiple rows at the same time
    ->execute();
底层代码使用?、而不是值构建查询字符串。对于此特定示例,查询将产生以下结果:

INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
(?, ?, ?)
调用execute时,它将值作为一维数组传递给PDOStatement::execute,即所有与问号关联的值都放在一个数组中。这就是问题开始的地方——PDOStatement::execute不处理MySQL函数,而是将它们作为字符串引用,从而破坏了查询:

INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
('123', 456, 'NOW()') -- error, incorrect datetime value: 'NOW()'
问题是-如何在保持相同界面的同时使其工作?我知道我可以检查这个列的值是否是MySQL函数,然后直接把它放进去,而不是用问号,但是有很多函数可以使用,这很糟糕


编辑:所以现在看来,最简单的选择是简单地设置值,这样就可以了:$var3=>'noquote'。这不是一个很好的方法,但它很有效。

我这样处理:

$bdd->prepare(INSERT INTO `table_name` (`abc`, `def`, `ghi`) VALUES (?, ?, ?))
$bdd->execute(array('abcValue', 'devValue', 'ghiValue'))

为该方法添加另一个参数:

表名 值作为关联数组 sql作为关联数组
请记住,如果要访问列,则不能使用“?”,例如。G在COLUMN1+1或COLUMN1+COLUMN2中。

上一次查询出现错误-错误,日期时间值不正确:“现在” 请尝试将日期格式化为以下格式:


日期格式现在,“%Y-%m-%d%H:%i:%s”

PDO已经是一个抽象。添加另一层的目的是什么?afaik pdo没有->插入语句,它有->查询和->准备,所以除非您使用另一个代码抽象,否则插入应该什么都不做。@Lucas-插入不是来自pdo,这是我编写的一个函数,它返回一个对象,该对象包含仅与MySQL INSERT语句相关的方法。更新和选择也是一样。@Olaf-减少人为错误是一个原因。也许你应该发布你的插入函数。如果我只插入一行就行了,但不能以这种方式自动执行多行操作,需要我手动指定col1/col2是变量,col3是MySQL函数。所以,是的,没有真正的帮助。错,它这么说是因为值是带引号的字符串,MySQL函数必须是不带引号的。即,必须将其插入。。值“abc”,现在不插入。。价值观“abc”,“现在”。