Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con conexión a BD y clases

Estas en el tema de Problema con conexión a BD y clases en el foro de PHP en Foros del Web. Hola amigos del foro, hace unas semanas, publiqué un hilo acerca del problema del que trataré ahora, en aquel momento creí que lo había solucionado, ...
  #1 (permalink)  
Antiguo 20/11/2013, 15:34
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Problema con conexión a BD y clases

Hola amigos del foro, hace unas semanas, publiqué un hilo acerca del problema del que trataré ahora, en aquel momento creí que lo había solucionado, pero después de analizar bien todo y realizar múltiples pruebas, comprobé que no fue así.

Sucede lo siguiente:

Tengo un formulario de datos, los cuales envío a un archivo que invoca a cuatro clases: para la conexión, para desinfectar los datos (XSS, SQL Injection), para validarlos (que los datos respeten el formato) y para guardarlos en la BD (esta clase también realiza otras consultas).

El problema se suscita cuando intento utilizar más de 1 método de la clase de guarda los datos, el código de ese archivo es el siguiente:
Código PHP:
Ver original
  1. <?php
  2. //Incluimos el archivo de conexión a la Base de datos y nos conectamos
  3. include("conexion.php");
  4. $miConexion = new Cls_Conexion();
  5.  
  6. //Incluimos el archivo de seguridad de datos
  7. include("seguridad.php");
  8. $desinfectar = new Cls_Desinfeccion();
  9.  
  10. //Incluimos el archivo de consultas a la Base de datos
  11. include("consultas.php");
  12. $miConsulta = new Cls_Consultas($miConexion->conexion);
  13.  
  14. //Incluimos el archivo de scripts PHP
  15. include("scripts.php");
  16. $scripts = new Cls_Scripts();
  17.  
  18. //Código
  19. $codigo = $scripts->codigo();
  20. $verificarCodigo = $miConsulta->codigo($codigo);
  21. if ($verificarCodigo->num_rows) {
  22.     do {
  23.         $codigo = $scripts->codigo();
  24.         $verificarCodigo = $miConsulta->codigo($codigo);
  25.     } while ($verificarCodigo = $miConsulta->codigo($codigo));
  26.     $verificarCodigo->free();
  27. }
  28.  
  29. //Nombre
  30. $nombre = (strlen($_POST["nombre"]) && isset($_POST["nombre"]) && !is_null($_POST["nombre"])) ? $scripts->validarNomApe($desinfectar->sanitize($miConexion->conexion, $_POST["nombre"])) : $scripts->formulario();
  31. if (is_null($nombre)) $scripts->formulario("Debe de ingresar su nombre en un formato válido");
  32.  
  33. //Apellidos
  34. $apellidos = (strlen($_POST["apellidos"]) && isset($_POST["apellidos"]) && !is_null($_POST["apellidos"])) ? $scripts->validarNomApe($desinfectar->sanitize($miConexion->conexion, $_POST["apellidos"])) : $scripts->formulario();
  35. if (is_null($apellidos)) $scripts->formulario("Debe de ingresar sus apellidos en un formato válido");
  36.  
  37. //E-Mail
  38. $email = (strlen($_POST["email"]) && isset($_POST["email"]) && !is_null($_POST["email"])) ? $scripts->validarEMail($desinfectar->sanitize($miConexion->conexion, $_POST["email"])) : $scripts->formulario();
  39. if (is_null($email))
  40.     $scripts->formulario("Debe de ingresar su E-Mail en un formato válido");
  41. else {
  42.     $verificarEmail = $miConsulta->email($email);
  43.     if ($verificarEmail->num_rows) {
  44.         $scripts->formulario("El E-Mail ingresado se encuentra registrado. Por favor, ingrese otro.");
  45.         $email = NULL;
  46.         $verificarEmail->free();
  47.     }
  48. }
  49.  
  50. //Domicilio
  51. $domicilio = (strlen($_POST["domicilio"]) && isset($_POST["domicilio"]) && !is_null($_POST["domicilio"])) ? $scripts->validarDomicilio($desinfectar->sanitize($miConexion->conexion, $_POST["domicilio"])) : $scripts->formulario();
  52. if (is_null($domicilio)) $scripts->formulario("Debe de ingresar su dirección domiciliaria en un formato válido y utilizando menos de 256 caracteres");
  53.  
  54. //Fecha de nacimiento
  55. $fechanac = (strlen($_POST["fechanac"]) && isset($_POST["fechanac"]) && !is_null($_POST["fechanac"])) ? $scripts->validarFechNac($desinfectar->sanitize($miConexion->conexion, $_POST["fechanac"])) : $scripts->formulario();
  56. if (is_null($fechanac)) $scripts->formulario("Debe de ingresar la fecha de su nacimiento en un formato válido");
  57.  
  58. //País
  59. $pais = (strlen($_POST["pais"]) && isset($_POST["pais"]) && !is_null($_POST["pais"])) ? $scripts->validarPaisCiudad($desinfectar->sanitize($miConexion->conexion, $_POST["pais"])) : $scripts->formulario();
  60. if (is_null($pais)) $scripts->formulario("Debe de elegir un país de la lista");
  61.  
  62. //Ciudad
  63. $ciudad = (strlen($_POST["ciudad"]) && isset($_POST["ciudad"]) && !is_null($_POST["ciudad"])) ? $scripts->validarPaisCiudad($desinfectar->sanitize($miConexion->conexion, $_POST["ciudad"])) : $scripts->formulario();
  64. if (is_null($ciudad)) $scripts->formulario("Debe de elegir una ciudad de la lista");
  65.  
  66. //Añadimos todos los datos a un array que será enviado a la función de procesamiento de datos
  67. $datos = array(
  68.             "codigo" => $codigo,
  69.             "nombre" => $nombre,
  70.             "apellidos" => $apellidos,
  71.             "email" => $email,
  72.             "domicilio" => $domicilio,
  73.             "fechanac" => $fechanac,
  74.             "pais" => $pais,
  75.             "ciudad" => $ciudad
  76.         );
  77.        
  78. $bandera = true; //Comodín para determinar si se guardarán o no los datos
  79. foreach ($datos as $dato)
  80.     if (is_null($dato)) {
  81.         $bandera = false;
  82.         break;
  83.     }
  84.  
  85. if ($bandera)
  86.     //Guardamos los datos del formulario en la Base de datos
  87.     if ($miConsulta->guardarForm($datos))
  88.         echo "Los datos han sido guardados satisfactoriamente";
  89.     else
  90.         echo "Ha ocurrido un error al intentar guardar los datos";
  91. ?>

