Foros del Web » Programando para Internet » PHP »

Validar antes de insertar.

Estas en el tema de Validar antes de insertar. en el foro de PHP en Foros del Web. Buen día, Favor necesito ayuda para impedir insertar datos repetidos. Explico: Estoy haciendo una agenda electronica con sesiones de usuario, cada usuario agrega sus eventos ...
  #1 (permalink)  
Antiguo 08/02/2018, 07:42
 
Fecha de Ingreso: enero-2009
Mensajes: 104
Antigüedad: 9 años, 6 meses
Puntos: 0
Pregunta Validar antes de insertar.

Buen día,

Favor necesito ayuda para impedir insertar datos repetidos.
Explico:
Estoy haciendo una agenda electronica con sesiones de usuario, cada usuario agrega sus eventos y ve solo sus eventos, todo esto funciona, lo que quiero impedir es que un usuario agrege 2 eventos con la misma fecha y hora.
Adjunto codigo.

Código PHP:
<?php
// Definimos nuestra zona horaria
date_default_timezone_set("America/Santiago");

// incluimos el archivo de funciones
include 'funciones.php';

// incluimos el archivo de configuracion
/**/
include 'bd.php';

// Verificamos si se ha enviado el campo con name from
if (isset($_POST['from'])) 
{

    
// Si se ha enviado verificamos que no vengan vacios
    
if ($_POST['from']!="" AND $_POST['to']!=""
    {

$diaexplode("/",$_POST['from']);
$mesexplode("/",$_POST['from']);
$anoexplode("/",$_POST['from']);

        
// Recibimos el fecha de inicio y la fecha final desde el form

        
$inicio _formatear($_POST['from']);
        
// y la formateamos con la funcion _formatear

        
$final  _formatear($_POST['to']);

        
// Recibimos el fecha de inicio y la fecha final desde el form

        
$inicio_normal $_POST['from'];

        
// y la formateamos con la funcion _formatear
        
$final_normal  $_POST['to'];

        
// Recibimos los demas datos desde el form
        
$titulo evaluar($_POST['title']);

        
// y con la funcion evaluar
        
$body   evaluar($_POST['event']);



        
// reemplazamos los caracteres no permitidos
        
$clase  evaluar($_POST['class']);
        
        
$query mysqli_query($mysqli"SELECT * FROM eventos WHERE id_user='$_SESSION[id_user]'")
                                or die(
'error: '.mysqli_error($mysqli));


$data mysqli_fetch_assoc($query);

if (
$data['inicio_normal']=='$inicio_normal') {
    
    echo 
" <script type='text/javascript'> alert('Horario No Disponible!'); </script> ";
}else {                
        
// insertamos el evento
        
$query="INSERT INTO eventos VALUES(null,'$_SESSION[id_user]','$titulo','$body','','$clase','$inicio','$final','$inicio_normal','$final_normal','$dia[0]','$mes[1]','$ano[2]' )";

        
// Ejecutamos nuestra sentencia sql
        
$mysqli->query($query)or die('<script type="text/javascript">alert("Horario No Disponible ")</script>');
 
    
    }
    
    
    
        
// Obtenemos el ultimo id insetado
        
$im=$mysqli->query("SELECT MAX(id) AS id FROM eventos WHERE id_user='$_SESSION[id_user]'");
        
$row $im->fetch_row();  
        
$id trim($row[0]);

        
// para generar el link del evento
        
$link "$base_url"."modulos/calendario/descripcion_evento.php?id=$id";
        

        
// y actualizamos su link
        
$query="UPDATE eventos SET url = '$link' WHERE id = $id AND id_user='$_SESSION[id_user]'";

        
// Ejecutamos nuestra sentencia sql
        
$mysqli->query($query); 

        
// redireccionamos a nuestro calendario
        //header("Location:$base_url"."modulos/calendario/ver.php"); 
    
}
}
 
?>
La fecha se guarda en un campo varchar con formato dd/mm/aaaa h:m (08/02/2018 20:18)
  #2 (permalink)  
Antiguo 08/02/2018, 15:46
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.854
Antigüedad: 9 años, 11 meses
Puntos: 2145
Respuesta: Validar antes de insertar.

Crea una consulta para verificar que el usuario esté disponible. Suponiendo que en inicio y final es donde guardas fecha y hora de inicio y término del evento:

Código MySQL:
Ver original
  1. SELECT COUNT(*) FROM eventos
  2. WHERE id_user = idDeUsuario
  3. AND (
  4.     inicio BETWEEN fechaHoraInicio AND fechaHoraFin
  5.     OR
  6.     final BETWEEN fechaHoraInicio AND fechaHoraFin
  7. )

Reemplaza las variables idDeUsuario, fechaHoraInicio y fechaHoraFin con los datos adecuados; si el resultado es mayor que cero es porque el usuario no está disponible en la fecha y hora elegidos.

Muevo tu tema a MySQL, donde podrán orientarte mejor en cuanto a la lógica de la consulta.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 08/02/2018, 18:21
 
Fecha de Ingreso: enero-2009
Mensajes: 104
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Validar antes de insertar.

Gracias estimado.
Pruebo y comento.
  #4 (permalink)  
Antiguo 13/02/2018, 13:49
 
Fecha de Ingreso: enero-2009
Mensajes: 104
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Validar antes de insertar.

Hola,

Estoy realizando esto pero no me resulta.

Código PHP:
Ver original
  1. $query= "SELECT COUNT(*) FROM eventos WHERE id_user='$_SESSION[id_user]' AND (inicio_normal BETWEEN '$inicio_normal' AND '$final_normal' OR final_normal BETWEEN '$inicio_normal' AND '$final_normal')";
  2. if ($mysqli->query($query)->num_rows){
  3.  
  4.     // Si existen eventos mostramos este mensaje.
  5.         echo '<script type="text/javascript">alert("Horario No Disponible ")</script>';
  6.        
  7.         }else {
  8.                
  9.         // insertamos el evento
  10.         $query="INSERT INTO eventos VALUES(null,'$_SESSION[id_user]','$titulo','$body','','$clase','$inicio','$final','$inicio_normal','$final_normal','$dia[0]','$mes[1]','$ano[2]' )";
  11.  
  12.         // Ejecutamos nuestra sentencia sql
  13.         $mysqli->query($query)/*or die('<script type="text/javascript">alert("Horario No Disponible ")</script>')*/;
  14.  
  15.     }

Puede que este haciendo halgo mal.
Favor ayuda.
  #5 (permalink)  
Antiguo 13/02/2018, 14:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.296
Antigüedad: 10 años, 7 meses
Puntos: 2645
Respuesta: Validar antes de insertar.

Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.

Movido a 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)
  #6 (permalink)  
