Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema al intentar guardar datos

Estas en el tema de Problema al intentar guardar datos en el foro de PHP en Foros del Web. Hola amigos, mi problema es el siguiente: Tengo un sencillo formulario en el que el usuario debe de ingresar sus datos personales, éstos son validados ...
  #1 (permalink)  
Antiguo 06/11/2013, 02:48
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Problema al intentar guardar datos

Hola amigos, mi problema es el siguiente:

Tengo un sencillo formulario en el que el usuario debe de ingresar sus datos personales, éstos son validados mediante expresiones regulares para evitar inyecciones SQL o de otro tipo y finalmente son enviados a un archivo que realiza la llamada del respectivo procedimiento almacenado creado en una BD en MySQL. Además de este procedimiento almacenado (de ahora en adelante PA), hay otros dos más que utilizo para llenar datos en dos combos, éstos trabajan sin problemas, no así el PA con el que intento guardar los datos.

La estructura del formulario es la siguiente:
Código PHP:
Ver original
  1. <?php
  2. //Aquí incluyo el archivo de conexión y el que realiza las consultas a la BD
  3. ?>
  4. <form id = "miFormulario" name = "miFormulario" action = "procesar.php" method = "POST">
  5.     <section id = "labels">
  6.         <label for = "nombre" accessKey = "nombre">Nombre</label>
  7.         <label for = "apellidos" accessKey = "apellidos">Apellidos</label>
  8.         <label for = "email" accessKey = "email">E-Mail</label>
  9.         <label for = "domicilio" accessKey = "domicilio">Domicilio</label>
  10.         <label for = "fechanac" accessKey = "fechanac">Fecha de nacimiento</label>
  11.         <label for = "pais" accessKey = "pais">País</label>
  12.     </section>
  13.     <section id = "inputs">        
  14.         <!-- Nombre -->
  15.         <input type = "text" id = "nombre" name = "nombre" size = "20" placeholder = "Ingrese su nombre" pattern = "^[A-ZÁÉÍÓÚÑÜ]+[a-záéíóúÜüÑñA-ZÁÉÍÓÚ\.' ]{2,150}" required title = "Debe de ingresar caracteres típicos en el nombre de una persona" autofocus />
  16.                
  17.         <!-- Apellidos -->
  18.         <input type = "text" id = "apellidos" name = "apellidos" size = "20" placeholder = "Ingrese sus apellidos" pattern = "^[A-ZÁÉÍÓÚÑ]+[a-záéíóúÑñA-ZÁÉÍÓÚ\.' ]{2,150}" required title = "Debe de ingresar caracteres típicos en los apellidos de una persona" />      
  19.                
  20.         <!-- E-Mail -->
  21.         <input type = "email" id = "email" name = "email" size = "25" placeholder = "Ingrese su E-Mail" required title = "Debe de ingresar un E-Mail válido, ej. [email protected]" />
  22.                
  23.         <!-- Domicilio -->
  24.         <input type = "text" id = "domicilio" name = "domicilio" size = "30" placeholder = "Ingrese la dirección de su domicilio"  required title = "Debe de ingresar caracteres típicos en el nombre de una persona" />
  25.            
  26.         <!-- Fecha de nacimiento -->
  27.         <input type = "date" id = "fechanac" name = "fechanac" required title = "Debe de seleccionar la fecha de su nacimiento" />
  28.            
  29.         <!-- Pais -->
  30.         <?php
  31.         $buscarPais = $miConsulta->paises($miConexion->conexion);
  32.         if (mysqli_num_rows($buscarPais)) {
  33.         ?>
  34.             <select id = "pais" name = "pais" required title = "Debe de seleccionar el país en donde nació">
  35.                 <option></option>
  36.         <?php
  37.             while ($datosPais = mysqli_fetch_array($buscarPais)) {
  38.         ?>
  39.                 <option value = "<?=$datosPais["codigo"]?>"><?=utf8_encode($datosPais["nombre"])?></option>
  40.         <?php
  41.             }
  42.         ?>
  43.             </select>
  44.         <?php
  45.         } else
  46.             echo "No se encontraron países en la base de datos";
  47.         ?>
  48.     </section>
  49.  
  50.     <!-- Ciudad -->
  51.     <div id = "divCiudad">
  52.         <section id = "labelCiudad">
  53.             <label for = "ciudad" accessKey = "ciudad">Ciudad</label>
  54.         </section>
  55.  
  56.         <section id = "inputCiudad"></section>
  57.     </div>
  58.  
  59.     <!-- Botón Guardar -->
  60.     <input type = "submit" id = "guardar" name = "guardar" value = "Guardar" />
  61. </form>