La conexión la realizo de esta forma:
Código PHP:
Ver original
  1. <?php
  2. class Cls_Conexion {
  3.     public $conexion;
  4.  
  5.     function __construct() {
  6.         //Conexión a la base de datos
  7.         $servidor = "localhost"; //Nombre del servidor
  8.         $usuario = "root"; //Nombre de usuario en tu servidor
  9.         $password = "miclave"; //Contraseña del usuario
  10.         $base = "bd_formulario"; //Nombre de la Base de Datos
  11.  
  12.         //Se realiza la conexión
  13.         return $this->conexion = new mysqli($servidor, $usuario, $password, $base) or exit("Se ha producido un error en la conexión al servidor");
  14.     }
  15.  
  16.     function __destruct() {
  17.         $this->conexion->close();
  18.     }
  19. }
  20. ?>

Y la clase que contiene los métodos que realizan consultas a la BD es el siguiente:
Código PHP:
Ver original
  1. <?php
  2. class Cls_Consultas {
  3.     public $conexion;
  4.  
  5.     function __construct($conex) {
  6.         $this->conexion = $conex;
  7.     }
  8.  
  9.     function paises() {
  10.         return $this->conexion->query("CALL USP_listCountries()");
  11.     }
  12.  
  13.     function ciudades($pais) {
  14.         return $this->conexion->query(sprintf("CALL USP_listCities(%d)", $pais));
  15.     }
  16.  
  17.     function codigo($codigo) {
  18.         return $this->conexion->query(sprintf("CALL USP_validateCode('%s')", $codigo));
  19.     }
  20.  
  21.     function email($email) {       
  22.         return $this->conexion->query(sprintf("CALL USP_validateEmail('%s')", $email));
  23.     }
  24.  
  25.     function guardarForm($datos) {
  26.         return $this->conexion->query(sprintf("CALL USP_saveForm('%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
  27.                 $datos["codigo"],
  28.                 $datos["nombre"],
  29.                 $datos["apellidos"],
  30.                 $datos["email"],
  31.                 $datos["domicilio"],
  32.                 $datos["fechanac"],
  33.                 $datos["pais"],
  34.                 $datos["ciudad"]
  35.             ));
  36.     }
  37. }
  38. ?>

