Query al DB con php (INSERT)

  • Creatore Discussione Creatore Discussione Laskot
  • Data di inizio Data di inizio

Laskot

Nuovo Utente
5 Giu 2017
15
0
1
30
Ciao a tutti, come esercizio devo fare una biblioteca online. Un dipendente si logga e da li può aggiungere libri al DB della biblio.
Allora ho scritto questo codice :

Codice:
$isbn = trim($_POST['isbn']);
$titolo = trim($_POST['dtitolo']);
$casa = trim($_POST['dcasa']);
$lingua = trim($_POST['dlingua']);
$anno= trim($_POST['danno']);
$sezione = trim($_POST['dsezione']);
$scaffale = trim($_POST['dscaffale']);

$query = "INSERT INTO libro (isbn,titolo,casaeditrice,lingua, annopubblicazione,sezione,scaffale) VALUES ($isbn, '$titolo', '$casa', '$lingua', $anno, '$sezione', $scaffale)";
$result = pg_query($query);

(ISBN, anno e scaffale sono valori numerici)
Ma non funziona, non mi crea un nuovo record nella tabella libri.
Allora ho cercato e ho trovato anche questo metodo

Codice:
<?php

$query = pg_query("INSERT INTO autore (codice,nome,cognome,nomearte,datanascita,luogonascita) VALUES('".$_POST["acodice"]."','".$_POST["anome"]."','".$_POST["acognome"]."','".$_POST["anomearte"]."','".$_POST["adatanascita"]."','".$_POST["aluogonascita"]."') ");
    ?>

Innanzitutto, qual è la differenza tra i due modi di scriverlo ? Sono entrambi validi?
Ma comunque non riesco a capire l'errore per il quale non mi salva niente nel DB.

Chiedo aiuto disperatamente!
 
perchè non funziona è sempre difficile da capire, se non viene riportato l'errore
potrebbe essere un banale errore di sintassi, o qialcosa di peggio tipo,
.) aver sbagliato i parametri di connessione al db, quindi non esiste la connessione
.) sbagliare il nome di una colonna
.) inserire caratteri in una colonna definita numerica
....

verifica l'anno, potrebbe essere definito numerico e non volere gli apici

leggendo il manuale,
http://php.net/manual/en/function.pg-query.php

si trova,
If an error occurs, and FALSE is returned, details of the error can be retrieved using the pg_last_error() function if the connection is valid.

continuando, per meglio capire,
http://php.net/manual/en/function.pg-last-error.php

quindi proverei il codice in questa forma,
PHP:
<?php

$_POST['isbn']      = 123456789;
$_POST['dtitolo']   = "titolo";
$_POST['dcasa']     = "casaeditrice";
$_POST['dlingua']   = "lingua";
$_POST['danno']     = "2015";
$_POST['dsezione']  = "sezione";
$_POST['dscaffale'] = 987654321;

$isbn     = trim($_POST['isbn']);
$titolo   = trim($_POST['dtitolo']);
$casa     = trim($_POST['dcasa']);
$lingua   = trim($_POST['dlingua']);
$anno     = trim($_POST['danno']);
$sezione  = trim($_POST['dsezione']);
$scaffale = trim($_POST['dscaffale']);

$query = "INSERT INTO libro (isbn,titolo,casaeditrice,lingua,annopubblicazione,sezione,scaffale) VALUES ("
.$isbn
.",'"
.$titolo
."','"
.$casa
."','"
.$lingua
."','"
.$anno
."','"
.$sezione
."',"
.$scaffale
.")";

echo $query;

$result = pg_query($query);
if ($result === false) { echo pg_last_error(); die; }
?>

perchè NON usare direttamente le variabili $_POST nella query,

SQL injection è una tecnica di code injection, usata per attaccare applicazioni di gestione dati, con la quale vengono inserite delle stringhe di codice SQL malevole all'interno di campi di input in modo che queste ultime vengano poi eseguite (ad esempio per fare inviare il contenuto del database all'attaccante).

i campi di input devono quindi essere validati per ripulirli di ciò che può essere dannoso
hai usato trim per eliminare gli spazi non utili, ma dovresti anche validare i contenuti

qui trovi informazioni,
https://it.wikipedia.org/wiki/SQL_injection


come vedi dal mio esempio, ho preferito elencare i valori nel modo "completo"
credo che spendendo qualche attimo in fase di stesura del codice, migliora la portabilità dello stesso con versioni di php diverse ed addirittura linguaggi diversi
la query scritta in quel modo può essere portata con copia/incolla senza modifiche in un VBscript (per esempio)
nella forma originale non sarebbe accettata

sufficiente ???
 
Ciao marino51, grazie per la bellissima risposta!
Allora ho provato il tuo codice, grazie a echo pg_last_error() ho capito il mio errore ( la INSERT o l'UPDATE sulla tabella "libro" viola il vincolo di chiave esterna "libro_casaeditrice_fkey" DETAIL: La chiave (casaeditrice)=(casa) non è presente nella tabella "casaeditrice". ) più chiaro di così non si può, non ci avevo pensato stupida io.

Riguardo al SQL injection ti ringrazio, risolvo questo problema e vado subito ad approfondire, grazie :)
 

Discussioni simili