2010-03-12 15 views
19

In sostanza, ho un valore che devo chiamare un paio di volte nella mia query SQL. Pertanto, è possibile riutilizzare lo stesso segnaposto nella dichiarazione, ad es. SELECT :Param FROM Table WHERE Column = :Param, quindi semplicemente bindValue (": Param"), e il valore è lì per entrambi: Params?Domanda parametrizzata PDO - Riutilizzare segnaposti con nome?

+0

Perché non lo provi? PDO :: prepare dice yes e PDOStatement :: execute dice che potrebbe essere necessario chiudere il cursore db in base al driver. –

+0

Ho provato, ho continuato a ricevere un errore, ma ho pensato che stavo facendo qualcos'altro di sbagliato. Non è stato possibile trovare nulla nei documenti (stava guardando PDO :: bindParam). L'ho trovato in DOP :: preparati però, grazie per avermi indirizzato nella giusta direzione! – gamers2000

+0

FYI - questo ha risposto esattamente alla mia domanda. 1 per te :) – meteorainer

risposta

18

PDO::prepare afferma che "non è possibile utilizzare un indicatore di parametro denominato con lo stesso nome due volte in un'istruzione preparata", quindi suppongo che sia un no allora.

+8

I documenti non sono completamente corretti. Se 'PDO :: ATTR_EMULATE_PREPARES' è' true', PDO * DOES * supporta il riutilizzo di indicatori di parametro con nome. – Mike

+2

Sembra che qualcuno abbia aggiornato i documenti. Ora dice "Non è possibile utilizzare un indicatore di parametro con nome con lo stesso nome più di una volta in un'istruzione preparata, a meno che la modalità di emulazione non sia attiva." – Mike

+1

Hai parzialmente ragione. Tuttavia 'SELECT: Param' è impossibile, dal momento che non è possibile associare tabelle/colonne. Dai un'occhiata a http://stackoverflow.com/q/182287/ –

1

Oltre al riutilizzo, il problema principale qui è che si sta tentando di modificare dinamicamente i nomi.

Questa risposta inviato da un utente anonimo http://php.net/manual/en/pdo.prepare.php:

Per coloro che chiedono il motivo per cui l'aggiunta di citazioni a circa un segnaposto è sbagliato, e perché non è possibile utilizzare i segnaposto per i nomi di tabelle o colonne:

C'è un malinteso comune su come funzionano i segnaposti nelle istruzioni preparate: non sono semplicemente sostituiti come (escape) stringhe e l'SQL risultante eseguito. Invece, un DBMS ha chiesto di "preparare" una dichiarazione per ottenere un piano di query completo su come eseguirà tale query, , comprese le tabelle e gli indici che utilizzerebbe l' , indipendentemente dal modo in cui si compila il segnaposto.

Il piano per "SELECT Nome FROM my_table WHERE id =: il valore" sarà la stesso qualunque cosa si sostituisce per ": il valore", ma apparentemente simile "SELECT Nome FROM: tabella WHERE id =: il valore" non può essere pianificato, perché il DBMS non ha idea di quale tavolo si sta per selezionare.

anche quando si utilizza "emulato prepara", DOP non può consentire di utilizzare segnaposto da nessuna parte, perché avrebbe dovuto capire cosa si significato: significa "Seleziona: foo Da some_table" media ": foo" sta per essere un riferimento alla colonna o una stringa letterale?

Quando la query utilizza un riferimento di colonna dinamico, dovresti essere esplicitamente in bianco, elencando le colonne che conosci esistere sulla tabella, ad es. utilizzando un'istruzione switch con un'eccezione generata nella clausola predefinita:

1

È possibile se si imposta PDO::ATTR_EMULATE_PREPARES = true.

E.g. $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);.

Se si utilizza Laravel, è possibile impostarlo in un array options in config/database.php. per esempio. PDO::ATTR_EMULATE_PREPARES => true

Problemi correlati