[PHP] Differenza reale tra bindParam e bindValue

VAik

Utente Attivo
16 Apr 2016
117
3
18
Ciao a tutti ragazzi
vi vorrei chiedere quale è la reale ed effettiva differenza che intercorre tra bindValue() e bindParam().
Sul manuale e dalla teoria si dice che bindValue() sostituisce il segnaposto per valore ,mentre bindParam() fa la stessa cosa, ma per riferimento.

Nel caso di bindValue(), se abbiamo una variabile che nella riga prima della chiamata del metodo viene modificata a livello di valore verrà usato quest'ultimo valore; mentre nel caso di bindParam() con passaggio per riferimento, viene sfruttata la prima inizializzazione fatta della variabile

Per me non è vero o cmq non riesco ad apprezzare la cosa:

PHP:
$autore = 'Manzoni';    //QUESTA RIGA
$sql = "SELECT titolo,autore FROM libro WHERE autore = :autore";
 $stmt = $dbh -> prepare($sql);
 $autore = 'Salgari';      //QUESTA RIGA
 $stmt -> bindParam(':autore', $autore);
$stmt -> execute();
while ($riga = $stmt->fetch()) {
    echo "Titolo Libro: " . $riga['titolo'];
    echo " Autore Libro: " . $riga['autore'];
}
I dati di QUESTA RIGA devono essere variabili recuperate da modulo web

se cambio la posizione di QUESTA RIGA avvicinandole oppure separandole come ho mostrato, io vedo cmq sempre Salgari ed il suo libro e non Manzoni, anche se usassi bindValue().

E' normale?

quale è il caso reale affinchè si usa l'uno o l'altro metodo?
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
PHP:
$sql = "SELECT titolo,autore FROM libro WHERE autore = :autore";
$stmt = $dbh -> prepare($sql);

$autore = 'Manzoni';
$stmt -> bindValue(':autore', $autore);
$autore = 'Salgari';
$stmt -> execute();

while ($riga = $stmt->fetch()) echo "Titolo Libro: " . $riga['titolo']."<br />"." Autore Libro: " . $riga['autore']."<br />";

$autore = 'Manzoni';
$stmt -> bindParam(':autore', $autore);
$autore = 'Salgari';
$stmt -> execute();

while ($riga = $stmt->fetch()) echo "Titolo Libro: " . $riga['titolo']."<br />"." Autore Libro: " . $riga['autore']."<br />";
nel primo caso il valore viene assegnato con "bindValue", verrà quindi cercato "Manzoni"

nel secondo caso viene preso il valore che la variabile ha prima dell'execute, verrà quindi cercato "Salgari"
il secondo caso si usa quando si devono gestire più "execute" della stessa query, evitando il "bindValue"

provare per credere
PHP:
$sql = "SELECT titolo,autore FROM libro WHERE autore = :autore";
$stmt = $dbh -> prepare($sql);
$autore = '';
$stmt -> bindParam(':autore', $autore);

$autore = 'Manzoni';
$stmt -> execute();
while ($riga = $stmt->fetch()) echo "Titolo Libro: " . $riga['titolo']."<br />"." Autore Libro: " . $riga['autore']."<br />";

$autore = 'Salgari';
$stmt -> execute();
while ($riga = $stmt->fetch()) echo "Titolo Libro: " . $riga['titolo']."<br />"." Autore Libro: " . $riga['autore']."<br />";
ps, scrivere il codice nella giusta sequenza (logica), aiuta molto
 
Ultima modifica:
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
Grazie della risposta esauriente e chiara.
Ti posso chiedere nella realtà, in un sito, a cosa può servire un espediente del genere del tuo secondo codice?
perchè si dovrebbe eseguire più execute() della stessa query?

Per esempio quello utilizzato, una volta che ho saputo quale è il titolo del libro memorizzato nel db, sulla base dell ' autore digitato, finisce lì. Per sapere un altro titolo di libro, devo cmq far ripartire l'applicazione.

Poi altra cosa: se i valori dell'autore Salgari o Manzoni sono presi da modulo web in questo modo

