[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
3.041
192
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
3.041
192
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
3.041
192
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
3.041
192
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?
 
Discussioni simili
Autore Titolo Forum Risposte Data
U [PHP] Differenza tra amministratore e utente PHP 2
M PHP Arrotondamento minuti in differenza tra due Orari PHP 9
Emix [PHP] Differenza Date + Ore PHP 3
S [PHP] Eseguire differenza su dati SQL presenti sulla stessa colonna PHP 1
V Calcolare la differenza tra due date in PHP PHP 1
peppoweb Differenza PHP-NUKE --->POST-NUKE PHP 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1
E Barra di avanzamento codice PHP PHP 4
G creazione menu a tendina e invio a pagina php PHP 1

Discussioni simili