当我执行时
INSERT INTO `survey`
(`id`,`name`,`date_start`,`date_end`)
values
(:id,:name,NULL,DATE_ADD(NOW(), INTERVAL 1 MINUTE))
on duplicate key UPDATE `name`=:name;
SELECT coalesce(:id,LAST_INSERT_ID()) as 'id'
它插入了一个新的数据fine,但没有选择id(稍后在我的php代码中需要)
我试过这个建议
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
但是这个SQL抛出错误(由于参数重复)
SELECT ASCII(substr(`perm` FROM floor(:i/8)+1))&(1<<(:i%8))>0 as perm FROM `user` WHERE `id`=:id
我处于两败俱伤的境地,重新编写所有的SQL代码以不具有重复的参数会非常混乱,在插入后直接进行单独的选择可能不会返回我想要的id。任何建议都是很棒的
不能同时运行两个查询,一次只能运行一个。
如果您想同时完成整件事,那么创建一个存储过程。
复杂的查询也是如此,当它变得复杂时,您希望在数据库中包含您的逻辑。
这里有一个例子:
DELIMITER //
CREATE PROCEDURE sp_insert_survey(IN `p_id`,
IN `p_name`,
IN `p_date_start`,
IN `p_date_end`)
BEGIN
INSERT INTO `survey`(`id`,`name`,`date_start`,`date_end`)
VALUES (p_id, p_name, p_date_start, p_date_end);
SELECT `id`,`name`,`date_start`,`date_end`
FROM survey WHERE `id` =LAST_INSERT_ID();
END //
DELIMITER ;
从PDO:调用sp
$stmt = $db->prepare('CALL sp_insert_survey(?, ?, ?, ?)');
则获取该数据作为CCD_ 1查询。
输入后,右边出现的一个类似问题——用PDO获取最后插入的行id(不合适的结果)——在问题本身给出了合适的答案,尽管考虑到方法本身受到质疑,我有点怀疑。
$db->lastInsertId();
似乎对我有效,但在相关的问题中,它并没有像提问者所希望的那样有效,所以我还没有完全接受这个答案。这看起来确实有点像黑客。