Foros del Web » Programando para Internet » PHP »

Evitar registros duplicados php-javascript

Estas en el tema de Evitar registros duplicados php-javascript en el foro de PHP en Foros del Web. En primer lugar quiero pedir disculpas a jam1138, por mandar mensaje privado, entiendo que todos podemos aprender, no volverá a ocurrir. Hola, he probado la ...
  #1 (permalink)  
Antiguo 10/07/2006, 04:18
 
Fecha de Ingreso: mayo-2006
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Evitar registros duplicados php-javascript

En primer lugar quiero pedir disculpas a jam1138, por mandar mensaje privado, entiendo que todos podemos aprender, no volverá a ocurrir.

Hola, he probado la solución para evitar registros duplicados (jam1138), y me da el siguiente error (warning), cuando realmente ya existe ese dni en la bbdd, pero si recargo la pagina me va bien. Yo llamo a la función que ejecuta el script justo cuando cargo la variable en un insert grande (te pongo las líneas de mi código)

Mi código:
Código PHP:
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL sprintf("INSERT INTO aso (fechalta, nombre, apellido, dni, direc, ciudad, provi, cp, mail, telfijo, telmovil, activo, web, campo, fecnaci, foto, entidad, oficina, dc, ncta, perconducir, vehiculo, autonomo, idioma, ofimatica, campogolf1, campogolf2, campogolf3, campogolf4, campogolf5, puestrotra1, puestrotra2, puestrotra3, puestrotra4, puestrotra5, desde1, desde2, desde3, desde4, desde5, hasta1, hasta2, hasta3, hasta4, hasta5, cv, cuac, cuno) VALUES (now(), %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
GetSQLValueString($_POST['nombre'], "text"),
GetSQLValueString($_POST['apellido'], "text"),
GetSQLValueString(duplidni($_POST['dni']), "text"),
GetSQLValueString($_POST['direc'], "text"),
GetSQLValueString($_POST['ciudad'], "text"), 
.................................................. ...
La función:
Código PHP:
function duplidni($dni){

// Paso 2: Hacemos la consulta a la Tabla por el dni
$busquedamysql_query("SELECT dni FROM aso WHERE dni='$dni'");

if(
mysql_num_rows($busqueda)>0) { // ó " !=0 " como se quiera ver
// Inciso a:
header("Location: ""duplidni.php" );

echo 
"El dni esta duplicado. Por favor intente con otro.<br>";
echo 
"<a href=\"javascript:history.back()\">Regresar</a>.<br>";
echo 
" .<br>";
} else {
// Inciso b:
echo "El dni no esta duplicado.";
echo 
"<a href=\"javascript:history.back()\">Regresar</a>";
}
return;

...........................................
¿alguna idea?. Gracias.

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\appserv\www\dw\andig\funciones.php on line 38
El dni no esta duplicado.RegresarColumn 'dni' cannot be null

Última edición por jam1138; 10/07/2006 a las 04:28
  #2 (permalink)  
Antiguo 10/07/2006, 04:32
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 11 años, 5 meses
Puntos: 0
Has probado a pasarle a la function el $conn_id y ponerselo al mysql_query? A ver si es eso... lo unico q se me okurre a priori.
  #3 (permalink)  
Antiguo 10/07/2006, 04:49
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 13 años, 4 meses
Puntos: 101
...

Primero decir que lo que se trata (como dice la FAQ) es buscar antes de insertar, así de simple, sin tanta lógica. Lo que inténto decir es que el proceso de busqueda es antes de hacer el INSERT y este iria dentro del "else" en tu condicional (donde ahora tienes un enlace de retroceso). Nada de eso queda claro en tu código.

Por otra parte, el error te esta diciendo que no es posible usar la función pués el parámetro no es válido. Antes de utilizar las funciones de MySQL es necesario verifiques la conexión se realize con éxito y, en su caso, lo mismo con la selección de la BD a trabajar (visita la FAQ sobre cómo trabajar con MySQL)... digo esto porque no aparece eso en tu código (creo tampoco en la FAQ y es porque "es asunto aparte"; se indica en comentarios). Además, como es una función lo que estás creando, debes considerar el alcanse de las variables... necesitas acceder al "resourse" de conexión (ó realizar la conexión dentro de la función, pero quizá esta misma conexión la ocuparás en otra parte de tu código).

Bien puedes pasarlo como parámetro como te indican (¿por referencia?) ó acceder de manera global. Además, si tu función es exclusivamente para "ver si el dato existe" el retorno de "true o false" sería indicado.

www.php.net/language.variables.scope
www.php.net/functions


PD: Si isertas código procura utilizar las etiquetas correspondientes http://www.forosdelweb.com/misc.php?do=bbcode#code
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #4 (permalink)  
Antiguo 10/07/2006, 05:27
 
Fecha de Ingreso: mayo-2006
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Gracias, intentaré implementarlo antes del insert.
  #5 (permalink)  
Antiguo 10/07/2006, 05:28
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 13 años
Puntos: 1
bueno.. supongo que será una tonteria y te abras fijado ya antes.. pero esto:

if(mysql_num_rows($busqueda)>0) te va a ejecutar lo de dentro siempre que encuentre un registro..

para hacerlo con los que estan repetido pon un "1" en lugar del 0 para que lo haga con los que tengan mas de 1 registro.
if(mysql_num_rows($busqueda)>1)

(solo era un apunte jaja)
__________________
ALOZORRO v5.0 (ahora en .es)
  #6 (permalink)  
Antiguo 10/07/2006, 23:00
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 13 años, 4 meses
Puntos: 101
Cita:
Iniciado por Azrael666
para hacerlo con los que estan repetido pon un "1" en lugar del 0 para que lo haga con los que tengan mas de 1 registro.
... no entiendo tu apunte ...

El objetivo es no repetir un registro.

Poniendo 0 como está ahora, en efecto, se ejecuta el bloque dentro del IF, este bloque es el que "cancela/evita" la inserción del registro ducplicado por lo que el objetivo se cumple.

Colocando un 1 en vez de 0 servirá para repetir no más de una vez el registro (hasta 2 registros iguales)... no entiendo si fué lo que quisiste decir ¿?.

Como dije en comentarios, depende de cómo se quiera ver... incluso es válido igual hacer algo como:
Código PHP:
if(!(mysql_num_rows($busqueda)>0)) {
    
// INSERT bla bla bla
} else {
    echo 
"Información duplicada";

... y seguro habrá otras variantes (mayor o igual a 1; desde la definición misma del campo...) pero considero yo el cómo se plantea en la FAQ es lo más cómodo por la lógica simple y el órden de los procesos.


pabcue: He observado otro error... la primer sentencia del bloque del IF es una redirección [ header("Location:....") ] pero debajo de ella hay "más cosas por hacer" (imprimes un mensaje), eso no es posible; ¿cómo seguir ejecutándo sentencias --peor aún, mensajes en pantalla cuando la redirección es desde el servidor-- si antes redireccionaste? "ya no estás ahí" para poder hacer eso.

Te sugiero busques dentro del foro "redireccionar" y/o afines --incluso la misma función header()--.

Salu2
__________________
٩(͡๏̯͡๏)۶
» 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 11/07/2006, 05:43
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 13 años
Puntos: 1
Cita:
Cita:
Originalmente publicado por Azrael666
para hacerlo con los que estan repetido pon un "1" en lugar del 0 para que lo haga con los que tengan mas de 1 registro.

... no entiendo tu apunte ...

El objetivo es no repetir un registro.

Poniendo 0 como está ahora, en efecto, se ejecuta el bloque dentro del IF, este bloque es el que "cancela/evita" la inserción del registro ducplicado por lo que el objetivo se cumple.
anda. me acabo de dar cuenta ahora.. estaba pensando en otra cosa.. perdon por el despiste...
__________________
ALOZORRO v5.0 (ahora en .es)
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 21:09.