2011-11-28 3 views
7

Ho riutilizzando la stessa variabile $stmt nel mio script PHP per scrivere le istruzioni preparate:Come faccio a sapere se una dichiarazione preparata viene memorizzata nella cache?

$stmt = $dbh->prepare("SELECT column_A FROM Table1 WHERE id=?"); 
$stmt->bindValue(1, $id, PDO::PARAM_INT); 
$stmt->execute(); 
.... 

$stmt = $dbh->prepare("UPDATE Table2 SET column_B=? WHERE column_A=?"); 
$stmt->bindValue(1, $name); 
$stmt->bindValue(2, $column_A); 
$stmt->execute(); 

La mia domanda è, come faccio a sapere se le due dichiarazioni sono state scritte per memorizzare nella cache e che la seconda dichiarazione non ha sovrascrivere la prima dichiarazione sebbene entrambe le istruzioni condividano lo stesso nome di variabile?

+0

+1 per insegnarmi qualcosa di nuovo –

risposta

2

dichiarazioni sono preparate dal motore di database e non PHP, vedere:

Così riutilizzare lo stesso nome di variabile in PHP non invaliderà la MySQL preparare "cache".

+1

È applicabile solo quando 'setAttribute (PDO :: ATTR_EMULATE_PREPARES, false)' o è applicabile sia per i casi veri che per quelli falsi? –

+0

Nel link si dice che "Se esiste già un'istruzione preparata con il nome specificato, viene deallocato implicitamente prima che venga preparata la nuova istruzione." Come faccio a sapere se 'stmt_name' è assegnato da MySQL e non preso dal nome della variabile PHP? –

+0

@BenHuh: Onestamente, non ne ho idea. La mia ipotesi è che 'stmt_name' sia una sorta di hash calcolato da PHP dalla query SQL stessa. Ho dato una rapida occhiata ai documenti MySQL e al codice sorgente PDO/mysql e non sono riuscito a trovare nulla che punti in entrambe le direzioni, ma penso che i log MySQL possano fornire qualche tipo di informazione utile. –

0

Non è così. Ma l'override della variabile non cambierà molto: stai assegnando un nuovo valore alla variabile, non modificando nulla.