0

Estoy trabajando en un proyecto PHP con conexión a MySQL, pero tengo un inconveniente, cuando hago un select, en algunos casos foreach puede recorrer el objeto PDOStatement y en otros no, no se si deba a la consulta o que podrá ser. He probado hacer debugging del código y simplemente se salta el ciclo foreach en algunas consultas. Esta es la consulta general:

/* $seleccionado es el servicio seleccionado que cambia según lo que 
escoja el cliente, es un select en HTML*/
"SELECT nombre, descr, imagen FROM servicio WHERE nombre = 
'$seleccionado'"

Funciona cuando $seleccionado toma cualquiera de los siguientes valores :
Soluciones En Enlaces Microondas
Despliegue de Red 4G, 3G
Alquiler de Equipos

Deja de funcionar cuando $seleccionado toma cualquier de los valores:
Análisis de Interferencia
Soluciones de Cobertura de Señales

El problema está en la función procesar_resultado($campos_bd), es el primer foreach el cuál a veces se saltea con las consultas mencionadas arriba.
Dejo el código de la conexión:
La pila de llamadas empieza con la función obtener_datos($consulta, $campos_bd);

<?php
    include('constantes.php');

    class conexion{
        private $conexion;
        private $res;

        //El segundo parametro es un arreglo de cadenas que tiene los 
 campos de la base de datos
        public function obtener_datos($consulta, $campos_bd){
            try{        
                $this->conectar_y_seleccionar_bd(constantes::SERVER, 
 constantes::USER, constantes::PASS, constantes::BD);
                 $this->res = $this->conexion->query($consulta);
                return $this->procesar_resultado($campos_bd);
            } catch(PDOException $e){
                print "Error!: ".$e->getMessage()."</br>";
                die();
            }   
        }

        public function actualizar_datos($consulta){
            try{    
                $this->conectar_y_seleccionar_bd(constantes::SERVER, 
                constantes::USER, constantes::PASS, constantes::BD);
                $this->res = $this->conexion->query($consulta);
             } catch(PDOException $e){
                print "Error!: ".$e->getMessage()."</br>";
                die();
             }  
        }

        private function conectar_y_seleccionar_bd($server, $user, $pass, $bd){
            $this->conexion = new PDO("mysql:host=$server;dbname=$bd", $user, $pass);
        }

        private function procesar_resultado($campos_bd){
            $arreglo_resultado = array();
             foreach($this->res as $fila){
                $vector = array();
                foreach ($campos_bd as $campo) {
                array_push($vector, $fila[$campo]);
                }
                array_push($arreglo_resultado, $vector);
            }
            return $arreglo_resultado;                  
        }
    }
?>
  • Por lo que dices, en esos casos la consulta no encuentra datos y por eso no puede recorrer ningún conjunto de resultados. El código debería contemplar la posibilidad de que una consulta sea errónea o que no arroje ninguna fila y actuar en consecuencia. Tu has programado un código pensando en un mundo perfecto. Pero tal cosa no existe, de hecho, a veces ocurren errores, resultados inesperados ... y eso hay que saber manejarlo también. Por cierto, tu consulta tiene una seria vulnerabilidad, te pueden inyectar código malicioso a través de ella. – A. Cedano Dec 20 '17 at 16:54
  • Pero la consulta no sale erronea cuando hago debugging, al contrario sale como un objetoPDOStatement. Será posible que un objeto PDOStatement también se encuentre vacio y que por eso no devuelve nada? Y aparte cuando hago esa misma consulta en la base de datos me devuelve el resultado esperado. @A.Cedano gracias por tu respuesta, se que la consulta tiene vulnerabilidades y la veré en un momento. – Luis De La Peña Dec 20 '17 at 17:21
  • Gracias A.Cedano por tu tiempo, tienes razón tuve que agregarle la función de validación para saber si el número de filas es mayor a 0, use para eso PDO::rowCount($this->res); – Luis De La Peña Dec 20 '17 at 21:21

1 Answers1

0

Encontré la solución y era codificar las entradas POST con la función utf8_decode.
Lo que pasaba es que las palabras al usar tíldes y caracteres especiales eran enviados a la base de datos tal cual y es por eso que no se encontraba tal consulta.

utf_decode($_POST['seleccionado'])

Ahora solo queda arreglar la vulnerabilidad de SQL!

  • 1
    Al leer tu comentario, veo que has implementado una solución a medio camino. Creo que deberías seguir profundizando, no es una buena idea hacer conversiones a medio camino como haces aquí con `utf_decode`. Por favor cuando puedas [lee esta respuesta](https://es.stackoverflow.com/a/59510/29967). – A. Cedano Dec 20 '17 at 21:26
  • Ya leí todo, resulto muy interesante saber que las codificaciones se hacen en todas las partes del programa desde front hasta la base de datos. Acabo de implementarlo y he desechado el utf8_decode para usar mb_internal_encoding('UTF-8'); en mi código php asi como también la respectiva codificación para PDO y Mysql, lo del html si lo tenía listo. Gracias una vez más por ayudar a uno a ser más profesional y no sólo quedarse parchando código. Funcionó perfecto. – Luis De La Peña Dec 20 '17 at 22:26