我已经阅读过通过foreach& amp;插入内容时可以找到的每个问题/教程。 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个。
e.g。 - 尝试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);
}
}
}
?>
准备/绑定/插入
的功能<?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收到任何错误消息之外,这是我期望得到的结果?
答案 0 :(得分:1)
问题是由于日期的独特性造成的。后续插入的日期与第二个相同,因此它们被忽略(同时自动增量增加)。 所以
alter table finance drop index date
[EDITED]
设置$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
应该导致重复插入使用SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
抛出异常(当我测试它时会这样做)但是在创建PDO对象时默认情况下不设置此属性。
如果有疑问,即使没有例外,您也可以随时回过头来查看错误信息。 $err = $query->errorInfo();
,对于重复的条目,您将获得$err[1] == 1062
答案 1 :(得分:0)
在这一行if (count($paid) != $num_paid) {
中,您没有定义$match
,如果此语句为真,则此行将引发未定义变量$match
if ($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>";
}