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

    кода:Failed или успех запрос всегда возвращает истинный

    $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; 
    

    Этого код предназначен для создания некоторых запросов.

    Эти запросы всегда возвращают «истину», даже если я изменяю имя таблицы на «не существующую» таблицу в базе данных, тогда как она должна возвращать «ложь»!

    Не могли бы вы помочь мне в этом?

    +1

    вы не должны заполнять несколько запросов запроса одним вызовом запроса. и ваш код по своей сути является ярким. вы не должны использовать 'select ...' для получения последнего сгенерированного идентификатора. есть 'insert_id()'. Нет НИКАКИХ гарантий, что кто-то еще не будет вставлять запись за спину. –

    +0

    Вот почему я создаю транзакцию, поэтому никто другой не может вставить ее до завершения транзакции. И я использую PDO, а не MYSQLI –

    +0

    , убедитесь, что ваши настройки транзакций фактически работают в режиме повторного чтения, затем ... –

    ответ

    0

    Может быть, это вызвано этой ошибкой: https://bugs.php.net/bug.php?id=61613

    Он говорит, если первое утверждение справедливо, PDO не возвращает ошибку. И START TRANSACTION; всегда действует.

    Сообщается, что ошибка не установлена ​​ до версии 5.6.7 от PHP.

    Не уверен, что эта ошибка также влияет на оператор 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; 
        } 
    } 
    

    ОФК. вам нужно настроить PDO на выполнение исключений, используя

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

    Я думаю, что мне нужно запустить функцию запроса перед «$ q-> execute();» правильно? –

    +0

    @MohamedSalah пример использует 'exec()' в PDOObject, а не 'execute()' на PDOStatement. Адаптируйте к вашим потребностям. – dognose

    +0

    Можете ли вы показать мне, как объявить массив «$ queries», пожалуйста? –

    Смежные вопросы