2014-07-08 115 views
1

我通过JavaScript从前端表单收集数据并将其传递到我的PHP脚本以保存到数据库。有三个表格必须全部填充,否则无(有错误)。我将以下文本墙作为我当前的脚本(大大简化为便于阅读),但我知道不会 - 列名称拼写错误,应该引发错误,但是没有,另外两个表保存。交易疑难解答

任何人都可以指出我要去哪里错了吗?

//SAVE TO DB 
    $conn -> beginTransaction(); 
    $errors = array(); 


    //record edit 
    foreach($edits as $edit) 
    { 
     try 
     { 
      $q = $conn -> prepare(" INSERT INTO edits (col1, col2) VALUES (?,?) "); 
      $q   -> execute(array($a, $b)); 

     } 
     catch(PDOException $e) 
     { 
      $conn->rollback(); 
      $errors['Edits'][] = $e->getMessage(); 
     } 
    } 

    //record action 
    foreach($records as $id => $record) 
    { 
     if($haveExitingRecords) 
     { 
      //update existing record 
      try 
      { 
       $q = $conn -> prepare(" UPDATE records SET col1 = ? WHERE ID = ? "); 

       $q -> execute(array($a, $b)); 
      } 
      catch(PDOException $e) 
      { 
       $conn->rollback(); 
       $errors['Updates'][] = $e->getMessage(); 
      } 
     } 
     else 
     { 
      //insert new record 
      try 
      { 
       $q = $conn -> prepare(" INSERT INTO records (col1) VALUES (?) "); 

       $q -> execute(array($a)); 
      } 
      catch(PDOException $e) 
      { 
       $conn->rollback(); 
       $errors['Inserts'][] = $e->getMessage(); 
      } 
     } 

     //also record where x... 
     if($x !== 1) 
     { 
      try 
      { 
       //check for existing record 
       $q = $conn -> prepare(" SELECT ID FROM ifCases WHERE col1 = ? "); 
       $q   -> execute(array($a)); 
       $prev = $q -> fetch(PDO::FETCH_COLUMN); 

       if(!$prev) 
       { 
        $q = $conn -> prepare(" INSERT INTO ifCases (col1, col2) VALUES (?, ?) "); 
        $q   -> execute(array($a, $b)); 
       } 
      } 
      catch(PDOException $e) 
      { 
       $conn->rollback(); 
       $errors['ifCases'][] = $e->getMessage(); 
      } 
     } 
     else 
     { 
      try 
      { 
       //check for existing record 
       $q = $conn -> prepare(" SELECT ID FROM ifCases WHERE col1 = ? AND col2 = ? "); 
       $q   -> execute(array($a, $b)); 
       $prev = $q -> fetch(PDO::FETCH_COLUMN); 

       if($prev > 0) 
       { 
        try 
        { 
         //delete case 
         $q = $conn -> prepare(" DELETE FROM ifCases WHERE col1 = ? AND col2 = ? "); 
         $q   -> execute(array($ $a, $b)); 
        } 
        catch(PDOException $e) 
        { 
         $conn->rollback(); 
         $errors['Delete ifCase'][] = $e->getMessage(); 
        } 
       } 
      } 
      catch(PDOException $e) 
      { 
       $conn->rollback(); 
       $errors['ifCases'][] = $e->getMessage(); 
      } 
     } 
    } 

    if(empty($errors)) 
    { 
     $conn->commit(); 
     echo '{"success":"ok"}'; 
    } 
    else 
    { 
     echo json_encode($errors); 
    } 
+0

你在连接上设置错误模式? '$ conn-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);' – meda

回答

0

因此,您捕捉到一个异常,回滚事务,并完成迄今为止所做的任何工作。

但是,只是因为你回滚,并不意味着你的脚本不能执行后续的陈述。他们只是隐式地开始他们自己的新事务,如果你在默认情况下离开MySQL的autocommit变量,他们会自动提交。

当它捕捉到一个异常时,您应该将当前函数的代码更改为exitreturn。或者设置一个标志变量,然后在设置了标志的情况下跳过随后的数据库动作。

+0

标志的加入确实有效。谢谢! – Eamonn