循环两次 - 将双精度写入MySQL表

时间:2015-10-23 03:09:09

标签: php mysql

简而言之,我的代码似乎循环了两倍(当应该写两行时写入四行)。这应该是一个简单的解决方案,但我没有运气。

这是我的php循环。 。 。必须是一个非常简单但看不见的东西,没有人能够找到这个孩子为什么不工作的原因:

                //query statement before the for loop
                $stmt="INSERT INTO o70vm_invoices_invoices 
                (`id`, `created_by`, `user_id`, `added`, `to_name`, `to_address`, `invoice_num`, `real_invoice_num`, `from_name`, `from_address`, `from_num`, `invoice_date`, `publish`, `notes`, `template_id`, `taxes`, `start_publish`, `end_publish`, `currency_before`, `currency_after`, `status`, `to_email`, `to_company`, `from_phone`, `from_url`, `from_email`, `discount`, `invoice_duedate`, `admin_notes`, `to_city`, `to_state`, `to_country`, `to_vatid`, `to_zipcode`, `rec_year`, `rec_month`, `rec_day`, `rec_nextdate`, `is_recurrent`) VALUES ";

                // loop through number of invoices user selected to create
                for($x = 0; $x < $invoiceCount; $x++) 
                        {

                            // add the user identified days to each invoice
                            $date->modify("+7 days");
                            $invoiceDateNew = $date->format ('Y-m-d 00:00:00');
                            $invoiceDueDateNew = $date->format ('Y-m-d H:m:s');
                            $startPubNew = $date->format ('Y-m-d 00:00:00');

                            // getting the values per row
                            $ValuesAddToQuery[] ="(NULL, '792', '$userID', '$todayDate', '$parentName', 'unknown address', '0000', '0000', '', '', '', '".$invoiceDateNew."', '1', '', '2', '', '".$startPubNew."', '0000-00-00 00:00:00', '$', '', '', '$email', '$childName', '', '', '', '0.00', '".$invoiceDueDateNew."', '', '', '', '', '', '', '0', '0', '0', '0000-00-00', '0')";

                            }

                            $stmt .= implode(',',$ValuesAddToQuery);

                            mysql_query($stmt) or exit(mysql_error());

我将发票数量存储为:

    $invoiceCount  

我已经回显了$ invoiceCount的值,并且值始终与用户输入的值相同。 IE,用户选择2个发票进行创建,在变量中显示2个发票,但在MySQL表中创建4个发票。

更奇怪的是:当我检查受影响的行时:

 mysql_affected_rows()

它返回用户选择的发票/行数(不是我在MySQL表中添加的实际行)。例如,当添加了四行时,它会说“2”行受到影响。

更加狂野。 。 。当我回应MySQL查询时:

   echo $stmt;

我的查询还显示,当用户选择要添加的两行但代码写入4个实际行时,只添加了两行。

Adventurous,我甚至尝试对数组进行切片以查看是否可以更改发送的代码:

                                //implode the values into the statement
                            $stmt .= implode(',',$ValuesAddToQuery);

                            //limit the length of the array
                            array_slice($ValuesAddToQuery,0,2);

                            mysql_query($stmt) or exit(mysql_error());

并且,你猜对了,它完全没有变化。我将array_slice放在implode语句之上。同样,当我只想要2行时,输入的4行没有变化。

我越看这个,我在这段代码中无法分辨为什么它会加倍。

任何帮助,非常感谢。

有关我的一些输入字段的详细说明以及我正在做的事情,请按照以下说明进行操作:

首先,我让用户选择要复制的行数并根据需要更新发票日期。我使用这些输入字段获得经常性发票的频率(7天,14天或30天)和DURATION(创建/复制的发票数量)的值:

                <select name="freqOfInvoices">
                    <option value="7">Weekly</option>
                    <option value="14">Bi-Weekly</option>
                    <option value="30">Monthly</option>
                </select>

    <input type="number" title="numberOfInvoices" name="numberOfInvoices" size="2" id="numberOfInvoices" value="numberOfInvoices" />

我有三个日期的类似输入字段我想要添加x天数:

        // assigning variables  
        $freqOfInvoices = htmlentities($_POST['freqOfInvoices'], ENT_QUOTES);
        $numberOfInvoices = htmlentities($_POST['numberOfInvoices'], ENT_QUOTES);
        $invoiceDate = htmlentities($_POST['invoice_date'], ENT_QUOTES);
        $invoiceDueDate = htmlentities($_POST['invoice_duedate'], ENT_QUOTES);
        $startPub = htmlentities($_POST['start_publish'], ENT_QUOTES);


        //assigning number of invoices
        $countInvoices=$numberOfInvoices;

3 个答案:

答案 0 :(得分:1)

看起来你可能只需要一个循环来构造值。

//query statement before the foreach loop
$stmt="INSERT INTO o70vm_invoices_invoices (`id`, `.....`, etc) VALUES ";

$ValuesAddToQuery = [];

for($x = 0; $x < $arrayLength; $x++) {
    // add the user identified days to the date
    $date->modify("+7 days");
    $invoiceDateNew = $date->format ('Y-m-d 00:00:00');

    $ValuesAddToQuery[]="(NULL, '....', ".$invoiceDateNew.")";
}

$stmt .= implode(',',$ValuesAddToQuery);

mysql_query($stmt) or exit(mysql_error());

答案 1 :(得分:0)

如果你回显$ stmt,查询字符串看起来是正确的还是你的值加倍?

答案 2 :(得分:0)

我回答了自己的问题,因为我找到了一个解决方法,实际上&#34;作品。我将这个问题保存在网上给其他人,好像我可以保存他们四天的工作,这是我的荣幸。

因为我无法弄清楚为什么我的代码创建了两倍于用户请求的发票,我只是添加了这段代码:

                            //////////////////////////
                            // Work around CODE as it keeps on doubling the records in DB
                            // Deleting the same amount of last entries as there are valid entries
                            //////////////////////////

                            $RecordsToDelete=$invoiceCount;
                            $DeleteQuery="DELETE FROM o70vm_invoices_invoices ORDER BY id DESC limit $RecordsToDelete";

                            mysql_query($DeleteQuery) or exit(mysql_error());

在我原始的内爆/执行查询代码之后立即执行:

                            $stmt .= implode(',',$ValuesAddToQuery);

                            mysql_query($stmt) or exit(mysql_error());

代码有效,因为我感染了#34;代码正在编写完整系列的发票(用户选择的日期)一次,然后再次执行相同的系列。因此,转换为第一组发票(2)是正确的,最后的发票(2)是重复的。所以,presto,只需从最后一个条目中删除发票的计数。

我承认,这是一种解决方法。希望有一天我会弄清楚为什么我的原始代码会产生重​​复。但是,快乐的一天不管。 :)