[SOLUCIONADO] ERROR AL INSERTAR CAMPO CON CARACTER '

Hola que tal?

Tenemos el siguiente problema, en toba hacemos un INSERT de la siguiente manera:

pg_query($dbconn2, “INSERT INTO acta_cabecera VALUES (‘$var01’ ,‘$var02’,‘$var03’, ‘$var04’, ‘$var05’, ‘$var06’, ‘$var07’, ‘$var08’, ‘$var15’, ‘$var16’)”);

En donde uno de los campos es apellidos y nombres, anda trodo perfecto, pero cuando encuentra un nombre con el caracter: ’
Por ejemplo: O’CAMPO, O’CONNOR, D’AMICO , etc.
Nos da el siguiente error:

Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near “INDIO” LINE 1: …T INTO acta_detalle VALUES ('110912 ', 'D’INDIO ALOE… ^ in C:\toba_1.4.8\proyectos\control_diploma\php\ci\ci_importacion.php on line 101

A que se debe esto? Al encoding?

Nuestra base de datos esta en LATIN1 y el motor postgres 8.2 también en LATIN1.
Antes probamos con UTF8 y teniamos otros problemas de datos así que nos pasamos a LATIN1

Desde ya gracias…

Saludos
MARTIN

Hola Sergio,

el problema es que ese apostrofo no esta escapado y por tanto postgres lo toma como un delimitador, por tanto el parser encuentra una SQL mal formada. Por otro lado, una de las primeras cosas que se prueba en un ataque con SQL Injection es justamente casos de este tipo.

Para solucionar problemas de esta indole en toba_db existe la funcion quote() , te pongo un ejemplo de uso:


$fecha =  toba::db()->quote('2010-04-18');
$nombre = toba::db()->quote($nombre_persona);
$id_carrito = toba::db()->quote($carro);

$sql = "INSERT INTO tabla_absurda (nombre, fecha, carrito) VALUES ($nombre, $fecha, $id_carrito);";

Fijate que las variables en la SQL estan sin entrecomillar… ya que el quote se encarga de determinar que valores deben ir entre delimitadores y cuales no.
Si tenes los valores a ingresar en un arreglo entonces podes “quotear” todo el arreglo al mismo tiempo, no es necesario ir por cada componente.
Algo que recomendamos es el uso del quote en los valores a ingresar dinamicamente a una SQL, ya sean provenientes de filtros, formularios o cualquier otra interaccion con el usuario,
esto se viene recomendando hace tiempo ya que mejora la seguridad frente a ataques SQL Injection.

Saludos
Richard

Hola Richard!,
una bala, anduvo perfecto…

MUCHAS GRACIAS!!
MARTIN