Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Error Mysqli sentencia preparada con un if simple

Estas en el tema de Error Mysqli sentencia preparada con un if simple en el foro de PHP en Foros del Web. Hola gente, tengo un problema, estoy intentando preparar con mysqli esta sentencia: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT if ( articulos.stock > 0 , ...
  #1 (permalink)  
Antiguo 25/11/2013, 11:20
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Error Mysqli sentencia preparada con un if simple

Hola gente, tengo un problema, estoy intentando preparar con mysqli esta sentencia:

Código MySQL:
Ver original
  1. SELECT if(articulos.stock>0,"si","no") FROM articulos;

pero me arroja este error:

Cita:
SELECT if(articulos.stock>0,"si","no") FROM articulos; 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 '"si","no") FROM articulos' at line 1
no obstante, si intento preparar esto:

Código MySQL:
Ver original
  1. SELECT stock FROM articulos;

no hay problema.
en phpmyadmin las dos consultas andan bien, hay que hacer algo con mysqli para que permita usar el if?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 25/11/2013, 11:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error Mysqli sentencia preparada con un if simple

Las comillas son tema complicado en MySQL. Usualmente no se usan para cadenas de texto sino para nombres de objets (columnas, tablas, etc), por lo que fácilmente pueden generar errores sintácticos indetectables.
Las cadenas de texto van entre apóstrofos ('), no con comillas (").
Prueba haciendo:
Código MySQL:
Ver original
  1. SELECT IF(stock>0,'si','no') ExisteStock #Los alias siembre deben ir cuando usas fuciones
  2. FROM articulos;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 25/11/2013 a las 11:36
  #3 (permalink)  
Antiguo 25/11/2013, 11:26
 
Fecha de Ingreso: noviembre-2008
Ubicación: aserri
Mensajes: 27
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Error Mysqli sentencia preparada con un if simple

Ponle comillas simples ' '
  #4 (permalink)  
Antiguo 25/11/2013, 11:36
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Error Mysqli sentencia preparada con un if simple

No, hay caso, si pongo comillas simples el error es identico:

Cita:
SELECT if(articulos.stock>0,'si','no') FROM articulos;)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 ''si','no') FROM articulos' at line 1
en phpmyadmin anda bien de ambas formas, asi que no creo que sea un problema de la consulta en si, sino de cuando se prepara.
la clase que uso tiene estos 3 metodos y falla en _prepararSentencia()

la variable $sentencia que recibe el metodo rawQuery es la consulta con el if
Código PHP:
Ver original
  1. protected function rawQuery($sentencia, $bindParametros = NULL)
  2.     {
  3.         $this->_sentencia = filter_var($sentencia, FILTER_SANITIZE_STRING);
  4.         $stmt = $this->_prepararSentencia();
  5.  
  6.         if (is_array($bindParametros) === true)
  7.         {
  8.             $parametros = array(''); // Crea vacio el indice 0.
  9.             foreach ($bindParametros as $campo => $valor)
  10.             {
  11.                 $parametros[0] .= $this->_determinarTipo($valor);
  12.                 $parametros[] = $valor;
  13.             }
  14.  
  15.             call_user_func_array(array($stmt, 'bind_param'), $this->referenciarValores($parametros));
  16.         }
  17.  
  18.         $this->ejecutarSentencias($stmt);
  19.         return $this->_bindResultados($stmt);
  20.     }
  21.  
  22. protected function _prepararSentencia()
  23.     {
  24.         if (!$stmt = $this->_mysqli->prepare($this->_sentencia))
  25.             echo('Ocurrio un error preparando la sentencia ('.$this->_sentencia.') '.$this->_mysqli->error);
  26.  
  27.         return $stmt;
  28.     }
  29.  
  30. private function ejecutarSentencias(mysqli_stmt &$stmt)
  31.     {
  32.         if(!$stmt->execute())
  33.         {
  34.             if($this->_explotar)
  35.                 die('Ocurrio un error procesando los datos ('.$this->_mysqli->errno.') '.$this->_mysqli->error);
  36.             else {
  37.                 $this->_error = $this->_mysqli->error;
  38.                 $this->_nroError = $this->_mysqli->errno;
  39.             }
  40.         }
  41.     }
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 25/11/2013, 11:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error Mysqli sentencia preparada con un if simple

No veo la parte donde se construye el string de la consulta.
Sin ver cómo se crea la query, es imposible saber si realmente quedó bien armada.

Por cierto, no estás usando el alias, como sugerí, aunque eso no agregaría realmente nada al problema, según creo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 25/11/2013, 11:45
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Error Mysqli sentencia preparada con un if simple

Código PHP:
Ver original
  1. $sentencia = "  SELECT if(articulos.stock>0,'si','no') existeStock FROM articulos;";
  2.        
  3. $this->resultados = $this->rawQuery($sentencia);

con ese codigo lo llamo, con el alias da el mismo error
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #7 (permalink)  
Antiguo 25/11/2013, 11:52
Avatar de Cuervoo  
Fecha de Ingreso: octubre-2013
Mensajes: 165
Antigüedad: 11 años, 2 meses
Puntos: 43
Respuesta: Error Mysqli sentencia preparada con un if simple

Te está faltando el AS

Código PHP:
Ver original
  1. $sentencia = "  SELECT if(articulos.stock>0,'si','no') AS existeStock FROM articulos;";
  #8 (permalink)  
Antiguo 25/11/2013, 11:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error Mysqli sentencia preparada con un if simple

El AS es irrelevante. No es obligatorio y no produce ningún efecto.
Ya no es parte del estandar SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 25/11/2013, 11:54
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Error Mysqli sentencia preparada con un if simple

Código PHP:
Ver original
  1. $sentencia = "  SELECT if(articulos.stock>0,'si','no') AS existeStock FROM articulos;";
  2.            
  3.         $this->resultados = $this->rawQuery($sentencia, $bindParametros);


Cita:
Ocurrio un error preparando la sentencia ( SELECT if(articulos.stock>0,'si','no') AS existeStock FROM articulos;) 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 ''si','no') AS existeStock FROM articulos' at line 1
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #10 (permalink)  
Antiguo 25/11/2013, 12:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error Mysqli sentencia preparada con un if simple

Quítale el punto y coma final a la sentencia.
Según el manual de referencia de MYSQLI::prepare
Cita:
Parámetros ¶

link
Sólo estilo por procediminetos: Un identificador de enlace devuelto por mysqli_connect() o mysqli_init()
query
La consulta, como un string.
Cita:
Nota:
No se debe agregar un punto y coma o \g a la sentencia.
Y como bien cabe la observación en base a lo que pone @NSD:
Cita:
Ocurrio un error preparando la sentencia (
Vale decir, que no es un error de sintaxis... es un error de preparacion.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 25/11/2013, 12:09
Avatar de Cuervoo  
Fecha de Ingreso: octubre-2013
Mensajes: 165
Antigüedad: 11 años, 2 meses
Puntos: 43
Respuesta: Error Mysqli sentencia preparada con un if simple

Cita:
El AS es irrelevante. No es obligatorio y no produce ningún efecto.
Ya no es parte del estandar SQL.
Joya, gracias.
  #12 (permalink)  
Antiguo 25/11/2013, 12:19
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Error Mysqli sentencia preparada con un if simple

he quitado el ";" y el error persiste.

destripe las funciones dejando solo lo relevante para este caso particular y encontre que si cambio esta linea:

Código PHP:
Ver original
  1. $this->_sentencia = filter_var($sentencia, FILTER_SANITIZE_STRING);
por esta otra:
Código PHP:
Ver original
  1. $this->_sentencia = $sentencia;

se prepara correctamente la query.

ahora bien, si pongo este codigo:

Código PHP:
Ver original
  1. echo($sentencia.'<br>'.filter_var($sentencia, FILTER_SANITIZE_STRING));

obtengo esto:
Cita:
SELECT if(articulos.stock>0,'si','no') AS existeStock FROM articulos
SELECT if(articulos.stock>0,'si','no') AS existeStock FROM articulos
¡Exactamente lo mismo! ¡pero la primer opcion anda y la segunda no! WTF???
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #13 (permalink)  
Antiguo 25/11/2013, 13:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Error Mysqli sentencia preparada con un if simple

Si ves el Manual, lo que hace FILTER_SANITIZE_STRING, es cambiar algunos atributos por sus entidades HTML, por lo que aunque hagas el echo, en el navegador se va a ver igual, pero haz esto:
Código PHP:
Ver original
  1. echo(htmlspecialchars($sentencia).'<br>'.htmlspecialchars(filter_var($sentencia, FILTER_SANITIZE_STRING)));

y vas a ver la diferencia.

Etiquetas: mysql, mysqli, select, sentencia, simple, sql
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 12:31.