Foros del Web » Programando para Internet » PHP »

Evitar registros duplicados-Clase

Estas en el tema de Evitar registros duplicados-Clase en el foro de PHP en Foros del Web. Como hago para este ejemplo Ejemplo de las FAQ meterlo en una clase. Quiero verificar si el codigo existe en la base de datos. Si ...
  #1 (permalink)  
Antiguo 09/03/2011, 20:10
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Evitar registros duplicados-Clase

Como hago para este ejemplo Ejemplo de las FAQ meterlo en una clase.

Quiero verificar si el codigo existe en la base de datos.
Si existe muestra un formulario y muestro el codigo.
Si no existe muestra el formulario.
  #2 (permalink)  
Antiguo 10/03/2011, 00:27
Avatar de JoseTejada  
Fecha de Ingreso: diciembre-2007
Ubicación: Peru.Lima.Cercado.MDuarez.Granaderos172
Mensajes: 218
Antigüedad: 16 años, 4 meses
Puntos: 11
Respuesta: Evitar registros duplicados-Clase

Código PHP:
$usuario "";
$nombres "";
$apellido "";
$fecha_nac "";
//se supone que ya hay conexion...
busquedamysql_query("SELECT usuario,nombres,apellidos,fecha_nac FROM tabla WHERE usuario='$user'");
if(
mysql_num_rows($busqueda)>0) { // ó " !=0 " como se quiera ver 
      
$reg mysql_fetch_array($busqueda);
      
$usuario =$reg["usuario"]; 
      
$nombres =$reg["nombres"]; 
      
$apellido $reg["apellidos"];
      
$fecha_nac $reg["fecha_nac"];

En el formulario...

Código PHP:
<form action="">
Usuario : <input type="text" name="usuario" value="<?=$usuario?>"><br />
Nombre : <input type="text" name="nombres" value="<?=$nombres?>"><br />
Apellidos : <input type="text" name="apellidos" value="<?=$apellidos?>"><br />
Fecha Nac. : <input type="text" name="fechaNac" value="<?=$fecha_nac?>"><br />
</form>
Algo así...
__________________
Un poco de Karmita no te va a hacer a ti pobre ni a mi rico... colabórame px ;)... Twitter: @josetejadauch
  #3 (permalink)  
Antiguo 10/03/2011, 22:07
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Evitar registros duplicados-Clase

Cita:
Iniciado por JoseTejada Ver Mensaje
Código PHP:
$usuario "";
$nombres "";
$apellido "";
$fecha_nac "";
//se supone que ya hay conexion...
busquedamysql_query("SELECT usuario,nombres,apellidos,fecha_nac FROM tabla WHERE usuario='$user'");
if(
mysql_num_rows($busqueda)>0) { // ó " !=0 " como se quiera ver 
      
$reg mysql_fetch_array($busqueda);
      
$usuario =$reg["usuario"]; 
      
$nombres =$reg["nombres"]; 
      
$apellido $reg["apellidos"];
      
$fecha_nac $reg["fecha_nac"];

En el formulario...

Código PHP:
<form action="">
Usuario : <input type="text" name="usuario" value="<?=$usuario?>"><br />
Nombre : <input type="text" name="nombres" value="<?=$nombres?>"><br />
Apellidos : <input type="text" name="apellidos" value="<?=$apellidos?>"><br />
Fecha Nac. : <input type="text" name="fechaNac" value="<?=$fecha_nac?>"><br />
</form>
Algo así...
Gracias por tu respuesta, sin embargo quiero hacer algo diferente.
Trabajo con Smarty/PHP y quiero hacer esto:

Primero un formulario que solamente pida Código:
formulario.tlp.php
=============
Código PHP:
<form name="fvalida" method="post" action="verificar.php" >
Codigo:<input type="text" id="codigo" name="codigo">
            <
input class="btnchk" type="submit" name="submit" value="Check">
</
form
verificar.php
=========
Código PHP:
$dao = new ArticuloClass();
$u $dao->buscar($_POST['codigo']);
....
if.... 
En ArticuloClass.php hago la busqueda si existe o no el registro. Utilizando el codigo de la FAQ y luego en verificar.php hago un if si existe o no.
Si existe mostrará un formulario y a un costado visualizará el codigo que ya existe.
Si no existe visualizará el mismo formulario pero para ingresar un nuevo registro.
Se entiende??
  #4 (permalink)  
Antiguo 10/03/2011, 23:51
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 14 años, 4 meses
Puntos: 11
Respuesta: Evitar registros duplicados-Clase

Hola, deja ver si te entiendo :)

Situación 1:
I Acto: Un formulario pide un código.
II Acto: Se ingresa un código que si existe y se presiona enviar.
III Acto: Aparece otro formulario y al costado se ve el mismo código que se puso en el II Acto.
fin.

