[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.203
207
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.203
207
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.203
207
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.203
207
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
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 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

Discussioni simili