codeigniter activerecord select backticks

codeigniter - Comportamiento de backticks extraño en Active Record en Code Igniter 2.0.3



activerecord select (9)

Anteriormente, todas mis consultas funcionaban correctamente en CI versión 2.0, pero cuando actualicé a 2.0.3, algunas de mis consultas SELECT se interrumpieron.

CI está agregando backticks (``) automáticamente, pero en versiones anteriores se está ejecutando como está.

El manual de usuario de CI ha dado instrucciones para agregar un segundo parámetro en

db-> seleccionar

como

FALSO

pero aun así no está funcionando.

El código es el siguiente:

class Company_model extends MY_Model { ---------------- $this->db->select('' count(''.$fieldname. '') as num_stations''); $this->db->select(" CONCAT_WS('','', clb_company.address1, clb_company.address2, clb_company.city, clb_company.state, clb_company.zipcode ) as companyAddress"); $this->db->from($this->_table); $this->db->join($this->_table_device, $fieldname1. " = ". $fieldname2, ''LEFT''); $this->db->where($blablafield , ''0''); ----------------

El error es el siguiente:

Error Number: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''FROM (`clb_device`) JOIN `clb_company` ON `clb_company`.`id` = `clb_device`.`com'' at line 2 SELECT `clb_device`.`id` as deviceId, `clb_pricing_specifications`.`name` as pricingSpecName, `clb_company`.`name` as companyName, `clb_device`.`mac_address` as deviceMacAddress, `clb_device`.`reseller_model_number` as deviceModelNumber, `clb_pricing_spec_grouping`.`pricing_master_spec_id` as pricingSpecId, `clb_device`.`address` as deviceAddress, `clb_device`.`is_home` as deviceIsHomeCharger, CONCAT(clb_company.portal_line1, `''/''`, `clb_device`.`name)` as deviceDisplayName FROM (`clb_device`) JOIN `clb_company` ON `clb_company`.`id` = `clb_device`.`company_id` LEFT JOIN `clb_pricing_group_devices` ON `clb_device`.`id` = `clb_pricing_group_devices`.`device_id` and clb_pricing_group_devices.is_active = 1 LEFT JOIN `clb_pricing_spec_grouping` ON `clb_pricing_group_devices`.`pricing_spec_id` = `clb_pricing_spec_grouping`.`pricing_master_spec_id` LEFT JOIN `clb_pricing_specifications` ON `clb_pricing_spec_grouping`.`pricing_spec_id` = `clb_pricing_specifications`.`id` WHERE clb_company.vendor_id is not null AND cast(substr(clb_devi ce.software_version, 1, 3) as decimal(2,1)) > 2.0 AND clb_device.device_state > 0 GROUP BY `clb_device`.`id` ORDER BY CONCAT(trim(clb_company.portal_line1), `''/''`, trim(clb_device.name)) desc LIMIT 20

Eche un vistazo a CONCAT (trim (clb_company.portal_line1), `''/''`, trim (clb_device.name))

Por favor sugiera la solución.

Gracias


Acabo de leer una solución simple para esto ...

Cambié el valor de var $ _escape_char (system / database / drivers / mysql / mysql_driver.php, línea 36 ...

Era

var $_escape_char = ''`'';

Cambiado a

var $_escape_char = '' '';

y ahora funciona ... Pero tengo miedo si tengo problemas de seguridad ...

Gracias


Aquí hay un truco que funcionó para mí. Reemplace esta línea

$this->db->join($this->_table_device, $fieldname1. " = ". $fieldname2, ''LEFT'');

con este:

$this->db->join($this->_table_device, $fieldname1. " IN(". $fieldname2 .")", ''LEFT'');

esto evitará que CI escape su campo. No es ideal, pero es mejor que las alternativas.


CI solo protegerá sus llamadas de REGISTRO ACTIVO, por lo que si ejecuta $this->db->query(); Estarás bien, y en base a las notas estarás seguro con las llamadas de AD para inhabilitar los backticks (no estoy seguro de por qué dices que no funcionan, pero no veo tu código completo, así que no puedo Por supuesto)

$this->db->select(''(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4'') AS amount_paid'', FALSE); $query = $this->db->get(''mytable'');

asegúrese de que FALSE no contenga comillas simples (lo convierte en una cadena), y puede que no valide (no lo he probado).


Creo que deberías verificar el archivo DB_driver.php, hay una variable llamada protect_identifier, el punto es cuando verificas con la versión anterior de CI, verás que hay una condición que falta en la nueva versión, variable de escape que es verificamos la nulabilidad, pegamos esa condición de la versión anterior y estarás bien


La solución es muy simple: en el archivo de configuración de la base de datos (./application/config/database.php) agregue un nuevo elemento a la matriz con la configuración predeterminada.

$db[''default''][''_protect_identifiers'']= FALSE;

Esta solución me funciona y es más elegante y profesional.


Todas las demás respuestas son realmente antiguas, esta funciona con CI 2.1.4

// set this to false so that _protect_identifiers skips escaping: $this->db->_protect_identifiers = FALSE; // your order_by line: $this -> db -> order_by(''FIELD ( products.country_id, 2, 0, 1 )''); // important to set this back to TRUE or ALL of your queries from now on will be non-escaped: $this->db->_protect_identifiers = TRUE;


Use esta línea antes de su consulta:

$this->db->_protect_identifiers=false;

Esto dejará de agregar repeticiones a la consulta construida.


CI_DB_active_record::where() tiene un tercer parámetro para el escape, esto me ha funcionado mejor que el encendido y apagado de CI_DB_driver::_protect_identifiers

public function where($key, $value = NULL, $escape = TRUE)

No estoy seguro de qué versión de CI se agregó.

HTH alguien


class Company_model extends MY_Model { ---------------- $this->db->select(" count(''$fieldname'') as num_stations",false); $this->db->select(" CONCAT_WS('','', clb_company.address1, clb_company.address2, clb_company.city, clb_company.state, clb_company.zipcode ) as companyAddress",false); $this->db->from($this->_table); $this->db->join($this->_table_device, $fieldname1. " = ". $fieldname2, ''LEFT''); $this->db->where($blablafield , ''0''); ----------------

Lo false que estabas hablando es lo que se necesita, ¿puedes probar el código de arriba y copiar y pegar el resultado de

echo $this->db->last_query();

Esto nos mostrará qué está creando exactamente la clase DB y podemos ver qué está funcionando / qué no. Puede ser otra cosa (no ha dado el error que se genera, a veces los errores sql pueden ser engañosos).

De los docs :

$this->db->select() acepta un segundo parámetro opcional. Si lo configura en FALSE , CodeIgniter no intentará proteger los nombres de su campo o tabla con palos de retroceso. Esto es útil si necesita una declaración de selección compuesta.