Domanda

SI PREGA DI LEGGERE ATTENTAMENTE LA QUESTIONE. Non è usuale stupido "il mio codice non funziona !!!" domanda.

Quando eseguo questo codice con Errore destinato

try {
  $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
  $sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
    echo $e->getMessage();
}

ricevo questo messaggio di errore

  

Hai un errore nella sintassi SQL ... vicino 'INN (' I \ 'm', 'd \' Artagnan ')' at line 1

Ma ho pensato per anni che query e dati che vengono inviati al server separatamente e mai interferire. Così ho alcune domande (anche se dubito che qualcuno ha ottenuto una risposta ...)

  1. Dove si ottiene una rappresentazione di stringa familiare - citato ed è scappato? E 'stato fatto soprattutto per segnalare un errore o è una parte della query reale?
  2. Come funziona in tempo reale? Ha sostituire un segnaposto con i dati o no?
  3. C'è un modo per ottenere tutta la domanda, non solo po 'di esso, a scopo di debug?

Aggiorna

mysqli vuol come previsto: si genera un errore dice near 'INN(?,?)'

È stato utile?

Soluzione

provare ad aggiungere

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

;)

Altri suggerimenti

Io non sono sicuro di tutti i dettagli, ma io cercherò di rispondere.

  1. La citazione avviene sul lato database. Il database fugge e disinfetta tutti i valori (vedi punto 2) che riceve in modo che venga interpretata correttamente. Nel momento in cui viene lanciato l'errore, il database (in questo caso MySQL) stampa l'interrogazione ha cercato di correre. Questo non sarebbe così utile se appena mostrato la parte preparato.

  2. No, non è così. Al tempo di preparazione della query viene compilato sul lato server. Quando viene eseguita una query con valori, vengono trasmessi solo i valori. Questo è più o meno lo stesso di chiamare Prepara ed esegue sul database direttamente.

  3. Questo dipende dal database che si sta utilizzando. MySQL per esempio possono accedere tutte le query in un file di log (controllare my.cnf impostazioni per questo). Ma si può anche utilizzare debugDumpParams () sul lato PHP.

Spero che questo era un po 'utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top