Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] No escribir si ya se encuentra en la base de datos

Estas en el tema de No escribir si ya se encuentra en la base de datos en el foro de PHP en Foros del Web. Tengo un script que trae unos checkbox, los separa y los escribe. Lo que necesito es que si encuentra un ID que ya se encuentras ...
  #1 (permalink)  
Antiguo 10/01/2014, 13:50
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Pregunta No escribir si ya se encuentra en la base de datos

Tengo un script que trae unos checkbox, los separa y los escribe. Lo que necesito es que si encuentra un ID que ya se encuentras escrito, no los escriba en la DB...

este es mi código, funciona muy bien pero necesito que funcione de manera que si uno de esos checkbox ya se encuentran en la base de datos no lo escriba.

Obviamente como veran escribe un registro por separado por ejemplo.

Si en el ckeckbox selecciono id 1, 3 y 5

Escribirá:
usuario 1 - id 1
usuario 1 - id 3
usuario 1 - id 5

Código PHP:
//Si viene del paso 3 a seleccionar otras tarjetas ejecuta esto
if (isset($_POST['tarjetas'])){
//trae los chekbox y escribe en la tabla.
$tarjetasSeleccionadas=$_POST['tarjetas'];
if (
count($tarjetasSeleccionadas) > 0){
$i=0;
while(
$i count($tarjetasSeleccionadas)){
 
mysql_query("INSERT INTO tarjetas_usuarios (usuario_id,tarjetas_usuario_id) values ('".$_SESSION['usuario_id']."',".$tarjetasSeleccionadas[$i].")");
$i++;
}
}



GRACIAS COMO SIEMPRE A LOS EXPERTOS!
  #2 (permalink)  
Antiguo 10/01/2014, 13:53
 
Fecha de Ingreso: enero-2014
Mensajes: 75
Antigüedad: 10 años, 10 meses
Puntos: 11
Respuesta: No escribir si ya se encuentra en la base de datos

Pues primero tienes que hacer una consulta a la BBDD que compruebe si el id existe, si no existe que lo escriba.

Creo que es asi.
  #3 (permalink)  
Antiguo 10/01/2014, 14:04
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: No escribir si ya se encuentra en la base de datos

si el id es una clave primaria en la tabla, es posible hacerlo de forma automática con

INSERT IGNORE

aunque esto ya es más base de datos que php.
  #4 (permalink)  
Antiguo 10/01/2014, 14:05
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

Si, claro que si. Pero ya intenté y no he dado con la respuesta.


Como es lo de insert ignore?
  #5 (permalink)  
Antiguo 10/01/2014, 14:09
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

Tengo entendido que hago la consulta de todos los que pertenecen al user_id y uso mysql_num_rows si es mayor a 1 que lo tire. Pero no es la solución o no la encuentro de esa manera.

Vos lo que decis es que traiga todos los ids del user_id y use un ignore de los numeros que ya posee el user? Sin cartel nu nada que no agregue esos y listo? No se me habia ocurrido asi. Me vale eso tambien. Como sería?
  #6 (permalink)  
Antiguo 10/01/2014, 14:17
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: No escribir si ya se encuentra en la base de datos

Cita:
Iniciado por rakshaka Ver Mensaje
Si, claro que si. Pero ya intenté y no he dado con la respuesta.


Como es lo de insert ignore?

Pues si buscas en google, verás muchos ejemplos, incluyendo la documentación oficial de mysql, pero si no quieres molestarte en hacer la búsqueda, aquí te muestran cómo hacerlo y en español
  #7 (permalink)  
Antiguo 10/01/2014, 14:52
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 15 años, 4 meses
Puntos: 27
Respuesta: No escribir si ya se encuentra en la base de datos

en teoria si intentas insertar PK de nuevo te tira un error en el insert, y no hace nada.
Es medio raro hacer esto, lo que yo hago siempre es consultar antes de hacer el insert.
  #8 (permalink)  
Antiguo 10/01/2014, 15:02
 
Fecha de Ingreso: enero-2014
Mensajes: 75
Antigüedad: 10 años, 10 meses
Puntos: 11
Respuesta: No escribir si ya se encuentra en la base de datos

Es que, la mejor forma de hacerlo es con una preconsulta para comprobar si hay un registro con esos datos...

No entiendo como te falla una consultade ese tipo, es de las mas básicas. A lo mejor tenias algun error y no lo viste. Esta es la mejor forma de hacerlo:

1- Recuperamos los datos del formulario.
2- Recorremos los checkbox, recogiendo su valor.
3- Consultamos a la BBDD si hay algun registro con ese valor.
3.1- Si lo hay, no hace nada.
3.2- Si no lo hay, que cree uno.

Debes usar
Código PHP:
Ver original
  1. mysqli_affected_rows($conexion) > 0
para saber si se ha devuelto algun registro de la BBDD al hacer la consulta del punto 3.

Creo que te estas complicando mucho la vida, con algo que es muy sencillo.
  #9 (permalink)  
Antiguo 13/01/2014, 07:41
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

Entiendo esto, pero si tengo un rulo en el medio necesito que ignore pero no doy con como hacerlo.
  #10 (permalink)  
Antiguo 13/01/2014, 08:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: No escribir si ya se encuentra en la base de datos

Cita:
Iniciado por rakshaka Ver Mensaje
Entiendo esto, pero si tengo un rulo en el medio necesito que ignore pero no doy con como hacerlo.
No se entiende mucho por qué no lo entiendes...
Mira, tomemos tu propio código:
Código PHP:
//Si viene del paso 3 a seleccionar otras tarjetas ejecuta esto
if (isset($_POST['tarjetas'])){
//trae los chekbox y escribe en la tabla.
$tarjetasSeleccionadas=$_POST['tarjetas'];
if (
count($tarjetasSeleccionadas) > 0)
    {
    
$i=0;
    while(
$i count($tarjetasSeleccionadas))
        {
        
// Verificar si la combinación ya existe.
        
$validar "SELECT COUNT(*) total FROM tarjetas_usuarios ";
        
$validar .= "WHERE usuario = '$_SESSION['usuario_id']' ";
        
$validar .= " AND tarjetas_usuario_id = $tarjetasSeleccionadas[$i]";
        
$resultvalidar mysql_query($validar);
        
// Si devuelve cero, es que no hya registros con esos valores
        
$row mysql_fetch_array($resultvalidar);
        if(
$row['total'] == 0)
            {
             
// Si no hay registros con ese par de valores, se inserta.
            
$qryinsert "INSERT INTO tarjetas_usuarios (usuario_id, tarjetas_usuario_id) values ('".$_SESSION['usuario_id']."', ".$tarjetasSeleccionadas[$i].")";
            
$result mysql_query($qryinsert);
            
// Si se ejecutó bien, sumas uno
            
if($result$i++;
            }
        }
    } 
La clave probablemente es que no debes intentar hacer códigos "simples", sino códigos que funcionen, aunque tengas que escribir mucho.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 13/01/2014, 08:12
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

La consulta me llega en una cadena Array... ese es el problema.


a ver, probaré eso!
  #12 (permalink)  
Antiguo 13/01/2014, 08:19
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

Lo cambié a esto pero no me funciona:

Código PHP:
//Si viene del paso 3 a seleccionar otras tarjetas ejecuta esto
if (isset($_POST['tarjetas'])){
//trae los chekbox y escribe en la tabla.
$tarjetasSeleccionadas=$_POST['tarjetas'];
if (
count($tarjetasSeleccionadas) > 0)
    {
    
$i=0;
    while(
$i count($tarjetasSeleccionadas))
        {
        
// Verificar si la combinación ya existe.
        
$validar 'SELECT COUNT(*) total FROM tarjetas_usuarios WHERE usuario_id = "'$_SESSION["usuario_id"] .'" AND tarjetas_usuario_id = "'.$tarjetasSeleccionadas[$i].'"';
        
$resultvalidar mysql_query($validar);
        
// Si devuelve 
        
$row mysql_fetch_array($resultvalidar);
        if(
$row['total'] == 0)
            {
            
$qryinsert "INSERT INTO tarjetas_usuarios (usuario_id, tarjetas_usuario_id) values ('".$_SESSION['usuario_id']."', ".$tarjetasSeleccionadas[$i].")";
            
$result mysql_query($qryinsert);
            if(
$result$i++;
            }
        }
    }  

  #13 (permalink)  
Antiguo 13/01/2014, 08:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: No escribir si ya se encuentra en la base de datos

"no me funciona" no es una descripción que nos sirva para nada.
Trata de ser más específico.

¿Devuelve un error? ¿Qué error?
¿Es un fallo de MySQL? ¿Una excepción? ¿Un error de sintaxis?
¿Capturaste si devuelve un error en MySQL?
¿Qué hiciste para determinar si viene algo incorrectamente?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 13/01/2014, 08:36
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

Me da Maximum execution time of 90 seconds exceeded in tarjetas-usuario.php on line 15

que es esta linea:

$resultvalidar = mysql_query($validar);

Y debo agregar que igual me diplica lo que tengo.
  #15 (permalink)  
Antiguo 13/01/2014, 08:46
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

No le puedo encontrar el error :(
  #16 (permalink)  
Antiguo 13/01/2014, 08:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: No escribir si ya se encuentra en la base de datos

Desde el punto de vista de BBDD, la tabla la tienes mal definida, porque si es una tabla que relaciona Usuarios con Tarjeta, la PK debería ser (usuario_id, tarjeta_id), es decir, la PK de cada una de las dos tablas es en la tabla relacional la PK de la tabla (PK compuesta).
Sólo con eso la información jamás se duplicaría.
Yo asumo que en lugar de hacer la pK que corresponde le has puesto un ID propio, y no has declarado al menos como UNIQUE un índice sobre los otros dos campos, cosa de proteger la consistencia de datos.

A nivel PHP, me gustaría confirmar si lo que supones que contienen las variables es lo que realmente tienen. En especial porque las estás tratando como cadenas de texto (las pones entre apóstrofos), y por ende si estuviesen vacías, jamás sería detectado un error.
Algo como:
Código PHP:
//Si viene del paso 3 a seleccionar otras tarjetas ejecuta esto
if (isset($_POST['tarjetas'])){
//trae los chekbox y escribe en la tabla.
$tarjetasSeleccionadas=$_POST['tarjetas'];
if (
count($tarjetasSeleccionadas) > 0)
    {
    
$i=0;
    while(
$i count($tarjetasSeleccionadas))
        {
         
$userid $_SESSION["usuario_id"];
         
$tarjeta $tarjetasSeleccionadas[$i];
         echo 
$userid;
         echo 
$tarjeta
        
// Verificar si la combinación ya existe.
        
$validar 'SELECT COUNT(*) total FROM tarjetas_usuarios WHERE usuario_id = "'.$userid.'" AND tarjetas_usuario_id = "'.$tarjeta.'"';
        
$resultvalidar mysql_query($validar) or die(mysql_error());
        
// Si devuelve 
        
$row mysql_fetch_array($resultvalidar);
        if(
$row['total'] == 0)
            {
            
$qryinsert "INSERT INTO tarjetas_usuarios (usuario_id, tarjetas_usuario_id) values ('".$userid."', ".$tarjeta.")";
            
$result mysql_query($qryinsert) or die (mysql_error());
            if(
$result$i++;
            }
        }
    }  

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 13/01/2014, 08:52
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

No, no hay relaciones en este caso. La misma tabla va a relacionar despues pero acá la tabla es asi:

tusuario_id usuario_id tarjetas_usuario_id

El primero es AI el otro mete el id del user que relaciona con otro script a ver quien es el usuario y la tarjeta que relaciona con otro script me muestra las tarjetas.
Eso funciona bien...

Pero no se porque no me evita los checkboxes que ya tengo.

perdón que soy muy nuevo en PHP!


PD el resultado de lo que me pusiste me da un periódico 101101101101101101 porque el user es 10 y la tarjeta es id 1
  #18 (permalink)  
Antiguo 13/01/2014, 09:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: No escribir si ya se encuentra en la base de datos

La tabla no necesita un ID autoincremental propio. Eso es un error de diseño que te está agregando problemas.
El hecho de que generes una tabla que guarda Userid y el id de tarjeta ya define que hay una relación, sea en la base o en la funcionalidad. Por ende, para protegerla deberías redefinir la estructura de la tabla para hacerla correcta. Lo que tienes, por lo que se entiende, no sirve para el uso que intentas hacer.
Esto se nota porque siendo la PK un AI no relacionado con las otras dos claves, nunca te daría error al insertar.
En cuanto a la "duplicidad", por lo que me dices el array que recibes de la lista de tarjetas contiene N veces la misma tarjeta, con lo que sin duda intentará repetirlo.

Creo que deberías revisar la construcción del array en cuestión, ya que estás mandando, como dijes, la información duplicada al script de la inserción, por lo que necesariamente hay un error previo en la toma de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 13/01/2014, 09:11
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

Dices que le quite el IA automático... ? eso resolvería el problema?
  #20 (permalink)  
Antiguo 13/01/2014, 09:44
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

El error es que me esta haciendo el rulo indefinidamente... es eso nada mas...

Este es el código que deseo. El error que veo es el rulo interminable:

Código PHP:
//Si viene del paso 3 a seleccionar otras tarjetas ejecuta esto
if (isset($_POST['tarjetas'])){
//trae los chekbox y escribe en la tabla.
$tarjetasSeleccionadas=$_POST['tarjetas'];
if (
count($tarjetasSeleccionadas) > 0)
    {
    
$i=0;
    while(
$i count($tarjetasSeleccionadas))
        {
        
// Verificar si la combinación ya existe.
        
$validar mysql_query('SELECT * FROM tarjetas_usuarios WHERE usuario_id = "'.$_SESSION["usuario_id"].'" AND tarjetas_usuario_id = "'.$tarjetasSeleccionadas[$i].'"');
        
// Si devuelve 
        
$row mysql_fetch_array($validar);
        if(
$row['tarjetas_usuario_id'] == 0)
            {
            
$qryinsert mysql_query("INSERT INTO tarjetas_usuarios (usuario_id, tarjetas_usuario_id) values ('".$_SESSION["usuario_id"]."', ".$tarjetasSeleccionadas[$i].")");
            
$i++;
        }else{
                echo 
"Seleccione tarjetas que aun no tenga";
            }
        }
    }  

  #21 (permalink)  
Antiguo 13/01/2014, 09:47
 
Fecha de Ingreso: mayo-2009
Mensajes: 166
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: No escribir si ya se encuentra en la base de datos

RESUELTO:

Código PHP:
//Si viene del paso 3 a seleccionar otras tarjetas ejecuta esto
if (isset($_POST['tarjetas'])){
//trae los chekbox y escribe en la tabla.
$tarjetasSeleccionadas=$_POST['tarjetas'];
if (
count($tarjetasSeleccionadas) > 0)
    {
    
$i=0;
    while(
$i count($tarjetasSeleccionadas))
        {
        
// Verificar si la combinación ya existe.
        
$validar mysql_query('SELECT * FROM tarjetas_usuarios WHERE usuario_id = "'.$_SESSION["usuario_id"].'" AND tarjetas_usuario_id = "'.$tarjetasSeleccionadas[$i].'"');
        
// Si devuelve 
        
$row mysql_fetch_array($validar);
        if(
$row['tarjetas_usuario_id'] == 0)
            {
            
$qryinsert mysql_query("INSERT INTO tarjetas_usuarios (usuario_id, tarjetas_usuario_id) values ('".$_SESSION["usuario_id"]."', ".$tarjetasSeleccionadas[$i].")");
            
$i++;
        } else {
                echo 
"Seleccione tarjetas que aun no tenga";
                
$i++;
            }
        }
    }  

  #22 (permalink)  
Antiguo 13/01/2014, 11:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: No escribir si ya se encuentra en la base de datos

Cita:
Iniciado por rakshaka Ver Mensaje
Dices que le quite el IA automático... ? eso resolvería el problema?
No. Estoy diciendo que tienes muy mal construida esa tabla, y por consecuencia estás haciendo una mala inserción de datos.
Eso sin contar con tu error de PHP...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: encuentra, mysql, registro, tabla, usuarios
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 22:22.