【问题标题】:Insert Multiple rows from loop query从循环查询中插入多行
【发布时间】:2019-09-11 17:42:42
【问题描述】:

我正在尝试从表中获取客户列表,然后每天将数据附加到他们身上。我不知道如何在数据库中插入多行同名

我有 3 个表格:公司、工作、报告。我正在执行 2 个循环,以将表格中的公司和工作数据转换为每天添加到 repots 表中的表格。我试过把它作为一个数组来做,并在一个while循环、foreach循环中做,但每次都没有奏效。我在某个地方出错了,我只是不知道在哪里

 $companyquery = "SELECT * FROM companiestest WHERE (enabled != 'true') ORDER BY name";
    $companies = $mysqli->query($companyquery);
    while($company = $companies->fetch_assoc()) {
        $cid = htmlspecialchars($company['id']);
        $companyname = htmlspecialchars($company['name']);
        echo "<tr>";
        $jobquery = "SELECT * FROM jobstest WHERE (cid = " . $company['id'] . ") AND (enabled != 'true') ORDER BY jobname";
        $jobs = $mysqli->query($jobquery);
            while($job = $jobs->fetch_assoc()) {                
                $bid = htmlspecialchars($job['id']);
                $product = htmlspecialchars($job['product']);
                $server = htmlspecialchars($job['server']);
                $medium = htmlspecialchars($job['medium']);
                $jobname = htmlspecialchars($job['jobname']);
                echo "<input type='hidden' name='backupid' value='$bid''>";
                echo "<input type='hidden' name='companyname' value='$companyname''>";
                echo "<input type='hidden' name='companyid' value='$cid'>";
                echo "<td>$companyname - $cid</td>";
                echo "<td>$product</td>";
                echo "<td>$server</td>";
                echo "<td>$medium</td>";
                echo "<td>$jobname</td>";
                echo "<td><select name='result' required>
                    <option disabled selected value>Result</option>
                    <option value='success'>Successful</option>
                    <option value='warn'>Warning</option>
                    <option value='fail'>Fail</option>
                </select></td>";
                echo "<td><input type='text' name='ticket' placeholder='Ticket Number'></td>";
                echo "</tr>";
if(isset($_POST['submit'])){
        $companyname = strip_tags(trim($_POST['companyname']));
        $date = strip_tags(trim($_POST['date']));
        $staffmember = strip_tags(trim($_POST['staff']));
        $result = strip_tags(trim($_POST['result']));
        $ticket = strip_tags(trim($_POST['ticket']));
        $companyid = strip_tags(trim($_POST['companyid']));
        $jobid = strip_tags(trim($_POST['jobid']));

        $array = array();
        array_push($array, $companyname, $date, $staffmember, $result, $ticket, $companyid, $jobid);

        //$array = "('$companyname', '$date', '$staffmember', '$result', '$ticket', '$companyid')";

        print_r($array);

        $query = "INSERT INTO reporttest (company, date, staff, result, ticketnum, cid, bid) VALUES ($companyname, $date, $staffmember, $result, $ticket, $companyid, $jobid)";
        //echo "$query";
}

【问题讨论】:

  • 字符串值插入数据库时​​必须加引号,或者使用prepared statementsbind_param这将解决可能出现的任何令人讨厌的引用问题。
  • 您确定enabled 应该是字符串'true',而不是真/假值吗?
  • 这是非常早期的开发,所以在进行准备和绑定之前,我需要先获得正确的语法。我忘记了报价,所以将添加谢谢 Enabled 是数据库中的二进制值,因此当客户离开公司时,我们在数据库中将其标记为 false,从而将其从页面上的列表中删除
  • 我建议现在使用准备好的语句和绑定,因为它可以消除一大堆引用问题,比如这个。如果 enabled 是布尔值,则需要传递 1/0 而不是字符串。

标签: php loops mysqli


【解决方案1】:

答案是一个带有键增量的 foreach 循环,它将每个变量插入到它自己的数组中。然后将数组上的foreach绑定并执行到数据库中。仍然需要对查询中的数据和限制列进行大量修改,但到目前为止它似乎没有问题。

毫无疑问,有更好的方法可以做到这一点,但目前还没有人提出任何建议

    $companyquery = "SELECT * FROM companiestest WHERE (enabled != 'true') ORDER BY name";
    $companies = $mysqli->query($companyquery);
    while($company = $companies->fetch_assoc()) {
        $cid = htmlspecialchars($company['id']);
        $companyname = htmlspecialchars($company['name']);
        echo "<tr>";
        $backupjobquery = "SELECT * FROM backupjobstest WHERE (cid = " . $company['id'] . ") AND (enabled != 'true') ORDER BY jobname";
        $backupjobs = $mysqli->query($backupjobquery);
            foreach($backupjobs as $key => $backupjob){
                $key++;

                $bid = htmlspecialchars($backupjob['id']);
                $product = htmlspecialchars($backupjob['product']);
                $server = htmlspecialchars($backupjob['server']);
                $medium = htmlspecialchars($backupjob['medium']);
                $jobname = htmlspecialchars($backupjob['jobname']);
                echo "<input type='hidden' name='backupid[]' value='$bid'>";
                echo "<input type='hidden' name='companyid[]' value='$cid'>";
                echo "<td>$companyname - $cid</td>";
                echo "<td>$product</td>";
                echo "<td>$server</td>";
                echo "<td>$medium</td>";
                echo "<td>$jobname</td>";
                echo "<td><select name='result[]' required>
                    <option disabled selected value>Result</option>
                    <option value='Successful'>Successful</option>
                    <option value='Warning'>Warning</option>
                    <option value='Failure'>Failure</option>
                </select></td>";
                echo "<td><input type='number' name='ticketnum[]' placeholder='Ticket Number'></td>";
                echo "</tr>";

        }
    }

    if(isset($_POST['submit'])){
        $results = array();
        $ticketnums = array();
        $cids = array();
        $bids = array();
        $date = strip_tags(trim($_POST['date']));
        $staffmember = strip_tags(trim($_POST['staff']));

        foreach ($_POST['result'] as $key => $result) {
            array_push($results, $result);
        }
        foreach ($_POST['ticketnum'] as $key => $ticketnum) {
            array_push($ticketnums, $ticketnum);
        }
        foreach ($_POST['companyid'] as $key => $cid) {
            array_push($cids, $cid);
        }
        foreach ($_POST['backupid'] as $key => $bid) {
            array_push($bids, $bid);
        }

        $sql = "INSERT INTO reporttest (date, staff, result, ticketnum, cid, bid) VALUES (?, ?, ?, ?, ?, ?)";
        $stmt = $mysqli->prepare($sql);
        if ( !$stmt ) { die('prepare failed'); }
        $stmt->bind_param("sssiii", $date, $staffmember, $result, $ticketnum, $cid, $bid);
        foreach ($bids as $key => &$bid) {
            $result = $results[$key];
            $ticketnum = $ticketnums[$key];
            $cid = $cids[$key];
            $bid = $bids[$key];
            if ($stmt->execute()) { 
                echo "Successfully updated the report";
            } else {
                echo "Error updating";
            }
            $stmt->fetch();
            printf("Date: %s, Staff: %s, result: %s, Ticket: %s, cid: %s, bid: %s", $date, $staffmember, $result, $ticketnum, $cid, $bid);
            echo "<br>";
        }
        $stmt->close();
    }

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2012-09-26
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多