Luego de varias pruebas, he notado que el problema se da luego de la llamada al método codigo con el que genero un código numérico aleatorio, ese bloque se ejecuta sin problemas, incluso probé insertando una línea de impresión antes del bucle Do-While para ver si de verdad estaba trabajando el método y no me mostró la impresión, con lo cual, comprobé que todo marchaba bien con dicho método, sin embargo, cuando intento llamar a los métodos email (con el que busco en la BD si ya se registró un email como el ingresado en el formulario) y guardarForm (para guardar los datos en la BD), el método email no muestra el mensaje de advertencia aún cuando ingreso un email existente en la BD y luego de ejecutar el método guardarForm, se muestra el segundo mensaje que predeterminé para cuando ocurra un problema al intentar guardar los datos.

Ambos métodos invocan a dos procedimientos almacenados cada uno, que, realiza una consulta en la BD y guarda los datos, respectivamente. He probado colocando queries sencillas como INSERT INTO... o SELECT * FROM..., pero el resultado es exactamente el mismo, incluso probé invocando a otro método, como paises para mostrar la lista de países en la BD, pero tampoco funciona, sin embargo, he probado creando una nueva instancia tanto para la conexión a la BD como para la clase de consultas antes de invocar a los dos métodos restantes (email y guardarForm) y de este modo sí funciona:
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. if (is_null($email))
  5.     $scripts->formulario("Debe de ingresar su E-Mail en un formato válido");
  6. else {
  7.     $miConexion2 = new Cls_Conexion();
  8.     $miConsulta2 = new Cls_Consultas($miConexion2->conexion);
  9.  
  10.     $verificarEmail = $miConsulta2->email($email);
  11.     if ($verificarEmail->num_rows) {
  12.         $scripts->formulario("El E-Mail ingresado se encuentra registrado. Por favor, ingrese otro.");
  13.         $email = NULL;
  14.         $verificarEmail->free();
  15.     }
  16. }
  17.  
  18. //Aquí va el resto del código hasta antes del guardado de datos
  19.  
  20. if ($bandera) {
  21.     $miConexion3 = new Cls_Conexion();
  22.     $miConsulta3 = new Cls_Consultas($miConexion3->conexion);
  23.  
  24.     //Guardamos los datos del formulario en la Base de datos
  25.     if ($miConsulta3->guardarForm($datos))
  26.         echo "Los datos han sido guardados satisfactoriamente";
  27.     else
  28.         echo "Ha ocurrido un error al intentar guardar los datos";
  29. }
  30. ?>

Instancias a ambas clases antes de cada llamada a los métodos, todo marcha bien, incluso el método email muestra el mensaje de advertencia cuando se ingresa un email existente.

Mi pregunta es, ¿por qué tengo que instanciar dos veces a los métodos de conexión y consultas para que todo marche bien?

Saludos y, de antemano, gracias por la deferencia.

P.D.: El enlace que puse al inicio, los redirigirá al hilo que publiqué hace unas semanas sobre este tema, ahí podrán tener más detalles del código, aunque el problema se centra en lo que muestre en éste.
  #2 (permalink)  
Antiguo 20/11/2013, 15:54
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 8 meses
Puntos: 96
Respuesta: Problema con conexión a BD y clases

Siempre que.he visto a alguien trabajar con clases utiliza require_once en vez.de include, puede que nada tenga que.ver con tu problema
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #3 (permalink)  
Antiguo 20/11/2013, 17:03
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con conexión a BD y clases

Cita:
Iniciado por xSkArx Ver Mensaje
Siempre que.he visto a alguien trabajar con clases utiliza require_once en vez.de include, puede que nada tenga que.ver con tu problema
Claro, no tiene nada que ver porque su función es prácticamente la misma, además, hubiera tenido problemas con las cuatro clases que incluyo. El problema se da luego de invocar al primero de los tres métodos que uso, pareciera que luego de invocarlo, se clausurara la instancia a la clase, mas no la conexión porque, como verás en el código, utilizo la variable de conexión para invocar métodos de otras clases, todas ellas sin problema alguno (las probé una por una).

Última edición por Alexis88; 21/11/2013 a las 00:10
  #4 (permalink)  
Antiguo 29/11/2013, 12:53
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con conexión a BD y clases

¿Será correcto que instancie a la clase y a la conexión para cada vez que vaya a utilizar un método de la clase o estoy fallando en algo?, pues solo así funciona.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 29/11/2013, 13:36
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema con conexión a BD y clases

Yo te recomendaría dos cosas.
Las clases que no necesiten atributos, declararas estáticas con métodos estáticos. Así no necesitarás instanciarlas, podrás usar sus métodos directamente con:

Código PHP:
Ver original
  1. MiClase::metodoEstatico();