Situación 2:
I Acto: Un formulario pide un código.
II Acto: Se ingresa un código que no existe y se presiona enviar.
III Acto: Se visualiza el mismo formulario.
fin.

En el fondo lo que deseas es hacer un control de acceso cierto? es decir, que sólo quienes sepan el código tengan acceso al siguiente formulario.

Sobre pasar ese código a una clase podrías hacer lo siguiente:

Control.php
===========

Código PHP:
Ver original
  1. class ModeloControl {
  2.  
  3.         public function existe($codigo) {
  4.                
  5.                 // Conectar a la base de datos
  6.                 mysql_connect("servidor", "usuario", "contraseña");
  7.                 mysql_select_db("nombre_dela_BD");
  8.                
  9.                 // Hacer la consulta
  10.                 $resultado = mysql_query("SELECT codigo FROM tabla WHERE codigo='$codigo'");
  11.                
  12.                 // Retornar true si es que existe el código (una o más veces).
  13.                 return mysql_num_rows($resultado) > 0;
  14.         }
  15.  
  16. }

Luego tu formulario que sólo recoge el código:
vistaFormularioControl.tpl.php
================

Código HTML:
Ver original
  1. <form name="fvalida" method="post" action="controlador.php" >
  2.         <label for="codigo">Codigo:</label>
  3.         <input type="text" id="codigo" name="codigo">
  4.         <input class="btnchk" type="submit" name="submit" value="Check">
  5. </form>

Y el otro formulario que quieres que le aparezca sólo a quienes saben el código.
vistaFormularioSeguro.tpl.php
=======================

Código HTML:
Ver original
  1. <!--Algun formulario -->
  2. <form name="fvalida" method="post" action="algun_script.php" >
  3.         <label for="nom">Nombre:</label>
  4.         <input type="text" id="nom" name="nom">
  5.         <label for="edad">Edad:</label>
  6.         <input type="text" id="edad" name="edad">
  7.         <input class="btnchk" type="submit" name="submit" value="Cambiar">
  8. </form>
  9. <div>
  10.         <h2>Felicidades! tu código era</h2>
  11.         <p><?php echo $codigo ?></p>
  12. </div>

Y finalmente el controlador que dirá que formulario mostrar.
controlador.php
=========

Código PHP:
Ver original
  1. inlude 'ModeloControl.php';
  2.  
  3. // instancear la clase
  4. $control = new ModeloControl();
  5.  
  6. // Recoger el código.
  7. $codigo = $_POST['codigo'];
  8.  
  9. // En el caso de que exista, mostrar el formulario seguro, caso contrario
  10. // mostrar el mismo formulario.
  11. if($control->existe()) {
  12.         include 'vistaFormularioSeguro.tpl.php';
  13. } else {
  14.         include 'vistaFormularioControl.tpl.php';
  15. }

No tengo idea de cómo funciona Smarty :) pero quizás te ayude a ordenar un poco lo que necesitas.

La clase que te puse tiene varias falencias, por ejemplo, es insegura a ataques de inyección SQL. Podrías solucionar eso poniendo un is_int($codigo) antes de hacer la consulta, en el caso de que el código tenga letras necesitarás conectarte por MySqli o PDO.

Otra cosa a mejorar es el rendimiento, no tiene sentido abrir una conexión a la base de datos para saber sólo si un dato existe o no.

Bueno, cualquier cosa sólo pregunta, saludos :)
__________________
Estreno blog ~ DesarrolladorWeb.cl :)
  #5 (permalink)  
Antiguo 12/03/2011, 09:31
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Sonrisa Respuesta: Evitar registros duplicados-Clase

Cita:
Iniciado por RodrigoG Ver Mensaje
Hola, deja ver si te entiendo :)

Situación 1:
I Acto: Un formulario pide un código.
II Acto: Se ingresa un código que si existe y se presiona enviar.
III Acto: Aparece otro formulario y al costado se ve el mismo código que se puso en el II Acto.
fin.

Situación 2:
I Acto: Un formulario pide un código.
II Acto: Se ingresa un código que no existe y se presiona enviar.
III Acto: Se visualiza el mismo formulario.
fin.

En el fondo lo que deseas es hacer un control de acceso cierto? es decir, que sólo quienes sepan el código tengan acceso al siguiente formulario.

Sobre pasar ese código a una clase podrías hacer lo siguiente:

Control.php
===========

