2014-01-02 4 views
0

Я прочитал каждый вопрос/учебник, который я мог найти при вставке вещей через foreach & PDO, но я все еще оставил царапины на голове.PHP foreach loop для вставки данных в mysql с PDO только вставляет первую строку

Я в основном пытаюсь сделать вставку/обновление партии таблицы, основанной на том, кто заплатил взносы в моем деловом братии (отсюда и «брат»/«бр»).

Поле все время извлекается из POST, поля 1 это сумма взносов ($ суммы), поля 2 является количество людей, которые заплатили ($ num_paid) и поля 3 представляет собой массив идентификаторы пользователей для тех, кто заплатил ($ paid), который создается с помощью флажков, созданных циклом foreach в другом файле.

Лучший способ, который я мог бы проверить, чтобы убедиться, что все правильно введено, состояло в том, чтобы сравнить счет ($ paid) с $ num_paid и действовать только в том случае, если они совпадают. Я открыт для предложений о том, чтобы сделать это лучше, но, похоже, работает так, как есть.

Я пытаюсь перебрать массив из поля 3 ($ paid), используя «foreach», чтобы вставлять новые строки в таблицу в качестве «кредита» для каждого человека, который заплатил, но по какой-то причине он только вставляет в первом цикле, затем каким-то образом вставляет пустые строки для остальных.

Таблица настроена с использованием столбцов: user_id (вводится вручную), transaction_id (AI), дата, кредит, дебет, информация.

Использование: "INSERT INTO finance VALUES(?,NULL,now(),?,?,?)"; Если я ввожу 5 пользователей, он будет вставлять первый с помощью транзакции_id x, затем запускать счетчик автоинкремента еще 4, но ничего не вставлять. Поэтому в следующий раз, когда я попытаюсь вставить, транзакция_ид на 5 больше, чем первая.

например. - Попробуйте 1 вставить строку с transaction_id 43. Попробуйте 2 вставки одной строки, с транзакцией_id 48, но между ними нет ничего.

Я пробовал передать массив в функцию, затем прокручивал ее с помощью «foreach» таким образом, а также пытался использовать цикл «foreach», который вызывает функцию и передает ей строку каждый раз для вставки. Оба, похоже, работают одинаково. Я довольно утерян, потому что кажется, что если счетчик автоинкремента подсчитывается, он должен вставлять данные?

Я думаю, что это все соответствующий код ... (PHP теги были добавлены, чтобы сделать его более удобным для чтения.)

Обработка данных формы, которая вызывает функцию

<?php 
if (isset($_POST['amount']) && 
    isset($_POST['num_paid']) && isset($_POST['paid'])) {   

     $amount = saniString($_POST['amount']); 
     $num_paid = saniString($_POST['num_paid']); 
     $paid = $_POST['paid']; #this is an array of user id's for 
     #who has paid. 

     echo "<br /><br />"; 
     var_dump($paid); 
     echo "<br /><br />"; 
     var_dump($num_paid); 
     echo "<br /><br />"; 
     var_dump($amount); 
     echo "<br /><br />"; 

     if (count($paid) != $num_paid) { 
      echo "<p><b>You did not check the correct number of 
       brothers. Please check your entries and try again.</b></p>"; 
     } 
     elseif (count($paid) == $num_paid) { 
      $match = true; 
      echo "<p><b>Congrats. The numbers match.</b></p>"; 
     } 

     if ($match === true) { 
      if ($amount > 0) { 
       $credit = $amount; 
       $debit = 0; 
      } 
      elseif ($amount < 0) { 
       $credit = 0; 
       $debit = $amount; 
      } 
     else { 
      $credit = 0; 
      $debit = 0; 
     }   
     foreach ($paid as $dirtyId) { 
      $result = updateFin($dirtyId,$broid,$credit,$debit,$dbh); 
      var_dump($result); 
     }      
    }   
} 
?> 

Функция подготовить/привязывать/вставить

<?php 
function updateFin($dirtyId,$broid,$credit,$debit,$dbh) { 
    $sql = "INSERT INTO finance VALUES(?,NULL,now(),?,?,?)"; 
    $query = $dbh->prepare($sql); 

    #foreach ($paid as $dirtyId) { // please notice this is commented out 

    $bro_paid = saniString($dirtyId); 
    $info = "Dues from bro-ID: " . $bro_paid; 

    $query->bindValue(1, $broid); 
    $query->bindValue(2, $credit); 
    $query->bindValue(3, $debit); 
    $query->bindValue(4, $info); 

    try { 
     $result = $query->execute();     
    } 
    catch (PDOException $e) { 
     echo "<br />Insert of $credit, with info $info failed."; 
     echo $e->getMessage(); 
     $result = false; 
    } 
    return $result; 
    #} 
} 
?> 

var_dumping значения Я пытаюсь pass in дает мне то, что я ожидаю - $ amount - строка (50.00), $ num_paid - также строка (5), а $ paid - массив, полный идентификаторов, которые я пытаюсь вставить ...

функция 'saniString' использует strip_tags, htmlentities и stripslashes, если это отношение ...

Если я var_dump($result) возвращает логическое значение (истина), BOOL (ложь), BOOL (ложь), BOOL (ложь), BOOL (ложь). Это то, что я ожидал бы, учитывая мои результаты, за исключением того, что я понятия не имею, почему запросы терпят неудачу, и я не получаю сообщений об ошибках от PDO?

+0

где находится массив '$ paid'? – Gopal

+0

$ paid исходит от $ _POST ['paid'], который var_dumps как числовой индексный массив. – LouisK

+1

Что такое определение таблицы для 'finance'? (Особенно в отношении первичных ключей/уникальных ключей) – towr

ответ

1

проблема вызвана по уникальной по дате. Последующие вставки имеют дату одинаково со второй и поэтому игнорируются (в то время как автоинкремент увеличивается). Так

alter table finance drop index date 

[Изменено] Заходящее $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); должно было привести дубликата вставки бросить исключение с SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry (Это когда я проверить его) Но этот атрибут не устанавливается по умолчанию, когда PDO-объект создано.

Если вы сомневаетесь, вы всегда можете вернуться к проверке информации об ошибке, даже если нет исключения. $err = $query->errorInfo();, для двойной записи вы получите $err[1] == 1062

+0

«вы не можете полагаться на исключения» - наверняка у вас есть доказательство для такого утверждения ? –

+0

Может быть, вам просто нужно сказать PDO, чтобы выкидывать исключения вместо того, чтобы писать такой экранный код после каждого выполнения запроса? –

+0

Возможно, но LouisK сказал, что он установил их, когда создал объект PDO. (Но эта часть кода wasn Предоставлен.) Я проверю (после работы). – towr

0

В этой строке if (count($paid) != $num_paid) { вы не определяющая $match и если это утверждение становится истинным, чем эта строка вызовет ошибку неопределенной переменной $matchif ($match === true) {

Заменить этот блок кода

if (count($paid) != $num_paid) { 
    echo "<p><b>You did not check the correct number of 
     brothers. Please check your entries and try again.</b></p>"; 
    $match = false; 
} 
elseif (count($paid) == $num_paid) { 
    $match = true; 
    echo "<p><b>Congrats. The numbers match.</b></p>"; 
} 
+0

Хороший улов. К сожалению, это не исправило :(Еще только вставляя первую строку и возвращаю bool (false) для остальных. – LouisK

+0

'$ broid' и' $ dbh' также не определены. Где вы их определили? –

+0

$ broid is определяемый при первой загрузке страницы, если пользователь вошел в систему. $ dbh - это объект PDO, который создается при установлении соединения. – LouisK

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