El archivo procesar.php, que es el que recibe los datos ingresados en el formulario, contiene lo siguiente:
Código PHP:
Ver original
  1. <?php
  2. //Aquí incluyo a los archivos de la conexión a la BD, el que realiza las consultas a la BD, el que desinfecta los datos de entrada (usé [URL="http://css-tricks.com/snippets/php/sanitize-database-inputs/"][B][COLOR="Blue"]este script[/COLOR][/B][/URL]) y el que realiza las validaciones
  3.  
  4. //Código
  5. if (!($miConsulta->codigo($miConexion->conexion, $codigo = $scripts->codigo())))
  6.     do {
  7.         $codigo = $scripts->codigo();
  8.     } while ($miConsulta->codigo($miConexion->conexion, $codigo));
  9.  
  10. //Nombre
  11. $nombre = (strlen($_POST["nombre"]) && isset($_POST["nombre"]) && !is_null($_POST["nombre"])) ? $scripts->validarNomApe($desinfectar->sanitize($miConexion->conexion, $_POST["nombre"])) : $scripts->formulario();
  12. if (is_null($nombre)) $scripts->formulario("Debe de ingresar su nombre en un formato válido");
  13.  
  14. //Apellidos
  15. $apellidos = (strlen($_POST["apellidos"]) && isset($_POST["apellidos"]) && !is_null($_POST["apellidos"])) ? $scripts->validarNomApe($desinfectar->sanitize($miConexion->conexion, $_POST["apellidos"])) : $scripts->formulario();
  16. if (is_null($apellidos)) $scripts->formulario("Debe de ingresar sus apellidos en un formato válido");
  17.  
  18. //E-Mail
  19. $email = (strlen($_POST["email"]) && isset($_POST["email"]) && !is_null($_POST["email"])) ? $scripts->validarEMail($desinfectar->sanitize($miConexion->conexion, $_POST["email"])) : $scripts->formulario();
  20.  
  21. if (is_null($email))
  22.     $scripts->formulario("Debe de ingresar su E-Mail en un formato válido");
  23. else if ($miConsulta->email($miConexion->conexion, $email)) {
  24.     $scripts->formulario("El E-Mail ingresado se encuentra registrado. Por favor, ingrese otro.");
  25.     $email = NULL;
  26. }
  27.  
  28. //Domicilio
  29. $domicilio = (strlen($_POST["domicilio"]) && isset($_POST["domicilio"]) && !is_null($_POST["domicilio"])) ? $scripts->validarDomicilio($desinfectar->sanitize($miConexion->conexion, $_POST["domicilio"])) : $scripts->formulario();
  30. if (is_null($domicilio)) $scripts->formulario("Debe de ingresar su dirección domiciliaria en un formato válido y utilizando menos de 256 caracteres");
  31.  
  32. //Fecha de nacimiento
  33. $fechanac = (strlen($_POST["fechanac"]) && isset($_POST["fechanac"]) && !is_null($_POST["fechanac"])) ? $scripts->validarFechNac($desinfectar->sanitize($miConexion->conexion, $_POST["fechanac"])) : $scripts->formulario();
  34. if (is_null($fechanac)) $scripts->formulario("Debe de ingresar la fecha de su nacimiento en un formato válido");
  35.  
  36. //País
  37. $pais = (strlen($_POST["pais"]) && isset($_POST["pais"]) && !is_null($_POST["pais"])) ? $scripts->validarPaisCiudad($desinfectar->sanitize($miConexion->conexion, $_POST["pais"])) : $scripts->formulario();
  38. if (is_null($pais)) $scripts->formulario("Debe de elegir un país de la lista");
  39.  
  40. //Ciudad
  41. $ciudad = (strlen($_POST["ciudad"]) && isset($_POST["ciudad"]) && !is_null($_POST["ciudad"])) ? $scripts->validarPaisCiudad($desinfectar->sanitize($miConexion->conexion, $_POST["ciudad"])) : $scripts->formulario();
  42. if (is_null($ciudad)) $scripts->formulario("Debe de elegir una ciudad de la lista");
  43.  
  44. //Añadimos todos los datos a un array que será enviado a la función de procesamiento de datos
  45. $datos = array(
  46.             "codigo" => $codigo,
  47.             "nombre" => $nombre,
  48.             "apellidos" => $apellidos,
  49.             "email" => $email,
  50.             "domicilio" => $domicilio,
  51.             "fechanac" => $fechanac,
  52.             "pais" => $pais,
  53.             "ciudad" => $ciudad
  54.         );
  55.        
  56. $bandera = true; //Comodín para determinar si se guardarán o no los datos
  57. foreach ($datos as $dato)
  58.     if (is_null($dato)) {
  59.         $bandera = false;
  60.         break;
  61.     }
  62.  
  63. if ($bandera)
  64.     //Guardamos los datos del formulario en la Base de datos
  65.     if ($miConsulta->guardarForm($miConexion->conexion, $datos))
  66.         echo "Los datos han sido guardados satisfactoriamente";
  67.     else
  68.         echo "Ha ocurrido un error al intentar guardar los datos";
  69. ?>

