Foros del Web » Programando para Internet » PHP »

evitar repetir registros

Estas en el tema de evitar repetir registros en el foro de PHP en Foros del Web. hola, quisiera evitar que se pueda agregar dos veces un mismo registro. en mi base de datos esto puede ser posible porque la clave principal ...
  #1 (permalink)  
Antiguo 16/06/2005, 07:08
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
evitar repetir registros

hola, quisiera evitar que se pueda agregar dos veces un mismo registro. en mi base de datos esto puede ser posible porque la clave principal es autonumérica y etonces los datos de un registro pueden volverse a grabar en otro registro porque la calve principal es distinta.

la sintáxis que utilizo creo que es la que utiliza todo el mundo cuando está empezando, el formulario de entrada de datos llama a la página php que tiene mas o menos este código

insert into tablax (campo_a,campo_b,campo_c)
values(valor_a,valor_b,valor_c)

os agradecería cualquier comentario por breve que fuera y/o una dirección donde encontrar una pista que me oriente.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #2 (permalink)  
Antiguo 16/06/2005, 07:57
Avatar de kairocode  
Fecha de Ingreso: diciembre-2004
Mensajes: 20
Antigüedad: 19 años, 4 meses
Puntos: 0
lo pirmero que podrias hacer es con tu gestor de base de datos decir que determinados campos sean unicos. Lo otro seria ya con php hacer una consulta para chequear que el valor del campo pasado en el formulario no se exita en la bd y de existir puedas mostrar un mesajito de error

si pudieras decirnos que gestor db usas podriamos decirte como hacerlo.

en cuanto al codigo php, hay varias formas de hacerlo... pero lo basico seria hacer la consulta que busque por duplicados y con la funcion mysql_num_rows() recoger el total de registros que tiene la consulta, si te devuelve 0 es que no hay coincidencias y en ese caso realizas la insercion, de lo contrario muestras tu mensaje de error y no realizas la insersion.

Suerte
  #3 (permalink)  
Antiguo 16/06/2005, 08:24
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
gracias, utilizo mysql. lo que quiero resolver es que un usuario despistadamente de entrada a un mismo registros dos o mas veces, estoy trabajando con una base de prueba y solo tengo en las tablas clave principal y campos normales sin índices, la cuestión no es hacer índices, es más bien comparar todos los campos menos la clave principal del registro que voy a añadir con los registros ya existentes y, si coinciden todos los campos mostrar el correspondiente mensaje de error o, la página que informe de que el registro está ya existe, a pesar de que como ya digo la clave principal sea distinta.

en cuanto a la consulta de duplicados sé de que me hablas pero sintácticamente no tengo ni la menor idea de como se hace, ni funciones que se utilizan ni nada.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #4 (permalink)  
Antiguo 16/06/2005, 08:53
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
entiendo muy bien lo que quieres hacer, pero acordate que si el usuario cambia una M por una N el codigo ya no funcionara y lo validara como correcto.

antes de insertar, debes hacer un query que compare el valor1 con el campo 1, si son iguales, manda un error, de lo contrario insertas, asi de simple
y si quieres comparar mas de un campo sigue el mismo procedimiento.
espero y te sirva
  #5 (permalink)  
Antiguo 17/06/2005, 03:42
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
gracias, me sirve tu comentario pero no es exactamente eso lo que necesito. no quiero que compare primero el campo_1 después el campo_2 etc. sino todos los campos a la vez. por ejemplo, puede haber muchos participantes de Buenos Aires y no por eso voy impedir que se registren todos los bonaerenses que quieran.

de verdad que sigo sin saber hacerlo.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #6 (permalink)  
Antiguo 17/06/2005, 03:59
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
... tema común... y las respuestas que te han dado son correctas. Si desconoces el uso de una función consultala en www.php.net

Bien pués... vámos por la tercera...
Tú al recibir los datos vaz a consultarlos en la BD... solo lo que quieras sean únicos, los consultarás, aplicarás la función mysql_num_rows() con la que verás si hubo resultados... ¿qué nos dice el que haya reultados???.. pués que el dato ya esta!!!, entonces si lo guardamos se repetiría...