Es difícil adivinar qué error está ocurriendo. Prueba una cosa. Comenta las consultas una a una, y ejecuta tu código, para ver cuál es la que está matando la conexión.
por ejemplo, para empezar, comenta toda la validación y desinfección de código. Pon directamente $codigo="ABC012"; Y ejecuta una vez.
Si el resto de validaciones funciona, la culpa la tiene el procedimiento almacenado que ejecuta código.
Si sigue fallando, comenta otro campo más, por ejemplo email, y pon uno a pelo, como con el código.

Hazlo así hasta que compruebes exactamente quién está matando la conexión.
  #6 (permalink)  
Antiguo 29/11/2013, 22:48
 
Fecha de Ingreso: diciembre-2012
Mensajes: 178
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Problema con conexión a BD y clases

Código PHP:
Ver original
  1. ini_set("display_errors", 1);
implementa esto y publica que errores te tira
__________________
clasificados nunca se sabe todo
  #7 (permalink)  
Antiguo 30/11/2013, 12:53
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con conexión a BD y clases

marlanga, seguí tu consejo, deshabilité las validaciones y desinfecciones y coloqué datos de forma directa, lo mismo con el código que se autogeneraba con un métdo de la clase Cls_Consultas(). Obtuve exactamente los mismos resultados que en las pruebas que había realizado antes de publicar este hilo: Basta con que utilice un método de la clase, para que, después de usarlo satisfactoriamente, la instancia se pierda. En este caso, sucedió con el método email(), pero lo mismo sucedía con el método que generaba el código.

Esta es la clase con los métodos:

Código PHP:
Ver original
  1. <?php
  2. class Cls_Consultas {
  3.     public $conexion;
  4.  
  5.     function __construct($conex) {
  6.         $this->conexion = $conex;
  7.     }
  8.  
  9.     function paises() {
  10.         return $this->conexion->query("CALL USP_listCountries()");
  11.     }
  12.  
  13.     function ciudades($pais) {
  14.         return $this->conexion->query(sprintf("CALL USP_listCities(%d)", $pais));
  15.     }
  16.  
  17.     function codigo($codigo) {
  18.         return $this->conexion->query(sprintf("CALL USP_validateCode('%s')", $codigo));
  19.     }
  20.  
  21.     function email($email) {        
  22.         return $this->conexion->query(sprintf("CALL USP_validateEmail('%s')", $email));
  23.     }
  24.  
  25.     function guardarForm($datos) {
  26.         return $this->conexion->query(sprintf("CALL USP_saveForm('%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
  27.                 $datos["codigo"],
  28.                 $datos["nombre"],
  29.                 $datos["apellidos"],
  30.                 $datos["email"],
  31.                 $datos["domicilio"],
  32.                 $datos["fechanac"],
  33.                 $datos["pais"],
  34.                 $datos["ciudad"]
  35.             ));
  36.     }
  37. }
  38. ?>

Y esos son los procedimientos almacenados críticos:

Código MySQL:
Ver original
  1. /* PA que verifica que el código no se encuentre registrado */
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_validateCode`(IN `code` VARCHAR(10))
  4.     CONTAINS SQL
  5.     COMMENT ''
  6. SELECT codigo FROM datos WHERE codigo = code
  7.  
  8.  
  9. /* PA que verifica que el email ingresado, no se encuentre registrado */
  10.  
  11. CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_validateEmail`(IN `mail` VARCHAR(80))
  12.     CONTAINS SQL
  13.     COMMENT ''
  14. SELECT email FROM datos WHERE email = mail
  15.  
  16. /* PA que guarda los datos del formulario en la BD luego de todas las validaciones */
  17.  
  18. CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_saveForm`(IN `codigo` VARCHAR(10), IN `nombre` VARCHAR(150), IN `apellidos` VARCHAR(150), IN `email` VARCHAR(80), IN `domicilio` VARCHAR(255), IN `fechanac` DATE, IN `pais` INT(11), IN `ciudad` INT(11))
  19.     CONTAINS SQL
  20.     COMMENT ''
  21. INSERT INTO datos VALUES (codigo, nombre, apellidos, email, domicilio, fechanac, pais, ciudad)

Hay otros dos PA que utilizo en otros archivos, con ellos no tuve problemas pues solamente invoco a uno de los métodos de la clase, por cada archivo, sin embargo, si, por ejemplo, intento listar los datos de una tabla invocando otro método, que a su vez, invoca a un PA, éste no se ejecuta, produciéndose el mismo problema que con los otros 3 métodos en cuestión.

En síntesis, cuando invoco a un método de la clase, funciona sin problemas, pero si, en el mismo archivo, invoco a otro método o al mismo nuevamente, no funcionan por el problema que les expliqué. Como verán en el código, instancio a otras tres clases, de las cuales, utilizo más de una vez a los métodos de dos de ellas y no se produce el problema que ocurre con la clase que interactúa con la BD.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #8 (permalink)  
Antiguo 30/11/2013, 13:16
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema con conexión a BD y clases

Prueba a hacer un

$miConexion->conexion->next_result();

Justo despues de ejecutar un procedimiento almacenado, despues de recuperar todos los datos necesarios, y antes de ejecutar el siguiente call.

Por ejemplo, en el codigo (2 lineas nuevas):
Código PHP:
Ver original
  1. //Código
  2. $codigo = $scripts->codigo();
  3. $verificarCodigo = $miConsulta->codigo($codigo);
  4. if ($verificarCodigo->num_rows) {
  5.     do {
  6.         $miConexion->conexion->next_result();
  7.         $codigo = $scripts->codigo();
  8.         $verificarCodigo = $miConsulta->codigo($codigo);
  9.     } while ($verificarCodigo = $miConsulta->codigo($codigo));
  10.     $verificarCodigo->free();
  11. }
  12. $miConexion->conexion->next_result();
  #9 (permalink)  
Antiguo 30/11/2013, 13:35
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema con conexión a BD y clases

Por otro lado, cuando yo quiero comprobar que un valor no existe en una base de datos antes de insertarlo, lo que hago es poner ese campo de la tabla con la restricción UNIQUE. Cuando ejecuto la insercción, compruebo si ha ocurrido un error, y sabiendo el número de error, sé lo que ha ocurrido y actúo en consecuencia. Y así, solo he ejecutado una insercción, en vez de un select y una insert (en tu peor caso, que es cuando el valor no está repetido).

EDIT: Este trozo de código no me gusta:
Código PHP:
Ver original
  1. //Código
  2. $codigo = $scripts->codigo();
  3. $verificarCodigo = $miConsulta->codigo($codigo);
  4. if ($verificarCodigo->num_rows) {
  5.     do {
  6.         $miConexion->conexion->next_result();
  7.         $codigo = $scripts->codigo();
  8.         $verificarCodigo = $miConsulta->codigo($codigo);
  9.     } while ($verificarCodigo = $miConsulta->codigo($codigo));
  10.     $verificarCodigo->free();
  11. }
  12. $miConexion->conexion->next_result();


Lo he cambiado a:
Código PHP:
Ver original
  1. //Código
  2. do {
  3.     $codigo = $scripts->codigo();
  4.     $verificarCodigo = $miConsulta->codigo($codigo);
  5.     $rows=$verificarCodigo = $miConsulta->codigo($codigo);
  6.     $verificarCodigo->free();
  7.     $miConexion->conexion->next_result();
  8. } while ($rows);

Última edición por marlanga; 30/11/2013 a las 13:47
  #10 (permalink)  
Antiguo 30/11/2013, 13:50
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con conexión a BD y clases

Eres grande, marlanga.

Imagino que el uso de next_result() se debe a que llamo a más de un PA en la misma instancia de conexión. Debo señalar que solamente hizo falta añadir dicha línea de código antes de invocar a cada un método, no después.

Saludos y gracias.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 30/11/2013, 13:53
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema con conexión a BD y clases

Lo sé, y muchos me odian por ello.

Hay que llamar después. Si llamas antes, lo que haces es que la primera vez que se ejecuta, no hace nada. Por el mismo motivo, después del último CALL tampoco hace falta usarlo, porque si no hay más calls, no hace falta.
  #12 (permalink)  
Antiguo 30/11/2013, 14:06
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con conexión a BD y clases

Claro, es que contesté antes de ver la segunda publicación que hiciste, es lo mismo que hice.

Una consulta más, me dices que a los campos de la tabla en donde no quiero valores repetidos, les coloque la restricción UNIQUE y ya cuando intente guardar los datos y se hayan ingresado datos que ya se encuentren en la BD, sabré qué error ocurrió por el número de error que se produzca. En esta inserción de datos, debo de comprobar que dos de ellos no se encuentren ya registrados, entonces, si se produce el error y solamente tengo el código de error, ¿cómo sabré cuál es el dato repetido?.

Gracias, nuevamente.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #13 (permalink)  
Antiguo 30/11/2013, 14:13
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problema con conexión a BD y clases

También te devuelve un mensaje de error, del que puedes extraer el campo donde ocurrió el error. Y creo que en el caso de que varias restricciones fallen, sólo te devuelve la primera que ocurre.
  #14 (permalink)  
Antiguo 30/11/2013, 14:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con conexión a BD y clases

Claro, sería cuestión de buscar en el mensaje de error, el nombre del campo.

Gracias, marlanga.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: clases, conexion
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 13:03.