La validación (del lado del servidor) la realizo de este modo:
Código PHP:
Ver original
  1. <?php
  2. class Cls_Scripts {
  3.     public $codigo;
  4.     public $respuesta;
  5.  
  6.     function formulario($mensaje) {
  7.         echo $mensaje ? $mensaje . "<br />" : "Se produjo un error durante el procesamiento de los datos";
  8.     }
  9.  
  10.     function codigo() {
  11.         $this->codigo = "";
  12.         for ($i = 0; $i < 10; $i++)
  13.             $this->codigo .= mt_rand(0, 9); //Genera un código de 10 dígitos aleatorios entre el 0 y el 9
  14.  
  15.         return $this->codigo;
  16.     }
  17.  
  18.     function validarNomApe($contenido) {
  19.         $exreg = "/^[A-ZÁÉÍÓÚÑÜ]+[a-záéíóúÜüÑñA-ZÁÉÍÓÚ\.' ]{2,150}$/si";
  20.         return preg_match($exreg, $contenido) ? $contenido : NULL;
  21.     }
  22.  
  23.     function validarEMail($contenido) {
  24.         $exreg = "/^([\w_\.-]+)@([\w\.-]+)\.([a-z\.]{2,6})$/si";
  25.         return preg_match($exreg, $contenido) ? $contenido : NULL;
  26.     }
  27.  
  28.     function validarDomicilio($contenido) {
  29.         $exreg = "/^[\<\>\\\{\}\[\]]*$/";
  30.         return !preg_match($exreg, $contenido) ? $contenido : NULL;
  31.     }
  32.  
  33.     function validarFechNac($contenido) {
  34.         $exreg = "/\d{4}-\d{2}-\d{2}/";
  35.         $this->respuesta = true;
  36.  
  37.         if (preg_match($exreg, $contenido)) { //Si el formato de fecha es válido
  38.             list($year, $month, $day) = explode("-", $contenido);          
  39.             $bandera; //Comodín para la verificación del mes (cuando no es Febrero)
  40.             if (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0) { //Año bisiesto
  41.                 if ($month == 2 && !($day <= 29 && $day > 0)) //Febrero
  42.                     $this->respuesta = false;
  43.                 else //Año no bisiesto
  44.                     if ($month == 2 && !($day <= 29 && $day > 0)) //Febrero
  45.                         $this->respuesta = false;
  46.  
  47.                 //Otros meses
  48.                 switch ($month) {
  49.                     case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  50.                         $bandera = 1;
  51.                     break;
  52.  
  53.                     case 4: case 6: case 9: case 11:
  54.                         $bandera = 2;
  55.                     break;
  56.                 }
  57.  
  58.                 //Si el mes tiene más de 31 o 30 días o si se ingresó una cantidad menor a 1
  59.                 if ($bandera == 1 && ($day > 31 || $day < 1))
  60.                     $this->respuesta = false;
  61.                 else if ($bandera == 2 && ($day > 30 || $day < 1))
  62.                     $this->respuesta = false;
  63.             }
  64.  
  65.         } else
  66.             $this->respuesta = false;
  67.  
  68.         return $this->respuesta ? $contenido : false;
  69.     }
  70.  
  71.     function validarPaisCiudad($contenido) {
  72.         $exreg = "/\d/";
  73.         return preg_match($exreg, $contenido) ? $contenido : NULL;
  74.     }
  75. }
  76. ?>
  #2 (permalink)  
