Foros del Web » Programando para Internet » PHP »

prevenir registros duplicados en php

Estas en el tema de prevenir registros duplicados en php en el foro de PHP en Foros del Web. Hola tengo una lista de ciudades que se muestran en un select de un formulario x. Si el usuario no encuentra la ciudad tendrá que ...
  #1 (permalink)  
Antiguo 22/11/2004, 15:40
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
Pregunta prevenir registros duplicados en php

Hola tengo una lista de ciudades que se muestran en un select de un formulario x.

Si el usuario no encuentra la ciudad tendrá que agregarla

para ello ya hice el form de agregar, pero por prevenir quisiera validarle que si la ciudad que intentan almacenar ya está en la base de datos muestr el error.

hice este código pero no funciona muy bien

Código PHP:

//quito comillas y caracteres especiales y subo a mayusculas
$ciudadstrtoupper(urldecode(stripslashes($_POST['ciudad'])));

$query mysql_query("SELECT ciudad FROM ciudades WHERE ciudad = '$ciudad'");

if (
$query 0){

 echo 
"La ciudad que ha intentado ingresar ya se encuentra en la base de datos.<a href='add_ciudad.php'>Regresar</a>";
  
}
else
{
$sql=mysql_query("INSERT INTO ciudad (ciudad) VALUES ('$ciudad')") or die(mysql_error());
$result mysql_query($sql);

echo 
"<div align='center'>La ciudad $ciudad ha sido ingresada con éxito a la base de datos.</div>";

__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.

Última edición por andinistas; 22/11/2004 a las 15:41
  #2 (permalink)  
Antiguo 22/11/2004, 22:20
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
ok

pueden ayudarme?
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #3 (permalink)  
Antiguo 23/11/2004, 00:34
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 11 meses
Puntos: 2
Código PHP:
<?php
//recuerda q si no son las mismas variables para tu conexion SQL, tendras q cambiarlas en la CLASSE
    
$sql_host "localhost";
    
$sql_usuario "xxx";
    
$sql_pass "xxx";
    
$sql_db "";

//llamamos a la CLASSE y preguntamos cuantos registros hay...
    
$mysql = New FUNC_mysqlCountFilas($sql_host,$sql_usuario,$sql_pass,$sql_db);
    
$mysql->query("SELECT ciudad FROM ciudades WHERE ciudad='$ciudad'") or die("MySQL dice: ".mysql_error());
    
$varResultadoCiudadesExiste $mysql->num_rows();


//comprobacion de la existencia de la Ciudad
    
if(!empty($varResultadoCiudadesExiste)){
        echo 
"Si existe Ciudad!!!";
    }else{
        echo 
"No existe Ciudad!!!";
    }
    


//classe para contar registros en la base de datos
    
class FUNC_mysqlCountFilas {
        var 
$sql_host;
        var 
$sql_usuario;
        var 
$sql_pass;
        var 
$sql_db;
        var 
$rstemp;
        function 
FUNC_mysqlCountFilas ($sql_host,$sql_usuario,$sql_pass,$sql_db) {
            
$this->host $sql_host;
            
$this->user $sql_usuario;
            
$this->password $sql_pass;
            
$this->database $sql_db;
            
$this->connect();
        }
        function 
connect () {
            
$this->conn = @mysql_pconnect($this->host,$this->user,$this->password)
                or die(
"La conexion $server ha fayado <br>\n");
            @
mysql_select_db($this->database,$this->conn)
                or die(
"Error:" mysql_errno() . " : " mysql_error() . "<br>\n");
            return 
$this->conn;
        }
        function 
query($sql) {
            
$this->rstemp = @mysql_query($sql,$this->conn)
                or die(
"Error:" mysql_errno() . " : " mysql_error() . "<br>\n");
            return 
$this->rstemp;
        }
        function 
num_rows() {
            
$numeroFilas = @mysql_num_rows($this->rstemp);
            return 
$numeroFilas;
        }
    }
?>
saludos
__________________
3w.valenciadjs.com
3w.laislatv.com
  #4 (permalink)  
Antiguo 23/11/2004, 09:18
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
no

Lo lamento pero no me funciona el código anterior..

realmente el procedimiento que quiero hacer es:

1. en el formulario de ingreso de x datos aparece una lista de todas las ciudades de mi pais, si no esta la ciudad en el list box tiene que agregarla para eso despliego un popup con el form de ciudad

ok entonces si el usuario ingresa x nombre de ciudad tiene que verificar si ya está la ciudad en la base de datos en caso de ser cierto mostrar un mensaje erroneo o de información advirtiendo que el dato ya existe

de lo contrario

que ingrese el registro.
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #5 (permalink)  
Antiguo 23/11/2004, 10:03
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
ok

Bueno estoy haciendo unas pruebas con este codigo y me ha funcionado:

Código PHP:
//envio datos y consulto si ya esta esa ciudad en la bd

if(empty($_POST[ciudad])){
echo 
"<br><p><br><p><br><p><br><p><p align='center' class='textobold'>Debes escribir el nombre de la ciudad o municipio.</p>";
echo 
"<br><p><br><p><p align='center' class='textobold'><a href='add_ciudad.php'>Corregir</a>";
exit;
}

$anteriorstrtoupper(urldecode(stripslashes($_POST['ciudad'])));
$ciudadstrtoupper($anterior);
$query mysql_query("SELECT ciudad FROM ciudades WHERE ciudad = '$ciudad'");

if(
$row=mysql_fetch_array($query)){
    echo 
"<br><p><br><p><br><p><p align='center' class='textobold'>La ciudad que ha intentado ingresar ya se encuentra en la base de datos.";
    echo 
"<br><p><br><p><br><p><p align='center' class='textobold'><a href='add_ciudad.php'>Regresar</a>";

} else {

$sql="INSERT INTO ciudades (ciudad) VALUES ('$ciudad')" or die(mysql_error());
mysql_query($sql) or die("Error en consulta <br>MySQL dice: ".mysql_error());

echo 
"<div align='center'>La ciudad $ciudad ha sido ingresada con éxito a la base de datos.</div>";

me gustaría hacerle una modificación con la condición

Si el registro no existe {
mostrar popup con aceptar / cancelar , preguntando que si desea agregar esa ciudad a la base de datos
}

sera posible? creo que se utiliza javascript para eso.. sin embargo sigo intentado.
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #6 (permalink)  
Antiguo 23/11/2004, 11:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Con esto simplemente:
if($row=mysql_fetch_array($query)){

no puedes asegurar que tu consulta SQL ejecutada:
$query = mysql_query("SELECT ciudad FROM ciudades WHERE ciudad = '$ciudad'");

arroje un registro (lo esperado) o cero .. sólo vas a ver que la consulta SQL se ejecutó correctamente sin error (de conexión o de sintax SQL) .. De hecho .. si no hay resultados en tu consulta .. lo que se proboca es un error en mysql_fetch_array() ..

Lo que debes haces es usar la función:

mysql_num_rows($query)

tipo:

Código PHP:
if (mysql_num_rows($query) == 1){
  
// das tu mensaje de erro y aviso ..
  // No te hace falta el mysql_fetch_array() .. no vas a motrar ningún dato más de ese registro.
   
} else {

  
// ejecutas tu insert

Y .. donde dice "muestras tu mensaje de error" .. podrías lanzar una ventana desde javascript:

Código PHP:
echo "<script languaje=\"javascript\">window.open('confirma.php"........)</script>"; 
En la ventana que abres .. llamas a tu "confirmar.php" o bien un confirm() de jvascript. No conozco tu aplicación .. pero en teoría esas "ciudades" no deberían repetirse en tu BD .. para eso verificas que no exista .. así que no tiene mucho sentido en ese caso hacer un "confirmar" con opción de continuar. (pero .. eso ya depende de tus necesidades).

Realmente hay muchos otros detalles que tendrías que tener encuenta para que esto te funcione como deseas .. Parece que usas un mismo script para vários procesos .. (no se vé el código completo o así parece) .. Realmente deberías evitar mostrar mensajes al ejecutar un "Query" en tu BD .. haz una prueba, si recargas la página que ahora usas para mostrar el mensaje que muestras despues de tu INSERT .. veras que tu código volverá a ejecutarse .. los datos se pedirá reenviarlos (por parte de tu navegador) y entrará en juego tu validación de registros repetidos (menos mal .. ) pero, lo que debería hacerse es "redireccionar" a otra página (Script) al terminar ese INSERT para mostrar su mensaje de error o exito en otro script o por lo menos flujo del mismo script (recargandose a si mismo ..). No sé si me explico .. pero esa forma de programar se presta a eso . .a veces es necesario repartir el código en vários scripts (con sus validaciones necesarioas) o bien tener encuenta que si se usa un mismo script para vários procesos .. al ejecutarse uno hay que "redireccionar" al otro (con alguna variable más de control que indique en que estado se está).

Un saludo,
  #7 (permalink)  
Antiguo 23/11/2004, 11:55
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
ok

Ok cluster te enseño mi código

EL asunto se compone de 2 paginas, un archivo html donde esta el input con la propiedad de nombre "ciudad" y un boton submit que tiene como action el scrip php que interpreta la consulta.

el archivo que procesa la consulta tiene como código.

Código PHP:
<?

//llamo a conexion con bd
include("conex.php");

//llamo al head
include("head.php");
?>

<?
//verifico que si esta vacio el submit,devuelva obligatoriamente al usuario a llenarlo
if(empty($_POST[ciudad])){
echo 
"<br><p><br><p><br><p><br><p><p align='center' class='textobold'>Debes escribir el nombre de la ciudad o municipio.</p>";
echo 
"<br><p><br><p><p align='center' class='textobold'><a href='add_ciudad.php'>Corregir</a>";
exit;
}

//quito caracteres especiales
$anteriorstrtoupper(urldecode(stripslashes($_POST['ciudad'])));

//lo vuelvo mayúsculas
$ciudadstrtoupper($anterior);

//hago la consulta a la base de datos
$query mysql_query("SELECT ciudad FROM ciudades WHERE ciudad = '$ciudad'");

//aqui compruebo de que si el registro existe muestre un mensaje de lo contrario lo ingrese a la bd

if (mysql_num_rows($query) == 1){
    echo 
"<br><p><br><p><br><p><p align='center' class='textobold'>La ciudad que ha intentado ingresar ($ciudad) ya se encuentra en la base de datos.";
    echo 
"<br><p><br><p><br><p><p align='center' class='textobold'><a href='add_ciudad.php'>Regresar</a>";
   
} else {

$sql="INSERT INTO ciudades (ciudad) VALUES ('$ciudad')" or die(mysql_error());
mysql_query($sql) or die("Error en consulta <br>MySQL dice: ".mysql_error());

echo 
"<div align='center'>La ciudad $ciudad ha sido ingresada con éxito a la base de datos.</div>";
echo 
"<p><br><p><div align='center'><a href='javascript:window.close();'>Cerrar Ventana</a></div>";
}

?>
eso es todo, desde luego ha servido el script.

cuando uno ingresa una ciudad que no esta en la bd el la almacena, en caso de volver a actualizar la página o tratar de ingresar el mismo pues sale el mensaje de que ya existe.
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.

Última edición por andinistas; 23/11/2004 a las 11:58
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 06:11.