php
  • mysql
  • boolean
  • 2015-05-11 88 views 0 likes 
    0

    代码:失败或成功的查询总是返回true

    $new_deb = 5; 
    //prepare query(); 
    $q = 'START TRANSACTION;'; 
    for($l = 0; $l < $cond; $l++){ 
        if($uploaded == 0 || $uploaded == "0"){ 
         $q .= ' INSERT INTO vocher (`vo_type_id`, `account_id`, `value`, `desc`, `user_id`, `status_id`, `date`, `debtor_id`)'; 
         $q .= ' VALUES ("'.$vouchertype.'", "'.$voucheracc[$l].'","'.$vdebvalue[$l].'", "'.$vdebdesc[$l].'","'.$_POST['usrSes'].'", "'.$status.'","'.$vocherdate[$l].'", "'.$new_deb.'");'; 
        }else{ 
         $q .= ' INSERT INTO vocher (`vo_type_id`, `account_id`, `value`, `desc`, `user_id`, `status_id`, `date`, `debtor_id`, `link`)'; 
         $q .= ' VALUES ("'.$vouchertype.'", "'.$voucheracc[$l].'","'.$vdebvalue[$l].'", "'.$vdebdesc[$l].'","'.$_POST['usrSes'].'", "'.$status.'","'.$vocherdate[$l].'", "'.$new_deb.'", "'.$newAttach.'");'; 
        } 
    
        $q .= ' SET @lastId = (SELECT `id` FROM vocher ORDER BY `id` DESC LIMIT 1);'; 
        if($voCc[$l] != 'e'){ 
         for($h = 0; $h < count($voCc[$l]); $h++){ 
          if($voCc[$l][$h] != 'e'){ 
           $q .= ' INSERT INTO voucher_cc (`voucher`, `cc`) VALUES (@lastId, "'.$voCc[$l][$h].'");'; 
          } 
         } 
        } 
    
        if(in_array($voucheracc[$l], $inResetAccs)){ 
         $q .= ' INSERT INTO resets (`type`, `acc`, `user`, `value`, `desc`, `debtor_id`, `date`, `status`)'; 
         $q .= ' VALUES ("IN", "'.$voucheracc[$l].'", "'.$_POST['usrSes'].'", "'.$vdebvalue[$l].'", "'.$vdebdesc[$l].'", "'.$new_deb.'", "'.$vocherdate[$l].'", "1");'; 
        } 
    } 
    
    for($z = 0; $z < $chqradiolength; $z++){ 
        if ($chqradio[$z] == "0") { 
         $q .= ' INSERT INTO creditor (`acc_id`, `value`, `bank_id`, `debtor_id`, `cheque_no`, `issue_date`, `available_date`, `vo_type_id`, `desc`, `date`, `user`)'; 
         $q .= ' VALUES ("'.$chequeAcc[$z].'", "'.$vvalue[$z].'", "'.$banks[$z].'", "'.$new_deb.'", "'.$vsn[$z].'", "'.$issuesdates[$z].'", "'.$availabledate[$z].'", "'.$vouchertype.'", "'.$vdesc[$z].'", "'.$credates[$z].'", "'.$_POST['usrSes'].'");'; 
         $q .= ' SET @creLastId = (SELECT `id` FROM creditor ORDER BY `id` DESC LIMIT 1);'; 
         for($x = 0; $x < count($chequeCc[$z]); $x++){ 
          $q .= ' INSERT INTO creditor_cc (`creditor`, `cc`) VALUES (@creLastId, "'.$chequeCc[$z][$x].'");'; 
         } 
        }else{ 
         $q .= ' INSERT INTO creditor (`acc_id`, `value`, `debtor_id`, `date`, `desc`, `vo_type_id`, `user`)'; 
         $q .= ' VALUES ("'.$creaccs[$z].'", "'.$vvalue[$z].'", "'.$new_deb.'" , "'.$credates[$z].'" , "'.$vdesc[$z].'" , "'.$vouchertype.'", "'.$_POST['usrSes'].'");'; 
         $q .= ' SET @creLastId = (SELECT `id` FROM creditor ORDER BY `id` DESC LIMIT 1);'; 
    
         if($creCc[$z] != 'e'){ 
          for($x = 0; $x < count($creCc[$z]); $x++){ 
           if($creCc[$z][$x] != 'e'){ 
            $q .= ' INSERT INTO creditor_cc (`creditor`, `cc`) VALUES (@creLastId, "'.$creCc[$z][$x].'");'; 
           } 
          } 
         } 
    
         if(in_array($creaccs[$z], $outResetAccs)){ 
          $q .= ' INSERT INTO resets (`type`, `acc`, `user`, `value`, `desc`, `debtor_id`, `date`, `status`)'; 
          $q .= ' VALUES ("OUT", "'.$creaccs[$z].'" , "'.$_POST['usrSes'].'" , "'.$vvalue[$z].'", "'.$vdesc[$z].'" , "'.$new_deb.'", "'.$credates[$z].'", "1");'; 
         } 
        } 
    } 
    $q .= ' COMMIT;'; 
    $vocher_obj->query($q); 
    $check = $vocher_obj->execute(); 
    if($check){ 
        $res = 1; 
    }else{ 
        $res = 23; 
    } 
    
    echo $res; 
    

    此代码是产生了一些疑问。

    即使我将表名更改为数据库中的“不存在”表,但它应该返回“false”,那些查询总是返回“true”!

    你能帮我解决吗?

    +1

    你不应该将多个查询语句塞入到单个查询调用中。你的代码本质上是活泼的。你不应该使用'select ...'来获取最后生成的id。有'insert_id()'。没有人保证别人不会在背后插入记录。 –

    +0

    这就是为什么我要创建一个事务,所以没有其他人可以在事务完成之前插入。我正在使用PDO而不是MYSQLI –

    +0

    确保您的事务设置实际上在重复读取模式下工作,然后... –

    回答

    0

    这也许是受到此问题的原因包括:https://bugs.php.net/bug.php?id=61613

    它说,如果第一个语句有效,PDO将不会返回一个错误。并且START TRANSACTION;始终有效。

    该错误报告为未定义的 upto verison 5.6.7的PHP。

    不确定这个bug是否也会影响return语句,因为它是关于丢失异常抛出的。但应该很容易测试:在其他任何地方之前添加一个无效的语句,并查看返回值是否为假。

    而且与PDO交易你应该看看

    $pdo->beginTransaction(); 
    $pdo->commit(); 
    $pdo->rollback(); 
    

    要避免上述错误,收起你的查询到一个数组,像这样运行它们(简体):

    function runQueries($pdo, $queries){ 
        try{ 
        $pdo->beginTransaction(); 
        foreach($queries as $q){ 
         $pdo->exec($q); 
        } 
        $pdo->commit(); 
        return true; 
        }catch (PDOException $e){ 
        $pdo->rollback(); 
        return false; 
        } 
    } 
    

    OFC。你需要配置PDO抛出错误,使用

    $pdo = new PDO('mysql:host=localhost;dbname=someDB', 'username', 'password', array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
    )); 
    
    +0

    我想我必须先在“$ q-> execute();”之前运行查询函数。对? –

    +0

    @MohamedSalah该示例在PDOObject上使用'exec()'而不在PDOStatement上的'execute()'。适应您的需求。 – dognose

    +0

    你能告诉我如何声明“$查询”数组吗? –

    相关问题