Antiguo 06/11/2013, 02:49
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Respuesta: Problema al intentar guardar datos

Finalmente, el archivo que realiza las consultas a la BD:
Código PHP:
Ver original
  1. <?php
  2. class Cls_Consultas {
  3.     function paises($conexion) {
  4.         return mysqli_query($conexion, "CALL USP_listCountries()");
  5.     }
  6.  
  7.     function ciudades($conexion, $pais) {
  8.         return mysqli_query($conexion, sprintf("CALL USP_listCities(%d)", $pais));
  9.     }
  10.  
  11.     function codigo($conexion, $codigo) {
  12.         return mysqli_query($conexion, sprintf("CALL USP_validateCode('%s')", $codigo));
  13.     }
  14.  
  15.     function email($conexion, $email) {
  16.         $z = mysqli_query($conexion, sprintf("CALL USP_validateEmail('%s')", $email));
  17.         echo $z ? "¡Bien Email!" : "EMAIL " . mysqli_error($conexion) . "<br />";
  18.         return $z;
  19.     }
  20.  
  21.     function guardarForm($conexion, $datos) {  
  22.         $g = mysqli_query($conexion, sprintf("CALL USP_saveForm('%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
  23.                 $datos["codigo"],
  24.                 $datos["nombre"],
  25.                 $datos["apellidos"],
  26.                 $datos["email"],
  27.                 $datos["domicilio"],
  28.                 $datos["fechanac"],
  29.                 $datos["pais"],
  30.                 $datos["ciudad"]
  31.             ));
  32.         echo $g ? "¡Bien Guardar!" : "GUARDAR " . mysqli_error($conexion) . "<br />";
  33.         return $g;
  34.     }
  35. }
  36. ?>

La tabla de la BD en donde se deben de guardar los datos, fue creada así:
Código MySQL:
Ver original
  1. CREATE TABLE `datos` (
  2.     `codigo` VARCHAR(10) NOT NULL COLLATE 'utf8_unicode_ci',
  3.     `nombre` VARCHAR(150) NOT NULL COLLATE 'utf8_unicode_ci',
  4.     `apellidos` VARCHAR(150) NOT NULL COLLATE 'utf8_unicode_ci',
  5.     `email` VARCHAR(80) NOT NULL COLLATE 'utf8_unicode_ci',
  6.     `domicilio` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
  7.     `fechanac` DATE NOT NULL,
  8.     `pais` INT(11) NOT NULL,
  9.     `ciudad` INT(11) NOT NULL,
  10.     PRIMARY KEY (`codigo`)
  11. )
  12. COLLATE='utf8_unicode_ci'
  13. ENGINE=MyISAM;