Código PHP:
Ver original
  1. class ModeloControl {
  2.  
  3.         public function existe($codigo) {
  4.                
  5.                 // Conectar a la base de datos
  6.                 mysql_connect("servidor", "usuario", "contraseña");
  7.                 mysql_select_db("nombre_dela_BD");
  8.                
  9.                 // Hacer la consulta
  10.                 $resultado = mysql_query("SELECT codigo FROM tabla WHERE codigo='$codigo'");
  11.                
  12.                 // Retornar true si es que existe el código (una o más veces).
  13.                 return mysql_num_rows($resultado) > 0;
  14.         }
  15.  
  16. }

Luego tu formulario que sólo recoge el código:
vistaFormularioControl.tpl.php
================

Código HTML:
Ver original
  1. <form name="fvalida" method="post" action="controlador.php" >
  2.         <label for="codigo">Codigo:</label>
  3.         <input type="text" id="codigo" name="codigo">
  4.         <input class="btnchk" type="submit" name="submit" value="Check">
  5. </form>

Y el otro formulario que quieres que le aparezca sólo a quienes saben el código.
vistaFormularioSeguro.tpl.php
=======================

Código HTML:
Ver original
  1. <!--Algun formulario -->
  2. <form name="fvalida" method="post" action="algun_script.php" >
  3.         <label for="nom">Nombre:</label>
  4.         <input type="text" id="nom" name="nom">
  5.         <label for="edad">Edad:</label>
  6.         <input type="text" id="edad" name="edad">
  7.         <input class="btnchk" type="submit" name="submit" value="Cambiar">
  8. </form>
  9. <div>
  10.         <h2>Felicidades! tu código era</h2>
  11.         <p><?php echo $codigo ?></p>
  12. </div>

Y finalmente el controlador que dirá que formulario mostrar.
controlador.php
=========

Código PHP:
Ver original
  1. inlude 'ModeloControl.php';
  2.  
  3. // instancear la clase
  4. $control = new ModeloControl();
  5.  
  6. // Recoger el código.
  7. $codigo = $_POST['codigo'];
  8.  
  9. // En el caso de que exista, mostrar el formulario seguro, caso contrario
  10. // mostrar el mismo formulario.
  11. if($control->existe()) {
  12.         include 'vistaFormularioSeguro.tpl.php';
  13. } else {
  14.         include 'vistaFormularioControl.tpl.php';
  15. }

No tengo idea de cómo funciona Smarty :) pero quizás te ayude a ordenar un poco lo que necesitas.

La clase que te puse tiene varias falencias, por ejemplo, es insegura a ataques de inyección SQL. Podrías solucionar eso poniendo un is_int($codigo) antes de hacer la consulta, en el caso de que el código tenga letras necesitarás conectarte por MySqli o PDO.

Otra cosa a mejorar es el rendimiento, no tiene sentido abrir una conexión a la base de datos para saber sólo si un dato existe o no.

Bueno, cualquier cosa sólo pregunta, saludos :)
Probaré entre hoy y manaña. En realidad lo que quiero es que antes de ingresr los datos de un producto, el sistema verifique si ya existe el código del articulo que voy a ingresar, si existe mostrará el código y sabré que ya existe y si no se ingresa el resto de sus datos.
Por eso primero quiero que verifique el código y luego pida los demás datos en el formulario.
Y quiero hacerlo con php. Por eso me compliqué un poco. Se entiende mi requerimiento??
Tu código creo que me va a ayudar, pero en este momento no estoy en la PC donde está mi sistema.
  #6 (permalink)  
Antiguo 14/03/2011, 10:22
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Evitar registros duplicados-Clase

Lo he puesto así pero no devuelve nada:
Código PHP:
<?php
class ArticuloClass {

    function 
ArticuloClass() {
    }

    function 
verificar($criterio){
       
$query "SELECT id, codigo, nombre FROM articulos WHERE codigo = '$criterio'";
       
$BD = new ConexionDB();
       
$recordSet $BD->dbLink->Execute($query);
       if (!
$recordSet){
                        
Debug::println("No se pudo ejecutar la consulta Verificar: " $query);
                        return 
false;
                       }
       return 
mysql_num_rows($recordSet) > 0;
    }
?>

Por ejemplo para listar utilizo esta Clase:
Código PHP:
function listar(){
       
$query "SELECT id, codigo, nombre FROM articulos";
       
$BD = new ConexionDB();
       
$recordSet $BD->dbLink->Execute($query);
       if (!
$recordSet){
         
Debug::println("No se pudo ejecutar la consulta Listar: " $query);
         return 
false;
       }
       
$articulo = array();
       while(
$fila=$recordSet->FetchRow()) {
          
$articulo[] = new ArticuloVO($fila['id'], $fila['codigo'], $fila['nombre']);
       }
      return 
$articulo;


Última edición por bandolera; 14/03/2011 a las 10:27

Etiquetas: registros
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 15:07.