Antiguo 13/02/2018, 17:32
 
Fecha de Ingreso: noviembre-2015
Mensajes: 228
Antigüedad: 2 años, 8 meses
Puntos: 84
Respuesta: Validar antes de insertar.

Con num_rows se obtiene el número de filas que trae la consulta. Puedes condicionar los números 0 (false) o 1 (true). Si la consulta afecta al más de 1 fila, se evaluará la condicional como false

Para resolverlo cambia la condicional al
Código PHP:
Ver original
  1. if ($mysqli->query($query)->num_rows !=0)
  #7 (permalink)  
Antiguo 13/02/2018, 19:55
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.854
Antigüedad: 9 años, 11 meses
Puntos: 2145
Respuesta: Validar antes de insertar.

El problema es que al hacer un conteo siempre vas a recibir una fila en los resultados, lo que debes hacer es obtener el valor del contador:

Código PHP:
Ver original
  1. // Primero ejecuta la consulta y asígnala a un resultado:
  2. $resultado = $mysqli->query($query);
  3.  
  4. // Debes leer el registro devuelto, como array simple
  5. $row = $resultado->fetch_row();
  6.  
  7. // La consulta generó solo un campo, el resultado de COUNT(), en posición 0 del array
  8. if($row[0] > 0) {
  9.     // No se puede agregar porque ya hay registros en esa fecha y hora
  10. } else {
  11.     // Sí se puede agregar
  12. }
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 14/02/2018, 09:56
 
Fecha de Ingreso: enero-2009
Mensajes: 104
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Validar antes de insertar.

Gracias.
Caso resuelto.

Código PHP:
Ver original
  1. $query= "SELECT COUNT(*) FROM eventos WHERE id_user='$_SESSION[id_user]' AND (inicio_normal BETWEEN '$inicio_normal' AND '$final_normal' OR final_normal BETWEEN '$inicio_normal' AND '$final_normal')";
  2.     // Se ejecuta la consulta y se asígna a un resultado
  3.     $resultado = $mysqli->query($query);
  4.     // Se lee el registro devuelto, como array simple
  5.     $row = $resultado->fetch_row();
  6.     // La consulta generó solo un campo, el resultado de COUNT(), en posición 0 del array
  7.     if($row[0] > 0) {
  8.  
  9.     // Si existen eventos mostramos este mensaje. No se puede agregar porque ya hay registros en esa fecha y hora
  10.         echo '<script type="text/javascript">alert("Horario No Disponible ")</script>';
  11.        
  12.         }else {
  13.                
  14.         // insertamos el evento
  15.         $query="INSERT INTO eventos VALUES(null,'$_SESSION[id_user]','$titulo','$body','','$clase','$inicio','$final','$inicio_normal','$final_normal','$dia[0]','$mes[1]','$ano[2]' )";
  16.  
  17.         // Ejecutamos nuestra sentencia sql
  18.         $mysqli->query($query);
  19.  
  20.     }



La zona horaria es GMT -6. Ahora son las 14:12.