Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/08/2013, 05:22
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
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