PHP:
$sql = "SELECT titolo,autore FROM book WHERE autore = :autore";
$stmt = $dbh -> prepare($sql);
$autore = $_POST['campo_web'];
$stmt -> bindValue(':autore', $autore);
$stmt -> execute();
possiamo considerare evitato il problema del SQL Injection proprio per via dell'uso del segnaposto e quindi del fatto che il valore prelevato dal modulo web non è direttamente immesso nella query, giusto?
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
Per esempio quello utilizzato, una volta che ho saputo quale è il titolo del libro memorizzato nel db, sulla base dell ' autore digitato, finisce lì. Per sapere un altro titolo di libro, devo cmq far ripartire l'applicazione.
supponi che un negozio abbia ricevuto una fattura a fronte di un documento di consegna,
la fattura viene registrata, idealmente, come documento (dati identificativi e commerciali della fattura) e quindi il corpo con tutti gli "articoli", in questo caso la query che registra gli articoli viene eseguita più volte, forse vale l'uso di "bindParam"

possiamo considerare evitato il problema del SQL Injection proprio per via dell'uso del segnaposto
NO, in un post precedente, ti ho inviato il link di un sito, riguarda PDO e molte delle sue sfaccettature, è in inglese, se la lingua ti disturba, con un po' di pazienza e con "Google translator" puoi ottenere il testo italiano
non rinunciare alle "buone" letture
 

VAik

Utente Attivo
16 Apr 2016
117
3
18
la fattura viene registrata, idealmente, come documento (dati identificativi e commerciali della fattura) e quindi il corpo con tutti gli "articoli", in questo caso la query che registra gli articoli viene eseguita più volte, forse vale l'uso di "bindParam"
scusami ma come è pensata una cosa del genere?
cioè se devo memorizzare una fattura , avrà un nome, un codice, una data.
gli articoli che la compongono come li si va a salvare di volta in volta? non mi riferisco al codice preciso, ma per grandi linee:
se per memorizzare la fattura con i dati principali, si può fare un semplice form che invia dei dati ad un query di insert, la memorizzazione dei singoli articoli come viene gestita considerando la query precedente?

non rinuncio alle letture, solo che sto seguendo un corso e delle pagine web fatte da persone esterne a quelle di manuali: questi ultimi per me sono un po' troppo nelle nuvole....cmq se mi dici che ha un bel contenuto quel link che mi hai postato, ci darò uno sguardo.
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
a grandi linee e un po' superficialmente, la fattura contiene,
- i dati identificativi del documento "la testata"
- i dati relativi al materiale e/o prestazioni fatturate
- eventuali storni per anticipi di fatturazione (enel e società simili insegnano)
- i dati relativi al pagamento, giusto per citare, 30-60-90 gg fm data fattura
- l'iva che spesso non si limita al 22 %, ma "la casi(nistica)" è rilevante, con circa 50 tipologie di assogettamento
per gli acquisti e altrettanto per le vendite (cito l'esempio di un acquisto dalla comunità europea, dove l'iva è registrata sia in acquisto che in vendita)
- poi ci sono gli agganci alla bolla di consegna per mantenere la storia commerciale - contabile della transazione
- poi ci possono essere le statistiche di acquisto - vendita

mi fermo, ma non per mancanza di altri argomenti,
pensa quante scritture o update con la stessa query (ma dati diversi) sono dovute per le "sezioni" della fattura"
risparmiare qualche briciola di tempo evitando "bindValue" inutili, su una "montagna" di fatture (vedi enel) alla fine procura vantaggio, la somma dei vantaggi spesso è un valore sensibile

ho estremizzato citando enel per rendere l'idea
 
  • Like
Reactions: VAik

VAik

Utente Attivo
16 Apr 2016
117
3
18
se per memorizzare la fattura con i dati principali, si può fare un semplice form che invia dei dati ad un query di insert, la memorizzazione dei singoli articoli come viene gestita considerando la query precedente?
ma quindi fermo restando tutte le cose che hai detto il codice come si realizza SEMPRE PER GRANDI LINEE.


Da quello che hai scritto, quindi si possono andare a modificare dei dati come l'iva, un codice errato o cose così.
Ma quindi come si procede?
In poche parole non riesco a capire come si può sfruttare praticamente un codice simile al tuo secondo codice del tuo secondo messaggio?
 

marino51

Utente Attivo
28 Feb 2013
2.904
160
63
Lombardia
In poche parole non riesco a capire come si può sfruttare praticamente un codice simile al tuo secondo codice del tuo secondo messaggio?
lo si usa per inserire/aggiornare dati omogenei, quando l'operazione sia su una sequenza di valori
ricorda che esiste la possibilità, prima o poi ti capiterà di utilizzarla
 

VAik

Utente Attivo
16 Apr 2016
117
3
18
ma quindi un form che permette all'utente di immettere tanti dati?
questo form poi a che programma è collegato?
cosa si riempie?
una query di INSERT con tutti i valori che abbiamo immesso nel form?