2012-11-17 7 views
2

Je suis actuellement en train de suivre un tutoriel sur la création d'un forum en PHP/MySQL ... et je tente de l'implémenter dans mon projet CodeIgniter.CodeIgniter - Insertion de plusieurs tables à l'aide de transactions

J'ai rencontré un problème que je n'avais jamais traité auparavant, les transactions ... J'ai lu la documentation sur les transactions codeigniters, mais je ne comprends pas vraiment le code que je dois convertir. Je me demandais si quelqu'un pouvait prendre le code ci-dessous et le transformer en code de transaction codeigniters pour moi, j'ai essayé de le faire moi-même mais son utilisation de plusieurs tables et je suis juste complètement confus.

Toute aide serait grand, le code est ci-dessous:

$query = "BEGIN WORK;"; 
$result = mysql_query($query) 

if(!$result) { 
    echo 'An error has occured'; 
} else { 
    $sql = "INSERT INTO topics(t_subeject,date,cat) VALUES ($_POST['subject'],NOW(),$_POST['cat'])"; 
    $result = mysql_query($sql); 

    if(!$result) { 
     echo 'An error has occured'; 
     $sql = "ROLLBACK;"; 
     $result = mysql_query($query) 
    } else { 
     $topid = mysql_insery_id(); 
     $sql = "INSERT INTO posts(content, date) VALUES ($_POST['content'],NOW())"; 
     $result = mysql_query($sql); 

     if(!$result) { 
      echo 'An error has occured'; 
      $sql = "ROLLBACK;"; 
      $result = mysql_query($sql); 
     } else { 
      $sql = "COMMIT;"; 
      $result = mysql_query($sql); 
      echo 'Insert successful!'; 
     } 
    } 
} 

Répondre

2

Si un INSERT a échoué, il fera un ROLLBACK automatiquement. C'est pourquoi vous utilisez des transactions en premier lieu. Pas besoin de vérifier explicitement pour cela. Donc, à la fin, cela devrait être tout ce qu'il ya à:

$this->db->trans_start(); 
$this->db->query("INSERT INTO topics(t_subeject,date,cat) VALUES ($_POST['subject'],NOW(),$_POST['cat'])"); 
$topid=$this->db->insert_id(); 
$this->db->query("INSERT INTO posts(content, date) VALUES ($_POST['content'],NOW())"); 
$this->db->trans_complete(); 

... à partir de votre classe de modèle. Donc, si le premier INSERT échoue déjà, il n'exécutera pas le second.

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

+0

Hey, merci pour cela .. qui rend les choses un peu plus facile, après la première requête, comment pourrais-je obtenir le mysql_insert_id, même si la première requête échoue va l'exécuter encore le second? – BigJobbies

+0

Édité ma réponse. – DanMan

+0

Ahhh parfait ... Merci beaucoup! – BigJobbies

Questions connexes