Я прочитал каждый вопрос/учебник, который я мог найти при вставке вещей через 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?
где находится массив '$ paid'? – Gopal
$ paid исходит от $ _POST ['paid'], который var_dumps как числовой индексный массив. – LouisK
Что такое определение таблицы для 'finance'? (Особенно в отношении первичных ключей/уникальных ключей) – towr