Ejemplo sencillo ... la clásica tabla con "usuario" y "password" donde se busca no se repita el usuario:
Código PHP:
// conectamos y demás
$consultamysql_query("SELECT usuario FROM tabla WHERE usuario='$nuevo'");
// donde $nuevo es el registro que se quiere ingresar y se busca no sea repetido
// igual como comentario no importa los campos que se consulten.. solo queremos hacer la busqueda
if(mysql_num_rows($consulta)>0) echo "Dato repetido";
else echo 
"Sigamos...."
... ahí solo buscas que el campo usuario no tenga un registro repetido, nada te impide aumentar la condicional... modifiarla.. etc... si quisieras, claro...

www.php.net/mysql_num_rows
... sin más comentarios.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #7 (permalink)  
Antiguo 20/06/2005, 04:23
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
he intentado adaptar el código que me das de esta manera

// conectamos y demás
$consulta= mysql_query("SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo ,sueldo
FROM personal
WHERE nombre='$nombre' && apellido='$apellido' && calle='$calle' && cp='$cp' && poblacion='$poblacion' && nacimiento='$nacimiento' && sexo='$sexo' && sueldo='$sueldo'");

if(mysql_num_rows($consulta)>0)
echo "Dato repetido";

else // echo "Sigamos....";

$sql = "insert into personal (nombre,apellido,calle,cp,poblacion,nacimiento,sex o,sueldo)
values('$nombre', '$apellido', '$calle', '$cp', '$poblacion', '$nacimiento', '$sexo', '$sueldo')";

pero no puedo ver la página, no sale nada. te agradecería cualquier comentario por breve que fuera.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #8 (permalink)  
Antiguo 20/06/2005, 09:22
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
hola de nuevo ahora me sale esto

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/carloszc/public_html/base2/modificar/agre_per_confi.php on line 37

donde linea 37 es

if(mysql_num_rows($consulta)>0)

os agradecería cualquier comentario.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #9 (permalink)  
Antiguo 20/06/2005, 22:38
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
.. no esta haciendo bien la consulta; no es que no haya resultados... no la está haciendo bien... ¿seguro que te conectas y seleccionas la BD con la que haz de trabajar antes???... ¿le daz valor a las variables que ocupas dentro de la query??... ... si esos dos pasos anteriores los estás haciendo bien intenta con un "or die" de esta manera:
Código PHP:
$consultamysql_query("TU QUERY") or die (mysql_error()); 
Ve si te aparece otro tipo de error... quizá conevnga muestres el código que tienes antes de esto... lo que se refiere a conectarse y darle valor a las variables...
www.php.net/mysql_connect
www.php.net/mysql_select_db

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #10 (permalink)  
Antiguo 21/06/2005, 03:16
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
gracias, el código para conectar y todo eso lo tengo bastante experimentado, lo utiliza en varios formularios desde hace unas semanas y funciona sin problemas, intentaré lo que me dices.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #11 (permalink)  
Antiguo 21/06/2005, 04:36
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
después de poner

.......or die (mysql_error());

me da este mensaje

No database selected.

la conexión la hago de esta manera y como ya te he dicho otras veces siempre funciona, pero ahora por lo visto no.

<?
/* Datos de acceso para la conexión con el servidor MySQL */

$link=mysql_connect("tal y tal","tal y tal","tal y tal");

// Elección de la base de datos que se utilizará en el servidor
$db ="tal y tal";
?>
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #12 (permalink)  
Antiguo 21/06/2005, 05:05
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
El mensaje te lo dice todo... no haz seleccionado la DB .. ó no ejecutas la función (no la muestras, asupongo no lo haces) ó el nombre está mal... miento... eso último no puede ser porque el mensaje sería de "DB no encontrada"...

www.php.net/mysql_select_db << ya lo había puesto y si es necesario por favor coloca bien el código que ocupas... hay que dejar de "suponer" y ver bien lo que se hace...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #13 (permalink)  
Antiguo 21/06/2005, 07:40
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
el mensaje a mi no me dice nada, la verdad, en la misma página tengo otras consultas con el mismo código, igualitas, y funcionan perfectamente, puedo agregar, modificar y eliminar registros sin ningún problema y también puedo ver distintos listados de varias tablas, es decir, que en el único caso que me sale el error

no database selected

es cuando hago esta consulta (he modificado un poco la sintaxsis para que sea igual a las otras consultas de la misma página.)

$query = "SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo ,sueldo
FROM personal
WHERE nombre='$nombre' && apellido='$apellido' && calle='$calle' && cp='$cp' && poblacion='$poblacion' && nacimiento='$nacimiento' && sexo='$sexo' && sueldo='$sueldo'";

$sql4 = mysql_query($query) or die (mysql_error());

if(mysql_num_rows($sql4)>0)

echo "Dato repetido";

else

etc etc, aquí sigue un insert que ya digo que funciona perfectamente si le quito lo de arriba.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #14 (permalink)  
Antiguo 21/06/2005, 14:30
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
El problema está antes de eso... antes de poder ejecutar una query DEBES primero conectarte y seleccionar la BD con la que haz de trabajar (en ese órden y con las funciones que he dejado).

¿por qué "ese código" sirve en otros scripts??... podría ser (adivinando, tendrías que mostrarlo exáctamente como lo tienes para decirte con certeza):

- Usas la función mysql_db_query() que es como usar mysql_select_db() y mysql_query() a la vez... pero solo sería aconsejable que usaras esto si haz de trabajar con varias BD, así especificas desde esa función qué query ha de ejecutarse en qué BD... de lo contrario (comúnmente) es más eficiente seleccionar la BD que haz de utilizar en todo el script y manejar querys por separado... el simple control de errores es un beneficio (este caso).

- No trabajas con la misma BD que un tus otros scripts...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #15 (permalink)  
Antiguo 22/06/2005, 04:51
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
estoy muy desconcertado

he probado a cambiar de sitio el la consulta dentro de la misma página, detrás de las consultas que se efectuan sin ningún problema y

1. la consulta no da error
2. la consulta no da el resultado esperado

explicacion al punto 1.
lo que funciona es esto

$query = "SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo ,sueldo
FROM personal
WHERE nombre='$nombre' && apellido='$apellido' && calle='$calle' && cp='$cp' && poblacion='$poblacion' && nacimiento='$nacimiento' && sexo='$sexo' && sueldo='$sueldo'";

$sql4 = mysql_query($query) or die (mysql_error());

explicacion al punto 2.
la consulta me devuelve todos los registros de la tabla cuando lo que esperabamos es que devolviera solo un registro.

a mi todo esto me parece muy extraño. como ves la conexión está bien hecha aunque es desconcertante que se produzca la conexión solo en determinados puntos de la página, te juro que esto es así.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #16 (permalink)  
Antiguo 22/06/2005, 05:01
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
he modificado la consulta de esta forma

SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo ,sueldo
FROM personal
WHERE nombre='$nombre'";

y también me devuelve todos los registros de la tabla. yo esperaba que me devolviera solo los registros que coinciden con el campo nombre del formulario de entrada de datos.

como siempre os agradecería cualquier comentario.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #17 (permalink)  
Antiguo 22/06/2005, 10:09
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 20 años, 3 meses
Puntos: 2
Deberías empezar a debbugear, comprueba q los datos pasen bien desde el formulario, usa echo, no tienes un problema de conexión, lo q pasa es q debes, como buena costumbre, pasarle al query la DB con la q vas a trabajar.
Algo así debería de funcionar, donde $dbname es el nombre de la DB con la q trabajarás.
Código PHP:
$consulta "SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo,sueldo
FROM personal WHERE nombre='$nombre' AND apellido='$apellido' AND calle='$calle' AND cp='$cp' AND poblacion='$poblacion' AND nacimiento='$nacimiento' AND sexo='$sexo' AND sueldo='$sueldo'"
;
$q mysql_db_query($dbname,$consulta) or die($consulta."<br>".mysql_error());
$cuantos mysql_num_rows($q) or die(mysql_error());
if(
$cuantos 0){
echo 
"el usuario ya existe";
}else{
$consulta "INSERT INTO personal (nombre,apellido,calle,cp,poblacion,nacimiento,sexo,sueldo) VALUES('$nombre' ,'$apellido','$calle','$cp','$poblacion','$nacimiento','$sexo','$sueldo')";
$q mysql_db_query($dbname,$consulta) or die($consulta."<br>".mysql_error());
echo 
"Tus datos fueron ingresados correctamente";

Saludos cuidate
__________________
Dios dira que esto no es justo, pero lo sera...

Última edición por sebtev; 22/06/2005 a las 10:19
  #18 (permalink)  
Antiguo 23/06/2005, 07:16
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
alguna mejoría

gracias, ahora me da este error

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/carloszc/public_html/base2/modificar/agre_per_confi.php on line 77

la linea 77 es la que lleva la función mysql_num_rows() como podeis adivinar

el error que me daba antes ya lo he solucionado, lo que parecía un error de conexión que en realidad no lo era. todas las indicaciones que me dabais eran buenas

ahora como siempre os agradecería cualquier comentario.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
  #19 (permalink)  
Antiguo 23/06/2005, 18:11
 
Fecha de Ingreso: enero-2004
Ubicación: Salto
Mensajes: 484
Antigüedad: 20 años, 3 meses
Puntos: 2
Concadena todas las variables e imprime antes $consulta para ver como queda, va a ser mejor así:
Código PHP:
$consulta "SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo  ,sueldo
FROM personal WHERE nombre='"
.$nombre."' AND apellido='".$apellido."' AND calle='".$calle."' AND cp='".$cp."' AND poblacion='".$poblacion."' AND nacimiento='".$nacimiento."' AND sexo='".$sexo."' AND sueldo='".$sueldo."'"
Chequea bien las comillas, no copies y pegues porq no se si las he puesto a todas bien.
Saludos cuidate
__________________
Dios dira que esto no es justo, pero lo sera...
  #20 (permalink)  
Antiguo 24/06/2005, 07:53
 
Fecha de Ingreso: abril-2005
Ubicación: vivo donde puedo
Mensajes: 133
Antigüedad: 19 años
Puntos: 0
asunto resuelto

lo mejor de todo es que hemos resuelto dos problemas de un golpe

1. el problema de refrescar la página php de respuesta a un formulario de entrada de datos que agrega de nuevo el mismo registro
2. el despiste de un usuario que vuelva a enviar los mismos datos desde el formulario de entrada de datos

no ha salido a la primera porque yo tengo muy poca experiencia y tenía algunos errores de base. dentro de unos días el código completo de la página estará disponible en mi página web.

los errores tontos que tenía no los voy a explicar porque bastante he sufrido ya.

aquí va el código

$sql = "SELECT nombre,apellido,calle,cp,poblacion,nacimiento,sexo ,sueldo
FROM personal
WHERE nombre='$nombre' && apellido='$apellido' && calle='$calle' && cp='$cp' && poblacion='$poblacion' && nacimiento='$nacimiento' && sexo='$sexo' && sueldo='$sueldo'";

If ($res=send_sql($db,$sql)) {
echo "<br><br>Consulta: <br> $sql";
}

$cuantos = mysql_num_rows($res);
if($cuantos > 0){
echo "<br><br><h3>El registro ya ha sido agregado.</h3><br><br>";
tab_out($res);}
else{
$sql4 = "insert into personal (nombre,apellido,calle,cp,poblacion,nacimiento,sex o,sueldo) values('$nombre', '$apellido', '$calle', '$cp', '$poblacion', '$nacimiento', '$sexo', '$sueldo')";}

tengo que aclarar que hay un include que llama a esta funcion

function send_sql($db, $sql)
{
if (! $res=mysql_db_query($db, $sql))
{
echo mysql_error();
exit;
}
return $res;
}

el error que más nos ha costado descubrir es que en lugar de esto

$cuantos = mysql_num_rows($res);

nosotros poníamos esto

$cuantos = mysql_num_rows($sql);

también han colaborado los de soporte de minervahosting donde tengo alojada mi página.

muchísimas gracias a todos. y hasta pronto.
__________________
Visita mi página web.Carlos Zapata Company
Visita mi blog.
Únete a mi lista de correo.
--------------------------------------------------
La identidad no es lo que fuimos, ni lo que creemos que somos; la identidad es cómo miramos la mundo.

José Luis Rodríguez Zapatero, actual presidente del Gobierno español.
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:23.