2015-10-23 3 views
5

В двух словах мой код, кажется, зацикливается в два раза больше, чем он должен (записывая четыре строки, когда должен писать две строки). Это должно быть легким решением, но мне не повезло.цикл в два раза больше - запись удваивается в таблицу 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 счета-фактуры в переменной, но создает 4 счета-фактуры в таблице MySQL.

Незнакомец больше: Когда я проверить для строк, пораженных:

mysql_affected_rows() 

Она возвращает выбранное пользователем число счетов-фактур/строки (не фактические строки можно видеть добавлены в MySQL таблицу). Например, он скажет, что строки «2» были затронуты при добавлении четырех строк.

Еще более дикий. , , когда я эхо из запроса MySQL:

echo $stmt; 

мой запрос также показывает только две строки, которые были добавлены, когда пользователь выбрал две строки, чтобы добавить, но код написал 4 фактические строки.

Приключений, я даже пытался порезать массив, чтобы увидеть, если я мог бы изменить код, отправляемый:

       //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. Опять же, никаких изменений в 4 строках, введенных, когда мне нужно только 2 строки.

Чем больше я смотрю на это, я не могу сказать в этом коде, почему он удваивается.

Любая помощь, очень ценится.

Для подробного объяснения некоторых из моих полей ввода и то, что я делаю, следуйте ниже:

Для начала, я позволяя пользователю выбрать, сколько строк, чтобы скопировать и обновить дату счета-фактуры в соответствии с требованиями. Я получаю значения ЧАСТОТЫ (7 дней, 14 дней или 30 дней) периодически повторяющихся счетов и продолжительность (количество счетов-фактур для создания/копирования) с помощью этих полей ввода:

   <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" /> 

У меня есть подобные поля ввода на три даты я ищу ADD 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; 
+1

Это [инъекция SQL-инъекций] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1), ожидающая своего появления. См. Также http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php – miken32

+0

Спасибо. В настоящее время я единственный пользователь, который может получить доступ к этой странице. Это помогает в обучении. – kentrenholm

+1

Будь конкретным в своих «т. Д.» В примерах кода. Если у вас есть только два столбца, которые вы обновляете, точно показывайте, как выглядит ваш код. Можете ли вы дать точную дамп '$ invoiceDateArray' ?. –

ответ

0

Я отвечаю на свой вопрос, поскольку я понял, что обходной путь «на самом деле» работает.Я держу этот вопрос онлайн для других, как будто я могу спасти их четыре дня работы, это мое удовольствие.

Потому что я не мог понять, почему мой код создавал в два раза больше счетов, как запрошенный пользователь, я просто добавил этот код:

      ////////////////////////// 
          // 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()); 

сразу после того, как мой оригинальный Implode/выполнить код запроса:

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

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

Код работает, потому что мой «зараженный» код записывал полную серию счетов-фактур (с выбранными вами датами) один раз, а затем повторил ту же серию. Итак, это переводится в первый набор счетов-фактур (2), чтобы быть правильными, а последние счета-фактуры (2) должны быть дублирующими. Итак, presto, просто удалите из последних записей счет ваших счетов-фактур.

Я признаю, что это обходной путь. Надеюсь, когда-нибудь я выясню, почему мой исходный код создал дубликаты. Но, счастливый день. :)

+0

Вы не решили свою ошибку и просто очистили созданный ею беспорядок. Если кто-то однажды будет работать над вашим кодом, это будет кошмар, объясняющий, почему вы это сделали. ИМО исправляет ошибку, а не ее повреждение. –

1

Кажется, что для построения значений вам может понадобиться только 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()); 
+0

Спасибо. Ваш код вводит 2 счета-фактуры, когда я их запрашиваю. То же, что и мой собственный код. Должно быть, что-то такое маленькое. – kentrenholm

+1

Он войдет в число строк $ $ массивLength. Если вы просто хотите ввести 1 строку, для чего нужен цикл for '$ arrayLength'? Было бы полезно, если бы вы могли указать точные входные данные и точный результат, который вы ожидаете. – JRD

+0

Спасибо JRD. Я редактировал свой оригинальный вопрос, чтобы включить более подробную информацию. Еще раз спасибо. Я желаю, чтобы количество строк создавалось при выборе пользователя. Очень признателен. – kentrenholm

0

Если вы эхо $ stmt, строка запроса выглядит правильно или ваши значения удваиваются?

+0

мое эхо моего запроса показывает 2 строки, если я выбираю 2 строки. Странно, я знаю. – kentrenholm

+0

Кристофер говорил, что он не соответствует вашему запросу. Таким образом, вы можете проверить правильность синтаксиса запроса. Кроме того, вам не нужно сохранять каждое значение в массиве $ ValueAddToQuery для объединения результата implode. Вы можете напрямую конкатенировать каждое значение в $ stmt в каждом цикле. –

Смежные вопросы