Difficoltà nello script php di scrittura record sql
-
@jabba
Ciao,
francamente non ho capito esattamente cosa intendi ma cmq ho ricontrollato tutto il codice e ho pensato di postarlo , in caso riuscissi a dargli un'occhiata....<!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>scrittura_bolletta</title> <link rel="stylesheet" href="css/form.css"> </head> <body> <?php try{ $conn = new mysqli("localhost","matteo","spranga","bollette_via_miserocchi"); }catch(Exception $e){ $error = $e -> getMessage(); echo "<div class='errore-db'><p class='connect-error'>$error</p></div>"; } $utenza = $_POST["utenza"]; $data_emissione = $_POST["data_emissione"]; $consumo_fatturato_mc = $_POST["cons_fat_mc"]; $consumo_fatturato_kwh = $_POST["cons_fat_kwh"]; $prezzo_unitario = $_POST["prezzo_€"]; $spesa_materiale = $_POST["sps_mat_€"]; $altri_oneri = $_POST["altri_oneri_€"]; $conguagli = $_POST["conguagli_€"]; $importo_fattura = $_POST["imp_fat_€"]; var_dump($_POST); if($utenza==='hera_acqua'){ $insert_sql = "INSERT INTO hera_acqua ( data_emissione, consumo_fat_mc, prezzo_€, sps_materiale_€, altri_oneri_€, conguagli_€, imp_fat_€) VALUES( '$data_emissione', '$consumo_fatturato_mc', '$prezzo_unitario', '$spesa_materiale', '$altri_oneri', '$conguagli', '$importo_fattura');"; }elseif($utenza==='hera_gas'){ $insert_sql = "INSERT INTO hera_gas ( data_emissione, consumo_fat_mc, prezzo_€, sps_materiale_€, altri_oneri_€, conguagli_€, imp_fat_€) VALUES( '$data_emissione', '$consumo_fatturato_mc', '$prezzo_unitario', '$spesa_materiale', '$altri_oneri', '$conguagli', '$importo_fattura');"; } elseif($utenza==='hera_luce'){ $insert_sql = "INSERT INTO $utenza ( data_emissione, consumo_fat_kwh, prezzo_€, sps_materiale_€, altri_oneri_€, conguagli_€, imp_fat_€) VALUES( '$data_emissione', '$consumo_fatturato_mc', '$prezzo_unitario', '$spesa_materiale', '$altri_oneri', '$conguagli', '$importo_fattura');"; } $risultato = $conn->query($insert_sql); if ($risultato == TRUE) { echo "inserimento bolletta riuscito"; } else { echo "inserimento boletta fallito: $insert_sql"; } $conn->close(); ?> <br> <div class='return'> <a href="http://localhost/utenze/insert_bollette.php">torna alla maschera di inserimento </a> </div> </body> </html>
Non ti posto il codice del form perchè quello funziona visto che il var dump mi rende i valori inviati per cui il problema è nello script postato, che in base al valore di $POST["utenza"]; con una condizione if dovrebbe eseguire la stessa query a tre diverse tabelle dello stesso db .
Tra l'altro ho notato che anche il div html che dopo la chiusura della connessione al db e dopo l'uscita dal blocco php (?>), mi da il link per tornare al form per un nuovo inserimento, sparisce e appare solo se commento tutto il blocco in cui si esegue effettivamente la query$risultato = $conn->query($insert_sql);
if..... per intenderci.perchè sparisce un div che è fuori dal blocco php? che sia corretto o meno lo script php quel div col link dovrebbe apparire ugualmente....
va beh.... ora son cotto... se riesci a darci un'occhiata e ad individuare l'errore te ne son grato.... io in base a quanto ne possa capire non lo vedo .
Grazie cmq
Filippo -
<!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>scrittura_bolletta</title> <link rel="stylesheet" href="css/form.css"> </head> <body> <?php try{ $conn = new mysqli("localhost","matteo","spranga","bollette_via_miserocchi"); }catch(Exception $e){ $error = $e -> getMessage(); echo "<div class='errore-db'><p class='connect-error'>$error</p></div>"; } $utenza = $_POST["utenza"]; $data_emissione = $_POST["data_emissione"]; $consumo_fatturato_mc = $_POST["cons_fat_mc"]; $consumo_fatturato_kwh = $_POST["cons_fat_kwh"]; $prezzo_unitario = $_POST["prezzo_€"]; $spesa_materiale = $_POST["sps_mat_€"]; $altri_oneri = $_POST["altri_oneri_€"]; $conguagli = $_POST["conguagli_€"]; $importo_fattura = $_POST["imp_fat_€"]; var_dump($_POST); if($utenza==='hera_acqua'){ $insert_sql = "INSERT INTO hera_acqua ( data_emissione, consumo_fat_mc, prezzo_€, sps_materiale_€, altri_oneri_€, conguagli_€, imp_fat_€) VALUES( '$data_emissione', '$consumo_fatturato_mc', '$prezzo_unitario', '$spesa_materiale', '$altri_oneri', '$conguagli', '$importo_fattura');"; }elseif($utenza==='hera_gas'){ $insert_sql = "INSERT INTO hera_gas ( data_emissione, consumo_fat_mc, prezzo_€, sps_materiale_€, altri_oneri_€, conguagli_€, imp_fat_€) VALUES( '$data_emissione', '$consumo_fatturato_mc', '$prezzo_unitario', '$spesa_materiale', '$altri_oneri', '$conguagli', '$importo_fattura');"; } elseif($utenza==='hera_luce'){ $insert_sql = "INSERT INTO $utenza ( data_emissione, consumo_fat_kwh, prezzo_€, sps_materiale_€, altri_oneri_€, conguagli_€, imp_fat_€) VALUES( '$data_emissione', '$consumo_fatturato_kwh', <!-- Corretto: ora usa kwh invece di mc --> '$prezzo_unitario', '$spesa_materiale', '$altri_oneri', '$conguagli', '$importo_fattura');"; } try { $risultato = $conn->query($insert_sql); if ($risultato === TRUE) { echo "inserimento bolletta riuscito"; } else { echo "inserimento bolletta fallito: " . $conn->error; } } catch (Exception $e) { echo "Errore durante l'esecuzione della query: " . $e->getMessage(); } $conn->close(); ?> <br> <div class='return'> <a href="http://localhost/utenze/insert_bollette.php">torna alla maschera di inserimento </a> </div> </body> </html>
-
non so se e' attinente all' argomento e se robjrobj ha gia' risolto il probl
ma li' manca il default dell' if, mi spiego: hai unif acqua { .... } else if gas { .... } else if luce { .... }
cosi' nella remotissima possibilita' che utenza non sia nessuno dei 3 il record non viene caricato
invece per sicurezza metterei:if acqua { .... } else if gas { .... } else { .... }
oppure, ancor meglio:
if acqua { .... } else if gas { .... } else if luce { .... } else { errore }
ciao
-
Ciao.
Grazie per il suggerimento, ovviamente lo seguirò. Ma prima devo capire perché diavolo lo script non funziona. Cioè la query non viene eseguita. Eppure ho uno script identico funzionante dove cambiano solo i dati ovviamente le tabelle db che devo essere popolate.
Appena posso, anche se Jabba mi ha già risposto che nn dovrebbe dipendere da questo, modifico gli attributi delle colonne delle tabella sql che ora sono impostate a decimal(5,2) a numerici(5,2), sicuramente avrà ragione Jabba ma .. non avendo null'altro da controllare ed essendo che l'altro script funziona, a sto punto può essere solo (spero ben) un problema di tipo di dato che lo script cerca di inserire ma che non vengono accettati dal server sql. (Mariadb).
Grazie e buona giornata.
Filippo -
Ciao, ho dato un'occhiata al codice. Qualche considerazione:
il messaggio di errore per l'inesrimento fallito è sbagliato, prova così:
echo "inserimento bolletta fallito: " . $conn->error . "<br>Query: $insert_sql";
Quando inserisci i valori cerca di pulirli prima, non si sa mai cosa ci può essere dentro. Di solito uso un real_escape per tirare fuori una cosa del genere:
$data_emissione = $conn->real_escape_string($_POST["data_emissione"]);
Poi ho un altro mega dubbio sul nome delle colonne: sicuro possano finire con €? Personalmente evito sempre di mettere caratteri speciali nel nome delle tabelle e delle colonne.
In generale ti consiglio vivamente di usare i backtick per i nomi delle colonne, così non hai problemi di formattazione del testo:INSERT INTO tabella (`prezzo_€`, `imp_fat_€`, ...)
Per ora non mi viene in mente altro...
-
@jabba ha detto in Difficoltà nello script php di scrittura record sql:
p.s: abilita tutti i tipi di debug possibili lato php, tipo:
il codice per il debug di cui ti parlavo qui puoi metterlo all'inizio del file, dentro un blocco PHP:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // tutto il resto del PHP della pagina
-
@jabba
Grazie per la tua consueta disponibilità....
Real escape è una funzione che nn conoscevo in ogni caso provo a modificare tutto secondo i suggerimenti avuti.
Sul fatto del carattere € francamente non lo ritenevo un problema visto che eseguendo delle query INSERT into direttamente nella console mysql non ottengo nessuno errore e il record viene popolato... ma possono cmq dare fastidio a php.... può essere benissimo.... d'altronde l'altro script funzionante non ne contiene di caratteri speciali per cui può essere un problema che fin ora non si era posto.
Interessante la correzione sul messaggio di errore. Infatti mi chiedevo perché anche nello script su cui mi son basato, simulando un errore a livello di query, ottenevo una pagina bianca senza alcun messaggio di errore.
Spero di poter presto applicare le correzioni suggerite e di poter darVi un riscontro.
Grazie infinite.
Filippo. -
Buona sera.
Ho risolto con il debug che mi hai suggerito. Avevo anche sbagliato una delle tre query per un nome campo che era abbreviato diversamente.
L'unica cosa che nn torna errore secondo l'echo impostato è appunto l'errore di esecuzione della query.
Simulando un errore infatti mi da Fatal error etc.... e mi dice che ovviamente non trova il campo col nome sbagliato ma nn mi ritorna la echo "inserimento fallito"
cmq ora le query insert into funzionano.
GraZie mille di nuovo
Filippo -
Quindi non ti ha dato problemi il simbolo € nelle colonne? Buono a sapersi, grazie per il feedback!
-
A dire il vero guarda . Ho messo i backtick per sicurezza quindi provo a toglierli poi ti dico.
Considera che io ho il server apache e Maria db su so Debian 12 che magari essendo conservatrice magari ha versioni differenti cioè meno aggiornate.
Cmq appena riesco a faccio la prova ma ho idea che avendo scazzato il nome di un campo nella query sql ....
A Presto
FILIPPO -
@jabba
Ciao,
ti confermo che anche togliendo i backtick l'esecuzione della query avviene senza problemi.vorrei capire perchè nn mi viene fuori l'errore di esecuzione della query.... che tipo di errore posso simulare?
quelli che ho ottenuto sabotando un nome di campo per esempio dipendono dall'abilitazione delle funzioni di debug che ora che bene o male ho risolto posso commentare per disattivarle.va beh più tardi faccio delle altre prove.
Buona serata e grazie ancora
Filippo.