Foros del Web » Programando para Internet » PHP »

Escapar consultas. A mano o con sentencias preparadas

Estas en el tema de Escapar consultas. A mano o con sentencias preparadas en el foro de PHP en Foros del Web. Buenos días a todos, llevo ya un tiempo, hablando de semanas, intentando realizar esto y no logro solucionarlo. Mi base de datos es VisualFoxPro (dbase) ...
  #1 (permalink)  
Antiguo 29/08/2013, 05:22
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Escapar consultas. A mano o con sentencias preparadas

Buenos días a todos,

llevo ya un tiempo, hablando de semanas, intentando realizar esto y no logro solucionarlo. Mi base de datos es VisualFoxPro (dbase) y me conecto vía ODBC. También he probado con ADO DB, OLEDB, COM, con otros lenguajes de programación...

Si alguno logra decirme una solución estaria en eterna deuda.

El problema es el siguiente. Hice una interfaz web donde los usuarios insertan datos y los tengo que agregar directamente a esta base de datos, el problema son:
· Los saltos de línea. Creo que sólo acepta \r, o sólo \n no recuerdo, pero no ambos
· Las infames ' (en principio las " no dan problema)

Al parecer el caracter de escape es ' así que si aparece una ' debo poner '' para escaparla, pero entonces los siguientes caracteres no aparecen, solo unos pocos, algo extraño.

La otra solución que se me ocurrió aparte de el intento fallido de escapar a mano fue intentar con sentencias preparadas. Aquí un intento con PDO:

Código PHP:
try 
    {
        
$conn = new PDO('odbc:Clasges5');           
        
$conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        
$sql "INSERT INTO codpais (clapai,codpas,nompas) VALUES (:clapai,:codpas,:nompas)";
        
$q $conn->prepare($sql);
        
$clapai 31;
        
$codpas 'test codpas';
        
$nompas 'test nompas';
        
$q->bindParam(':clapai'$clapaiPDO::PARAM_INT);
        
$q->bindParam(':codpas'$codpasPDO::PARAM_STR);
        
$q->bindParam(':nompas'$nompasPDO::PARAM_STR);
        
$q->execute();        
}
catch(
Exception $e)
{
    echo 
$e->getMessage();

Devuelve: SQLSTATE[22018]: Invalid character value for cast specification: 302 [Microsoft][ODBC Visual FoxPro Driver]Data type mismatch. (SQLExecute[302] at ext\pdo_odbc\odbc_stmt.c:254)
Es decir, es como sino estuvise intnetando agregar un número, sino un string o algo similar.

Lo curioso es que los campos de tipo texto me los escapa correctamente, si hago un update a un string lo hace sin problemas, aunque desconozco el como (para hacerlo a mano).

No se si es que PDO::PARAM_INT es incorrecto para un PK (no es autoincremental, debo ponerlo a mano).

¿Alguna idea?
Lo unico que se me ocurre es poner el "clapai" directamente sin usar un bind, lo cual funciona, pero es un poco cutre no? no hay alguna otra solucion? Además esto me supondría un incremento de dificultad en crear una clase para gestionar las conexiones.

Me pasa lo mismo al intentar hacer un update a cualquier campo numérico. Es decir, todo lo que meto en prepare como ':campo' me lo trata como un texto. Es bastante coñazo. Alguna forma de escapar los campos de la misma forma que lo hace PDO?

Si intento usar la funcion QUOTE de PDO me convierte la cadena en una cadena vacia. Por ejemplo, si hago $conexion->quote($prueba); siendo $prueba = 'A'; pues $prueba se convierte en ''; (se carga el contenido).

Última edición por alyciashape; 29/08/2013 a las 05:40
  #2 (permalink)  
Antiguo 29/08/2013, 08:30
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Escapar consultas. A mano o con sentencias preparadas


<saludos>
Pues intenta con ado again, y esta librería tiene la función Quote para resolver
el tema de comillas, prueba con eso y comentas
Ej:
Código PHP:
Ver original
  1. $con->Quote('texto');
</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Etiquetas: escapar, mano, sentencias, sql, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:39.