gpt4 book ai didi

PHP foreach循环使用PDO将数据插入mysql仅插入第一行

转载 作者:行者123 更新时间:2023-11-29 13:20:49 24 4
gpt4 key购买 nike

我已经阅读了我能找到的关于通过 foreach 和 PDO 插入内容的所有问题/教程,但我仍然摸不着头脑。

我基本上试图根据谁在我的商业兄弟会中缴纳会费(因此是“兄弟”/“兄弟”)来批量插入/更新表。

这些字段都是从 POST 中检索的,字段 1 是会费金额 ($amount),字段 2 是已付款的人数 ($num_paid) 字段 3 是已付款 ($paid) 的用户 ID 数组,它是通过另一个文件中的 foreach 循环创建的复选框创建的。

我认为检查以确保输入正确的最好方法是将 count($paid) 与 $num_paid 进行比较,只有在它们匹配时才继续。我愿意接受有关做得更好的建议,但它似乎就是这样工作的。

我试图使用“foreach”从字段 3($paid)循环遍历数组,在表中插入新行作为每个已付款人的“信用”,但由于某种原因它只插入第一个循环,然后以某种方式为其余的插入空行。

该表设置有以下列:user_id(手动输入)、transaction_id(AI)、日期、贷方、借方、信息。

使用:"INSERT INTO Finance VALUES(?,NULL,now(),?,?,?)"; 如果我插入 5 个用户,它将插入第一个用户的 transaction_id x,然后将自动增量计数再增加 4,但不插入任何内容。所以下次我尝试插入时,transaction_id 比第一次多了 5。

例如-- 尝试 1 插入 transaction_id 43 的一行。尝试 2 插入 transaction_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);
}
}
}
?>

准备/绑定(bind)/插入函数

<?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 我试图传入的值给出了我所期望的结果 - $amount 是一个字符串 (50.00),$num_paid 也是一个字符串 (5),$paid 是一个充满 ID 的数组我正在尝试插入...

“saniString”函数使用 strip_tags、htmlentities 和 stripslashes(如果相关的话)...

如果我 var_dump($result) 它返回 bool(true),bool(false),bool(false),bool(false),bool(false)。这是我所期望的结果,但我不知道为什么查询失败并且我没有从 PDO 收到任何错误消息?

最佳答案

该问题是由日期的唯一性引起的。后续插入的日期与秒相同,因此它们被忽略(同时自动增量递增)。所以

alter table finance drop index date

[已编辑]设置 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 应该会导致重复插入抛出异常,并显示 SQLSTATE[23000]: Integrity Constraint Violation: 1062重复条目(当我测试它时确实如此)但是创建 PDO 对象时默认情况下不会设置此属性。

当有疑问时,即使没有异常,您也可以随时返回检查错误信息。 $err = $query->errorInfo();,对于重复条目,您将得到 $err[1] == 1062

关于PHP foreach循环使用PDO将数据插入mysql仅插入第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20877468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com