php - update - ¿Cómo puedo usar declaraciones preparadas en CodeIgniter?
where not in codeigniter (2)
CodeIgniter no admite declaraciones preparadas. Si observa el código fuente de la clase de base de datos de CI, verá que resuelven los enlaces simplemente reemplazando los signos de interrogación con los datos de la matriz pasada.
Solo son compatibles con Query Binding con marcadores de posición sin nombre. Ver http://ellislab.com/codeigniter/user-guide/database/queries.html
Enlaces de consulta
Los enlaces le permiten simplificar la sintaxis de su consulta al permitir que el sistema haga las consultas juntas por usted. Considere el siguiente ejemplo:
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, ''live'', ''Rick''));
Los signos de interrogación en la consulta se reemplazan automáticamente con los valores en la matriz en el segundo parámetro de la función de consulta.
y http://ellislab.com/forums/viewthread/105112/#528915
A pesar de que CI no es compatible con las declaraciones preparadas, sí admite enlaces de consulta. Con sentencias preparadas, debe llamar a algún tipo de función de preparación () y luego a algún tipo de función de ejecución (). Con enlaces de consulta, solo tiene que llamar a una función y básicamente hace lo mismo. Debido a esto, me gusta más la vinculación de consultas que las declaraciones preparadas.
En una nota al margen, cambiando ?
to :foo
simplemente está cambiando de enlaces sin nombre a enlaces con nombre (que CI aparentemente tampoco admite). El hecho de que use cualquiera o no significa que está preparando las declaraciones.
Hola, todo lo que necesito para utilizar Declaraciones preparadas en mi sitio. Intenté usar esto
$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key";
$query = $this->db->query(
$sql,
array( '':id'' => $uid ,'':key'' => $activation_key)
);
Pero esto no está funcionando. Cuando cambio :id
y :key
para ?
esta funcionando.
Me encontré con esta pregunta ya que me enfrenté a un problema similar. La respuesta es correcta: CI no admite declaraciones preparadas. Sin embargo, eso no significa que no pueda usar declaraciones preparadas.
En el siguiente ejemplo, estoy utilizando PDO como mi clase de conexión, pero el siguiente código funcionará:
$q = $this->db->conn_id->prepare(''SELECT * FROM tbl_user WHERE uid=? and activation_key=?'');
$q->execute(array($param1,$param2));
print_r($q->fetchAll());
Tenga en cuenta que conn_id es el objeto PDO con el que puede ejecutar sus declaraciones preparadas.
Sin embargo, esto no permitirá que obtenga la cadena de consulta que permiten las funciones de CI nativas. Necesitará algo como Get Last Executed Query en PHP PDO para eso.
Más aún, esto no le impide usar el generador de consultas para construir sus declaraciones, que luego puede usar en la preparación de PDO. Por ejemplo -
$db->where(''uid = ?'',null,false);
$db->where(''activation_key = ?'',null,false);
$q = $this->db->conn_id->prepare($db->get_compiled_select(''tbl_user''));
Construiría la consulta y le permitiría ver la consulta básica si $db->get_compiled_select(''tbl_user'');