1

我有以下直接在 MySQL 中工作的 SQL

 INSERT INTO `my_tabel` (`data`) VALUES ("my_value");
 SELECT * from `my_tabel` ORDER BY `id` DESC LIMIT 1

它插入一行,然后获取新行,以便我可以返回新 ID 以供以后使用。

当我尝试在codeIgniter中运行 SQL 时,我收到一条错误消息,指出我的 SQL 中有错误

$m = new my_model();
$sql = 'INSERT INTO `my_tabel` (`data`) VALUES ("'.$my_value.'"); SELECT * from `my_tabel` ORDER BY `id` DESC LIMIT 1';
$m->query($sql);

在codeIgniter中运行单个 SQL 语句可以正常工作,但在我添加第二个 SELECT... 语句时却不行。

任何想法(或替代解决方案)?

谢谢

4

7 回答 7

2

这不是 CI 的限制,而是数据库客户端库的限制。

一次只能执行一个查询。

于 2012-05-17T16:06:15.277 回答
0

为什么不运行两条$m->query()语句?这样您就可以从 CI 中检查每个单独的成功。

在大多数 SQL 接口中,一个查询中有多个语句是有问题的,因为每个语句的结果类型不同。即使在调用存储过程时,也有必要仔细设计存储过程以免返回无关的结果,尽管通常可以使用允许多个结果的特殊、轻松的 api 来处理。

于 2012-05-17T16:02:47.963 回答
0

要获取插入查询后创建的 ID,而不是运行 2 个查询,请使用:

$this->db->insert_id();
于 2012-05-17T16:04:07.743 回答
0

insert_id() 是你的朋友!

$this->db->insert_id()

从这里http://codeigniter.com/user_guide/database/helpers.html

所以像:

$insert_data = array(
  'data' => $my_value
);

$this->db->insert('my_table', $insert_data);

$last_id = $this->db->insert_id();
于 2012-05-17T16:06:33.230 回答
0

正如其他答案中所述,使用 $this->db->insert_id()更好,因为另一个用户有可能在您的两个查询之间插入一行。由于 PHP 一次只能执行一个查询,这可能成为一种竞争条件。

于 2012-05-18T05:19:40.947 回答
0

感谢大家的帮助。对我有用的解决方案是

$m = my_model();
$m->data = $value;
$m->save();
echo $m->id;
于 2012-05-18T08:22:37.570 回答
0

http://www.codeigniter.com/userguide2/database/active_record.html#caching 您可以使用缓存来控制多个查询而不会发生冲突。

于 2015-05-04T05:11:58.813 回答