PHP foreach循环将数据插入到mysql中,PDO只插入第一行

时间:2014-01-02 06:23:36

标签: php mysql arrays pdo foreach

我已经阅读过通过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收到任何错误消息之外,这是我期望得到的结果?

2 个答案:

答案 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>";
}