2012-05-03 16 views
5

Uso il codeigniter e la maggior parte delle volte utilizzo il record attivo per le mie query (che le evapora automaticamente), ma questa query non sembra adattarsi perfettamente a causa della variabile. Quindi ho bisogno di capire come sfuggire alla query manualmente.query di escape SQL + codeigniter

CodeIgniter documenti suggeriscono di sfuggire le query in questo modo:

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")"; 

mio query originale

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'"; 

mio sfuggito interrogazione

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")"; 

ma sto avendo problemi Getti ng la sintassi giusta. I messaggi di errore sono: messaggio di errore

  • PHP: Variabile non definita: USER_LANGUAGE
  • SQL errore: sintassi sbagliato ... vicino 'VALORI (NULL)' at line 1
+0

vuoi inserire o selezionare qualcosa con la tua richiesta? – Hajo

+0

SELEZIONA. L'INSERT è dai documenti di Codeigniter. – chowwy

+0

aggiornato la mia risposta, speriamo che funzioni per voi:] – Hajo

risposta

12
$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id); 

se vuoi selezionare la lingua dell'utente dato da $ id dovrebbe funzionare in questo modo.

che fare con i numeri di un'alternativa sarebbe:

$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . (int)$id; 

CodeIgniter supporta anche le istruzioni preparate come "binding query":

The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you.

+0

Grazie; Funziona! Ho accettato e upvoted la tua risposta. Domanda a parte: c'è un modo in cui posso confermare che la query è sfuggita? Ho alcune altre domande da scappare e voglio controllarle dopo. – chowwy

+0

Grazie per l'aggiornamento. Questo è utile. – chowwy

+0

bene sto usando dichiarazioni preparate e nessuna fuga per anni. non so se il codeigniter li supporta: http://php.net/manual/en/pdo.prepared-statements.php – Hajo

4

Sono confuso perché dici non è possibile utilizzare la Classe di registrazione attiva con CI, questa è una semplice chiamata SQL (nell'esempio seguente viene utilizzato method chaining):

$this->db->select('*')->from('user_language')->where('user_id', $id); 
$query = $this->db->get(); 

Il tuo $id viene quindi escappato correttamente e si riduce ogni iniezione. Personalmente utilizzo AR quando possibile, mi consente di scrivere codice rapido ed efficiente e non mi preoccupo delle cose brutte con le chiamate SQL (query personalizzate).

+0

Ok, questo è in aumento. Non è che non potessi, ma non avevo sentito parlare di metodi concatenati. Non sapevo come indicare la variabile nella clausola where. Davvero apprezzato. – chowwy

+0

@chowwy, è tutto nella [Guida dell'utente] (http://codeigniter.com/user_guide/database/index.html), è molto completo con buoni esempi – Jakub

+0

Sì, lo uso come riferimento. Grazie ancora. – chowwy