2015-10-23 13 views
5

In poche parole, il mio codice sembra essere in loop il doppio di quanto dovrebbe (scrivendo quattro righe quando dovrebbe scrivere due righe). Questa dovrebbe essere una soluzione facile ma non sto avendo fortuna.il doppio del ciclo - la scrittura raddoppia al tavolo MySQL

Ecco il mio loop php. . . Deve essere una cosa molto semplice ma invisibile che nessuno è stato ancora in grado di individuare il motivo per cui questo bambino non sta funzionando:

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

ho memorizzare il numero di fatture come:

$invoiceCount 

ho fatto eco fuori il valore di $ invoiceCount e il valore è sempre lo stesso valore degli input dell'utente. IE, l'utente seleziona 2 fatture da creare, visualizza 2 fatture nella variabile, ma crea 4 fatture nella tabella MySQL.

Stranger di più: Quando controllo per le righe interessate con:

mysql_affected_rows() 

restituisce il numero selezionato dall'utente delle fatture/righe (non i file effettivi posso vedere sono aggiunti nella tabella di MySQL). Ad esempio, dirà che "2" sono state interessate quando sono state aggiunte quattro righe.

Ancora più selvaggio. . . quando mi associo la query MySQL:

echo $stmt; 

mia domanda mostra inoltre sono stati aggiunti solo due righe quando l'utente ha selezionato due file da aggiungere ma il codice scritto 4 righe effettive.

Avventuroso, ho anche provato a tagliare la matrice per vedere se riuscivo a modificare il codice che viene inviato:

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

E, avete indovinato, cambia assolutamente nulla. Metto l'array_slice sopra l'istruzione implode. Di nuovo, nessuna modifica nelle 4 righe immesse quando voglio solo 2 righe.

Più guardo a questo, non posso dire in questo codice perché sta raddoppiando.

Qualsiasi aiuto, molto apprezzato.

Per una spiegazione dettagliata di alcuni dei miei campi di input e quello che sto facendo, seguire qui sotto:

Per iniziare, sto lasciando all'utente di selezionare il numero di righe per copiare e aggiornare la data della fattura, come richiesto. Io sono sempre i valori di frequenza (7 giorni, 14 giorni o 30 giorni) di fatture ricorrenti e la durata (numero di fatture per creare/copia) utilizzando questi campi di input:

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

ho campi di input simili per le tre date che sto cercando di AGGIUNGERE x numero di giorni a:

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

Questo è [un attacco SQL injection] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1) in attesa di accadere. Vedi anche http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php – miken32

+0

Grazie. Attualmente sono l'unico utente che può accedere a questa pagina. Questo aiuta con il mio apprendimento. – kentrenholm

+1

Sii specifico sulle tue cose 'etc' nei tuoi esempi di codice. Se hai solo due colonne che stai aggiornando, mostra esattamente come si presenta il tuo codice. Puoi dare un esatto dump di '$ invoiceDateArray' ?. –

risposta

0

Sto rispondendo alla mia domanda mentre ho trovato una soluzione che "effettivamente" funziona.Sto mantenendo questa domanda online per gli altri come se potessi salvarli quattro giorni di lavoro, è un piacere.

Perché io non riuscivo a capire il motivo per cui il mio codice è stato la creazione di un numero doppio di fatture come l'utente richiesto, ho semplicemente aggiunto questo codice:

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

subito dopo il mio implodere originale/eseguire codice query:

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

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

Il codice funziona perché il mio codice "infetto" stava scrivendo l'intera serie di fatture (con le date selezionate dall'utente) una volta e quindi facendo di nuovo la stessa serie. Quindi, quello tradotto nella prima serie di fatture (2) è corretto e le ultime fatture (2) devono essere duplicate. Quindi, presto, basta eliminare dalle ultime voci il conteggio delle fatture.

Ammetto che è una soluzione. Spero che un giorno possa capire perché il mio codice originale abbia prodotto duplicati. Ma, buona giornata a prescindere. :)

+0

Non hai risolto il bug e hai solo pulito il disordine provocato da esso. Se qualcuno riuscisse a lavorare sul tuo codice un giorno, sarebbe un incubo capire perché l'hai fatto. IMO corregge l'errore, non il suo danno. –

1

Sembra che potrebbe essere necessario solo un ciclo per costruire i valori.

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

Grazie. Il tuo codice immette 2 fatture quando ne chiedo una. Lo stesso del mio codice. Deve essere qualcosa di così piccolo. – kentrenholm

+1

Inserirà il numero di righe '$ arrayLength'. Se vuoi solo inserire 1 riga, qual è il ciclo for di $ arrayLength? Sarebbe utile se fosse possibile elencare i dati di input esatti e il risultato esatto che ci si aspetta. – JRD

+0

Grazie JRD. Ho modificato la mia domanda originale per includere maggiori dettagli. Grazie ancora. Sto desiderando il numero di righe da creare sulla selezione dell'utente. Molto apprezzato. – kentrenholm

0

Se echo $ stmt la stringa di query sembra corretta o i valori vengono raddoppiati?

+0

il mio echo della mia query mostra 2 righe se seleziono 2 righe. Strano, lo so. – kentrenholm

+0

Christopher stava dicendo di echeggiare il $ stmt non il risultato della tua richiesta. Quindi puoi vedere se la sintassi della query è corretta. Inoltre non è necessario salvare ogni valore nell'array $ ValueAddToQuery per concatenare il risultato del implode. È possibile concatenare direttamente ciascun valore in $ stmt su ciascun ciclo. –

Problemi correlati