【问题标题】:MySQLi prepared statement & foreach loop [duplicate]MySQLi准备好的语句和foreach循环[重复]
【发布时间】:2014-11-14 09:34:39
【问题描述】:

我正在努力修改以下(可行的)以使用准备好的语句:

echo "<div class=\"debug\">
            <h4>values \$_POSTed from *LINE-ITEMS TABLE* in input.php:</h4>
            <table>";

    foreach ($_POST['date'] as $i => $value) {
        $invNum     = $_POST['invNum'];
        $date           = $_POST['date'][$i];
        $hours      = $_POST['hours'][$i];
        $rate           = $_POST['rate'][$i];
        $dateTotal  = $_POST['dateTotal'][$i];

        echo "<tr>
                    <td>".$i."</td>
                    <td>".$date."</td>
                    <td>".$hours."</td>
                    <td>".$rate."</td>
                    <td>".$dateTotal."</td>
                </tr>";

            $query = "INSERT INTO Invoice_Line_Items SET
                INVOICE_NUMBER  = '$invNum',
                DATE                = '$date',
                HOURS               = '$hours',
                RATE                = '$rate',
                DATE_TOTAL      = '$dateTotal'

                ON DUPLICATE KEY UPDATE
                INVOICE_NUMBER  = VALUES(INVOICE_NUMBER),
                DATE                = VALUES(DATE),
                HOURS               = VALUES(HOURS),
                RATE                = VALUES(RATE),
                DATE_TOTAL      = VALUES(DATE_TOTAL)
                ";

        } // END foreach
echo "</table></div>";

我一直在尝试调整在同一页面上运行的(工作的)准备好的语句/查询,它将单行插入到不同的表中。但是这个第二个查询(到不同的数据库表中)从源表单中的 line-items 表的多个(动态 # of)行中插入数据。

我已经研究了好几个小时,但我无法弄清楚如何使用 line-items 循环来实现准备好的语句。我以为会是这样,但这不是插入。

echo "<div class=\"debug\">
            <h4>values \$_POSTed from *LINE-ITEMS TABLE* in input.php:</h4>
            <table>";

// this is the line-items table in the form; don't I have to get these values before the query?
foreach ($_POST['date'] as $i => $value) {
    $invNum     = $_POST['invNum'];
    $date           = $_POST['date'][$i];
    $hours      = $_POST['hours'][$i];
    $rate           = $_POST['rate'][$i];
    $dateTotal  = $_POST['dateTotal'][$i];
    // confirm vars/values
    echo "<tr><td>".$i."</td><td>".$date."</td><td>".$hours."</td><td>".$rate."</td><td>".$dateTotal."</td></tr>";

    $stmt = $mysqli->stmt_init();
    $query = "INSERT INTO Invoice_Line_Items
        INVOICE_NUMBER  = '$invNum',
        DATE                = '$date',
        HOURS               = '$hours',
        RATE                = '$rate',
        DATE_TOTAL      = '$dateTotal'

        ON DUPLICATE KEY UPDATE
        INVOICE_NUMBER  = VALUES(INVOICE_NUMBER),
        DATE                = VALUES(DATE),
        HOURS               = VALUES(HOURS),
        RATE                = VALUES(RATE),
        DATE_TOTAL      = VALUES(DATE_TOTAL)
        ";

        if ($stmt->prepare($query)) {
            $stmt -> bind_param("ssddd", $invNum, $date, $hours, $rate, $dateTotal);
            $stmt -> execute();
            $stmt->close();
        } // if $stmt
} // END foreach

echo "</table></div>";

有人可以解释一下吗?非常感谢。

svs

【问题讨论】:

  • 你错过了INSERT INTO Invoice_Line_Items中的SET吗?
  • @u_mulder 感谢您提到这一点。事实上,无论是否在查询中,它似乎都没有效果。我自己对此感到疑惑,因为我的原始查询中有“SET”,但是当我将第一个(单行插入)更新为准备好的语句时,它只能在没有“SET”的情况下工作。我不知道为什么。无论如何,似乎存在更大的语法/代码排列问题导致此(第二,多行)插入失败。

标签: php mysqli


【解决方案1】:

你不需要

$stmt = $mysqli->stmt_init();

你应该可以打电话

$stmt = $mysqli->prepare($query);

另一个问题是您将查询设置在inside 循环中。你不应该那样做。将$stmt 移到循环之外,并且只有在设置好变量后才在内部运行execute。最后,你需要添加?以便MySQL知道参数

$query = "INSERT INTO Invoice_Line_Items
    INVOICE_NUMBER  = ?,
    DATE = ?,
    HOURS = ?,
    RATE  = ?,
    DATE_TOTAL = ?

    ON DUPLICATE KEY UPDATE
    INVOICE_NUMBER  = VALUES(INVOICE_NUMBER),
    DATE                = VALUES(DATE),
    HOURS               = VALUES(HOURS),
    RATE                = VALUES(RATE),
    DATE_TOTAL      = VALUES(DATE_TOTAL)
    ";
 $invNum = $date = $hours = $rate = $dateTotal = '';
 $stmt = $mysqli->prepare($query);
 $stmt->bind_param("ssddd", $invNum, $date, $hours, $rate, $dateTotal);

foreach ($_POST['date'] as $i => $value) {
    $invNum     = $_POST['invNum'];
    $date           = $_POST['date'][$i];
    $hours      = $_POST['hours'][$i];
    $rate           = $_POST['rate'][$i];
    $dateTotal  = $_POST['dateTotal'][$i];
    $stmt->execute();
}

【讨论】:

  • 第一次尝试时,我收到“致命错误:在非对象 ... 上调用成员函数 bind_param()”。然后,我将“SET”恢复到查询中并解决了它。我意识到我的其他准备好的语句中的查询格式不同:INSERT INTO Invoices (INVOICE_NUMBER, INVOICE_DATE, PROJECT_NUMBER, CLIENT, PROJECT_DESCRIPTION, TOTAL_HOURS, SUBTOTAL, TAX, INVOICE_TOTAL, DATE_SENT, DATE_RECEIVED, NOTES)VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)。两种语法的任何特定优点/缺点?最佳实践等?无论如何,再次感谢,非常感谢。
  • INSERT 语法可以采用任何一种方式。我知道没有“最佳实践”,我只是确保每次都以相同的方式进行以保持一致性
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多