Y el PA con el que tengo el problema es este:
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_saveForm`(IN `code` VARCHAR(10), IN `name` VARCHAR(150), IN `lastname` VARCHAR(150), IN `email` VARCHAR(80), IN `address` VARCHAR(255), IN `birthdate` DATE, IN `country` INT, IN `city` INT)
  2.     CONTAINS SQL
  3.     COMMENT ''
  4. INSERT INTO datos VALUES (code, name, lastname, mail, address, birthdate, country, city)

He probado imprimiendo los datos antes y después de enviarlos y se muestran bien, los datos están completos y en orden, del mismo modo en que está especificado en la estructura del PA. La conexión también es correcta (de otro modo, los demás PA fallarían y no se llenarían los combos con los datos respectivos), el problema ocurre al intentar guardar los datos, utilizando la función mysqli_errno(), se muestra el código de error 2014 de descripción "Commands out of sync; you can't run this command now"; me extraña que este sea el único PA que esté fallando, aparentemente la sintaxis es correcta.

Antes de que alguien me lo pida, este es el archivo de conexión a la BD:
Código PHP:
Ver original
  1. <?php
  2. class Cls_Conexion {
  3.     public $conexion;
  4.  
  5.     function __construct() {
  6.         $this->conexion = false;
  7.     }
  8.  
  9.     function conectar() {
  10.         //Conexión a la base de datos
  11.         $servidor = "localhost"; //Nombre del servidor
  12.         $usuario = "root"; //Nombre de usuario en tu servidor
  13.         $password = "phpdeveloper"; //Contraseña del usuario
  14.         $base = "bd_formulario"; //Nombre de la Base de Datos
  15.  
  16.         //Se realiza la conexión
  17.         $this->conexion = mysqli_connect($servidor, $usuario, $password) or die ("Error al conectarse al servidor");
  18.  
  19.         //Si se logra realizar la conexión a la Base de Datos
  20.         if ($this->conexion)
  21.             //Se selecciona la base de datos con la que se trabajará
  22.             mysqli_select_db($this->conexion, $base) or die ("Error al conectarse a la base de datos");
  23.  
  24.         return $this->conexion;
  25.     }
  26.    
  27.     function __destruct() {
  28.         mysqli_close($this->conexion);
  29.     }
  30. }
  31. ?>

Estoy utilizando el AppServ 2.5.10, que contiene lo siguiente:
  • Apache 2.2.8
  • PHP 5.2.6
  • MySQL 5.0.51b
  • phpMyAdmin-2.10.3

Acudo a ustedes para que por favor me den una mano con esto, quizá alguno de ustedes puede ver el error que no logro divisar. Gracias de antemano.
  #3 (permalink)  
Antiguo 06/11/2013, 02:52
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Post-Data: Intenté ingresar los datos desde HeidiSQL haciendo uso del PA y no hubieron problemas, los datos se insertaron sin inconvenientes, lo mismo pasa cuando en phpMyadmin, inserto datos con un INSERT, pareciera que los datos no llegan al PA para su procesamiento, pero en la impresión previa de datos, se muestran bien.

Las funciones email() y guardarForm(), a diferencia de las otras funciones, tienen esa estructura pues con ambas se presentaron problemas y quise ver cuál era el error mediante un mensaje con la función mysqli_error(), pero tanto de esa forma como retornando directamente la respuesta del PA, la situación sigue siendo la misma.

Última edición por Triby; 07/11/2013 a las 03:30 Razón: Combinar mensajes
  #4 (permalink)  
Antiguo 06/11/2013, 03:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: Problema al intentar guardar datos

Ya se que no te estoy contestando pero:

Por que usas PA para ejecutar querys simples?

PHP te ofrece la posibilidad de ejecutar una query... sea SELECT, INSERT, UPDATE, DELETE o lo que sea...


Código PHP:
Ver original
  1. function guardarForm($conexion, $datos) {  
  2.         $g = mysqli_query($conexion, sprintf("INSERT INTO datos (code, name, lastname, mail, address, birthdate, country, city) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
  3.                 $datos["codigo"],
  4.                 $datos["nombre"],
  5.                 $datos["apellidos"],
  6.                 $datos["email"],
  7.                 $datos["domicilio"],
  8.                 $datos["fechanac"],
  9.                 $datos["pais"],
  10.                 $datos["ciudad"]
  11.             ));
  12.         echo $g ? "¡Bien Guardar!" : "GUARDAR " . mysqli_error($conexion) . "<br />";
  13.         return $g;
  14.     }

Si la haces mas general serviria para cualquier form....


Código PHP:
Ver original
  1. $Sql=sprintf("INSERT INTO datos (code, name, lastname, mail, address,  birthdate, country, city) VALUES ('%s', '%s', '%s', '%s', '%s', '%s',  %d, %d)",
  2.                 $datos["codigo"],
  3.                 $datos["nombre"],
  4.                 $datos["apellidos"],
  5.                 $datos["email"],
  6.                 $datos["domicilio"],
  7.                 $datos["fechanac"],
  8.                 $datos["pais"],
  9.                 $datos["ciudad"]
  10.             );

$datos puede ser $_POST o $_GET....


Código PHP:
Ver original
  1. function guardarForm($conexion, $Sql) {  
  2.         $g = mysqli_query($conexion, $Sql));
  3.         echo $g ? "¡Bien Guardar!" : "GUARDAR " . mysqli_error($conexion) . "<br />";
  4.         return $g;
  5.     }
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 06/11/2013 a las 03:57
  #5 (permalink)  
Antiguo 06/11/2013, 12:44
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Respuesta: Problema al intentar guardar datos

Uso PA porque es la manera más eficiente de realizar acciones en la BD, de este modo, el ordenador del usuario evitará realizar el proceso que sin problemas puede realizar el servidor. Esto lo proyecto a una escala más grande, por ejemplo, cuando se manejan grandes cantidades de datos, aunque claro, en esos casos quizá debería de trabajar con un gestor de BD más robusto y potente, pero a fin de cuentas, usaría los PA sin importar el gestor de BD que use.

Por cierto (se me olvidó mencionarlo), intentando resolver el problema, utilicé queries simples como las que mencionas, pero el resultado es exactamente el mismo.
  #6 (permalink)  
Antiguo 07/11/2013, 00:57
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Respuesta: Problema al intentar guardar datos

Intentando resolver esto, probé realizando una nueva conexión a la BD en la función que invoca al PA que guarda los datos y de esa forma sí funciona, aquí está el código:

Código PHP:
Ver original
  1. <?php
  2. function guardarForm($conexion, $datos) {
  3.     //Conexión a la base de datos
  4.     $servidor = "localhost"; //Nombre del servidor
  5.     $usuario = "root"; //Nombre de usuario en tu servidor
  6.     $password = "phpdeveloper"; //Contraseña del usuario
  7.     $base = "bd_formulario"; //Nombre de la Base de Datos
  8.  
  9.     //Se realiza la conexión
  10.     $conexion2 = mysqli_connect($servidor, $usuario, $password) or die ("Error al conectarse al servidor");
  11.  
  12.     //Si se logra realizar la conexión a la Base de Datos
  13.     if ($conexion2)
  14.         //Se selecciona la base de datos con la que se trabajará
  15.         mysqli_select_db($conexion2, $base) or die ("Error al conectarse a la base de datos");
  16.        
  17.     return mysqli_query($conexion2, sprintf("CALL USP_saveForm('%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
  18.             $datos["codigo"],
  19.             $datos["nombre"],
  20.             $datos["apellidos"],
  21.             $datos["email"],
  22.             $datos["domicilio"],
  23.             $datos["fechanac"],
  24.             $datos["pais"],
  25.             $datos["ciudad"]
  26.         ));
  27. }
  28. ?>

Pareciera que el problema es con la variable de conexión, sin embargo, como podrán apreciar en los bloques de código que detallé antes, las otras funciones reciben la misma variable de conexión y las consultas con los PA se realizan de forma exitosa, para comprobarlo, imprimí los resultados de cada consulta y se mostraron los datos que pedí.

En el código del archivo procesar.php que detallo al inicio de este tema, envío a la función guardarForm() el archivo de conexión y el array con los datos, imprimí los datos dentro de la función, antes del llamado al PA y se mostraron todos, incluso probé con la siguiente línea para saber si el archivo de conexión llegaba bien:

Código PHP:
Ver original
  1. <?php
  2. echo $conexion ? "Bien" : "Mal";
  3. ?>

La línea de código anterior siempre imprime "Bien", mientras que cuando imprimo la variable de conexión con la función var_dump(), el resultado es "object(mysqli)#2 (0) { }", imagino que es porque no contiene valores, lo mismo se imprime si coloco esa línea de código en el mismo archivo de conexión.

¿Alguien tiene idea de qué pueda estar sucediendo?
  #7 (permalink)  
Antiguo 07/11/2013, 01:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: Problema al intentar guardar datos

Cita:
Uso PA porque es la manera más eficiente de realizar acciones en la BD, de este modo, el ordenador del usuario evitará realizar el proceso que sin problemas puede realizar el servidor.
Sabes que php se ejecuta en el servidor no en la maquina cliente.

Por otro lado, en ninguna parte del codigo que mandas se ve como mantienes la session si esta no se mantiene abierta es normal que debas reconectar con la bbdd para hacer la insercion.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 07/11/2013, 02:22
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Definitivamente escribí algo totalmente errado, se que PHP se ejecuta del lado del servidor, fue un lapsus. Pero para justificar el uso de los PA, me apoyo en que estoy haciendo este trabajo en capas, intento trabajar esto en 3 capas y es por esa razón que trato de mantener las capas de presentación, negocio y datos por separado, insertando sentencias SQL dentro de la capa de negocio, se rompería ese esquema.

Por otro lado, dentro de procesar.php que es el archivo que invoca a la función la cual llama al PA, se encuentra incluido el archivo de conexión, desde éste archivo (procesar.php) llamo a 3 PA: el primero que verifica si el código generado existe en la BD, el segundo que realiza lo mismo pero con el email y el tercero que envía los datos para guardarlos. Solamente el primero funciona, extrañamente el segundo (el del E-Mail) y el tercero (para guardar los datos en la BD) tienen este problema.

Siguiendo con las pruebas intentando solucionar esto, he deshabilitado las llamadas a las funciones que invocan a los PA que validan el código y el email, haciendo esto, la llamada a la función guardarForm() se convierte en la única de la clase Cls_Consultas() (cuyo código detallé en comentarios anteriores) y el proceso de guardado de datos se completa satisfactoriamente, sin necesidad de realizar otra conexión a la BD desde dicha función. Sin embargo, necesito validar que el código genero y el email ingresado no se encuentren registrados en la BD, por lo que tengo que volver a habilitar a ambas llamadas y es ahí cuando ocurre el problema.

Última edición por Triby; 07/11/2013 a las 03:30 Razón: Combinar mensajes
  #9 (permalink)  
Antiguo 07/11/2013, 03:29
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.976
Antigüedad: 11 años, 3 meses
Puntos: 2191
Respuesta: Problema al intentar guardar datos

'Pos yo creo que tus conceptos están un tanto errados, porque:

1- Si estas usando clases, no es necesario que pases $conexion como parámetro a cada método de la misma, lo más conveniente es establecer la conexión desde el constructor y crear la propiedad correspondiente, algo como $this->conexion = bla bla bla;

2- Ciertamente no deberías tener consultas SQL en el controlador (capa de negocio), solamente en el modelo (capa de datos) y es tan fácil como crear los métodos apropiados en el modelo, ejemplo:

personas.php
Código PHP:
Ver original
  1. class personas {
  2.       private $conexion;
  3.       public function __construct($conexion) {
  4.              $this->conexion = $conexion;
  5.       }
  6.       public function insert($dato1, $dato2, $etc) {
  7.              $result = mysqli_query($conexion2, sprintf("CALL USP_saveForm('%s', '%s', '%s')", $dato1, $dato2, $etc)) or die('Error en consulta');
  8.              // Si necesitas retornar algo, en $result tendrás varias opciones
  9.       }
  10. }

Negocio.php
Código PHP:
Ver original
  1. $conexion = new conexionABaseDeDatosFavorita();
  2.  
  3. $persona = new personas($conexion);
  4. $persona->insert('Pablo', 'Picasso', 'España');

3- Porqué si estás manejando clases/objetos usas mysqli por procedimientos?

4- Yo tampoco veo la necesidad de los PA.

5- Por favor deja de publicar mensajes seguidos, es contra las políticas de FDW y siempre puedes editar tu último mensaje si no hay respuestas posteriores.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 07/11/2013, 03:48
Avatar de Alexis88
Objetivista
 
Fecha de Ingreso: noviembre-2011
Ubicación: Lima, Perú
Mensajes: 5.431
Antigüedad: 8 años, 1 mes
Puntos: 930
Respuesta: Problema al intentar guardar datos

Disculpa por los mensajes sucesivos, solamente intentaba informar sobre lo que estuve haciendo.

En cuanto a tu primer punto, también había pensado en lo mismo sino que como incluyo el archivo de conexión en otros archivos para hacer consultas a las BD, quise mantener ese bloque de código (el del archivo de conexión) en un archivo separado.

Ciertamente, estoy más familiarizado con el estilo por procedimientos de Mysqli que con el orientado a objetos, aunque claro, debería de usar esa forma ya que estoy programando con clases. Voy a tomar en cuenta eso.

Y con respecto a los PA, pues lo mismo que le dije a quimfv, quiero mantener el esquema de capas, además de que esto es solo la base de otro proyecto, es decir, realizaré más inserciones/actualizaciones/consultas a la BD más extensas que las presentadas en este tema, por lo que creo conveniente el uso de los PA por cuestiones de eficiencia y rendimiento.

Actualización del 9 de Noviembre del 2013:

Amigos, luego de varias pruebas, pude dar con la solución, lo único que tuve que hacer fue asignar a una variable el valor devuelto por la función que verifica que el E-Mail no se encuentre ya registrado en la BD.

Código PHP:
Ver original
  1. <?php
  2. //E-Mail
  3. $email = (strlen($_POST["email"]) && isset($_POST["email"]) && !is_null($_POST["email"])) ? $scripts->validarEMail($desinfectar->sanitize($miConexion->conexion, $_POST["email"])) : $scripts->formulario();
  4.  
  5. if (is_null($email))
  6.     $scripts->formulario("Debe de ingresar su E-Mail en un formato válido");
  7. else if ($verificarEmail = $miConsulta->email($email)) { // <-- Esta es la línea del cambio
  8.     $scripts->formulario("El E-Mail ingresado se encuentra registrado. Por favor, ingrese otro.");
  9.     $email = NULL;
  10. }
  11. ?>

Parece ser que se realizaba una clausura al objeto que realiza las llamadas a los PA. Por cierto, apliqué el consejo de Triby de usar el estilo orientado a objetos de Mysqli, para lo cual tuve que hacer pequeñísimos cambios, además de pasar la variable de conexión al constructor de la clase Cls_Consultas y así no tener que pasarla en cada llamada a los métodos de la clase.

Saludos y gracias por sus comentarios, siempre se aprende algo nuevo cada día.

Última edición por Alexis88; 12/11/2013 a las 11:57 Razón: He encontrado la solución del problema

Etiquetas: mysql, procedimientos
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 01:17.