2010-04-19 46 views
2

之前是可能的所以我想进行一次一对夫妇的刀片是一种互相依赖对方。假设我正在做一个狗评级网站。任何人都可以在我的数据库中添加一条狗,但是这样做时他们还需要添加狗的初步评级。其他人随后可以评价狗。评级的狗是多对一的关系:狗有很多评级。Codeigniter/mySQL问题。检查是否镶几个实际的插入

这意味着我的初步加,因为我这个人既速率,并添加狗,我需要的等级,并设置一个外键,狗的主键。据我所知,这意味着我必须添加狗,然后检查新添加的主键是什么,然后在插入之前将其放入我的评分中。

现在假设出了什么出差错等级的插入,无论是我已经在某种程度上忽略了一个字符串太长,或什么的。如果评分失败,狗已经插入,但评分没有。在这种情况下,我希望这只狗不会首先被加入。

这是否意味着我必须编写代码,说明“如果评级失败,为狗做一个删除”,或者有什么方法可以预测狗的关键应该如何按计划进行。有没有办法说“保持那个位置”,然后如果一切正常,添加它?

任何帮助将不胜感激。谢谢!!

回答

6

笨简化了使用交易这一过程。

http://codeigniter.com/user_guide/database/transactions.html

注:

在MySQL中,你需要运行 的InnoDB或BDB表类型,而不是 更常见的MyISAM。

$this->db->trans_start(); 
$this->db->query('INSERT YOUR DOG'); 
$this->db->query('INSERT YOUR RATING'); 
$this->db->trans_complete(); 

if ($this->db->trans_status() === FALSE) 
{ 
    // Something went wrong, but nothing was committed to the database so you can handle the error here 
} 
else { 
    // Everything was added fine 
} 
+0

只有当他具有正确的表类型(innoDb ...等)时才有效。 – SeanJA 2010-04-19 22:24:25

+0

编辑答案使这一点清晰。 – Finbarr 2010-04-19 22:33:24

+1

所以问题:如果我要这样做,我不能使用我的模型吗?我在一对不同的表上运行插入,但都在同一个数据库中。我可以做一些像 $ dog_db = $ this-> load-> database('dog',true); $ dog_db-> trans_start();如果(!$ this-> dogs-> insert($ dog)) $ dog_db-> trans_rollback(); else $ dog_db-> trans_commit(); – Ethan 2010-04-19 23:08:18

3

欢迎land of transactions!我相信你会喜欢你的逗留,因为交易是专门为这个问题而发明的。 :)

基本上,事件发生的顺序将是这个样子到MySQL:现在

START TRANSACTION; 
INSERT INTO dogs ...; 
INSERT INTO dog_ratings...; 
COMMIT; 

,在你的代码,你可以做各种东西,在这些查询之间,并且在结束交易任何时候使用SQL查询ROLLBACK。当你这样做时,作为事务一部分的查询都不会被存储到数据库中。你必须让它笨具体,但基本上它会是这个样子:

$db->query("START TRANSACTION"); 
try { 
    $db->query("INSERT INTO dogs..."); 
    //did that work? Sweet. Run the next one. You can fetch the insert id 
    //here too, if you want to use it in the next query. 
    $db->query("INSERT INTO dog_ratings..."); 
    $db->query("COMMIT"); 
} 
catch (DatabaseException $e) 
{ 
    $db->query("ROLLBACK"); 
    echo "Problem! ".$e->getMessage(); 
} 

在上面的代码中,假设$db是某种数据库包装对象时,查询失败,将抛出一个DatabaseException ,那么如果在事务中的任何查询遇到问题,则不会创建任何记录

有很多了解的交易,因此谷歌了一下周围。需要注意的是,使用MySQL,您需要使用InnoDB表来支持事务。如果您使用的是MyISAM,则会运行START TRANSACTIONCOMMIT等命令,但它们不会执行任何操作。

+0

BDB也是交易安全 – SeanJA 2010-04-19 22:26:04

+0

是欢迎您,zombat! – Ethan 2010-04-19 22:38:44