Difficoltà nello script php di scrittura record sql
-
<!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.