Comunidad de diseño web y desarrollo en internet online

Php - Mysql - Ajax guarda 1 registro varias veces

Citar            
MensajeEscrito el 11 Jul 2013 04:03 pm
Tengan un saludo cordial, primero agradecer a muchos miembros de estos foros ya que gracias a ellos eh ido armando poco a poco un trabajo, pero ya eh llegado a un punto que no se que hacer y espero puedan ayudarme, muy agradecido de antemano.

Ayudando a una amiga me eh puesto a desarrollar un pequeño proyecto en PHP y Mysql.
Todo iba bien hasta que me dijo que su profesor queria que utilize los ultimos lenguajes y todo eso, osea Javascript, Jquery, Ajax :cry: y bueno es como si me hubieran hablando de la teoria de la relatividad, pero buscando en la web manuales foros recomendaciones logre hacer algo bonito o bueno pasable.
Primero les explico como esta estructurada la pagina (espero y no sea muy largo)
Tengo una pagina menu, en el cual eh creado mi menu con CSS, dentro de esta pagina tengo dos div, los cuales uso como contenedores para la pagina del formulario y para el script php que sirve para seleccionar los datos.

Script de la pagina principal con el menu.

Código HTML :

<?php
session_start();
if (!isset($_SESSION['nombre_usuario'])) {
header("Location: index.html");
} 
?>
   <header>
      <center>
      <img src="img/encabezado.png">
      </center>
   </header>
   <center>
   <nav id = "menu">
      <ul id = "nav">
         <li><a href="#">Registro</a>
             <ul>
                <li><a href="#" onclick="formulariocliente(); cargarcliente(); return false">Cliente</a></li>
                <li><a href="php/proveedor.php" target= "contenido">Proveedor</a></li>
                <li><a href="php/usuario.php" target = "contenido">Usuario</a></li>
                <li><a href="php/marca.php" target = "contenido">Marca</a></li>
                <li><a href="php/grupo.php" target = "contenido">Grupo</a></li>
                <li><a href="php/producto.php" target = "contenido">Producto</a></li>
             </ul>
         </li>
 
         <li><a href="#">Procesos Comerciales</a>
            <ul>
                <li><a href="javascript:mostrar('Ventas')">Ventas</a></li>
                <li><a href="javascript:mostrar('Compras')">Compras</a></li>                
             </ul>
         </li>
 
         <li><a href="#">Reportes</a>
            <ul>
               <li><a href="javascript:mostrar('RClientes')">Reporte de Clientes</a></li>
               <li><a href="javascript:mostrar('RProductos')">Reporte de Productos</a></li>
               <li><a href="javascript:mostrar('RCompras')">Reporte de Compras</a></li>
               <li><a href="javascript:mostrar('RVentas')">Reporte de Ventas</a></li>
            </ul>
         </li>
         <li><a href="php/cerrar_sesion.php">Cerrar Sesion</a>
         </li>         
      </ul>
   </nav>   
</center>
<center>
   <section id = "cuerpo">
      <article id = "contenido">
         <div id = "formulario">
         </div>
         <div id = "resultado">            
         </div>         
   </section>
</center>


Por ahora solo esta funcional el enlace para cliente, ya que el resto de enlaces solo se coloco como referencia.
En el enlacede cliente, estoy llamando a dos funciones en Javascript que me ayudan a cargar los contenidos en los divs.

Código Javascript :

   function cargarcliente(valor){
      val = valor;
      $("#resultado").load("../php/cliente.php", {pagina: val});
   }

   function formulariocliente()
   {
        $('#formulario').load('../formularios/formulario_cliente.html');
   }   


La funcion cargar cliente, recibe un valor ya que uso una paginación, en los mismos divs.


Script del formulario

Código HTML :

<center>
      <div id = "cliente">            
      <div id ="titulo">
         <h2>Registro de Clientes</h2>
      </div>
      <div id = "form">
         <div id = "izquierda">
            <form  id = "formulario_cliente" action= "#">
            <fieldset  style="border:6px groove #ccc; text-align:left;">
               <legend style="font-size:16px;">Ingresar Datos</legend>
               <label class = "etiquetas">Documento</label><br>
               <input type="text" id="documento" value="" class = "cuadros"/><br>
               <label class = "etiquetas">Nombre</label><br>
               <input type="text" id="nombre" value="" class = "cuadros"/><br>
               <label class = "etiquetas">Direccion</label><br>
               <input type="text" id="direccion" value="" class = "cuadros"/><br>
               <label class = "etiquetas">Telefono</label><br>
               <input type = "text" id="telefono" value ="" class = "cuadros"/><br>
            </fieldset>
            
         </div>
         <div id = "derecha">
            <div class="boton">
            <button id = "enviar_cliente" type="submit" class = "botones" >Registrar</button>      
            <p>   
            <button id = "limpiar_cliente" type="reset" class = "botones">Limpiar</button>
            </div>
            <p>

            <div id = "mensaje-error" style="Display: none; color: black;">               
            </div>            
         </div>
         </form>
      </div>
   </center>

El formulario es enviado usando ajax

Código Javascript :

$(document).ready(function() {
   $("#mensaje-error").css("display", "none"); // Con esto ocultamos el div con el mensaje
   $("#enviar_cliente").click(function() {
      //Obtenemos el valor del campo nombre
      var documento = $("input#documento").val();
      var nombre = $("input#nombre").val();
      var direccion = $("input#direccion").val();
      var telefono = $("input#telefono").val();
      //Validamos el campo nombre, simplemente miramos que no esté vacío
      if (documento == "" || nombre == "" || direccion == "" || telefono == "") {
         $("#mensaje-error").show();
         $("#mensaje-error").html("<img src='../img/error.png' width = '20%'' heigth = '20%'' /><br><label>Completar todos los datos</label>");
         setTimeout("$('#mensaje-error').fadeOut(3000)")
         $("input#documento").focus();
         return false;
      }

      //Construimos la variable que se guardará en el data del Ajax para pasar al archivo php que procesará los datos
      var dataString = 'documento=' + documento + '&nombre=' + nombre + '&direccion=' + direccion + '&telefono=' + telefono;

      $.ajax({
         type: "POST",
         url: "../php/registrar_cliente.php",
         data: dataString,
         beforeSend:function(){
            $("#mensaje-error").show();
            $("#mensaje-error").html("<img src='../img/cargando.gif' width = '20%'' heigth = '20%'' />");            
            },
         success: function() {
            $("#mensaje-error").show();
             setTimeout("$('#mensaje-error').fadeOut(1000)")
            $("#mensaje-error").html("<img src='../img/correcto.png' width = '20%'' heigth = '20%'' />");            
            $("input#documento").val('');
            $("input#nombre").val('');
            $("input#direccion").val('');
            $("input#telefono").val('');
            $("input#documento").focus();   
            cargarcliente();
          }
      });
      return false;
   });
});


Script PHP para registrar al cliente

Código PHP :

<?php
include ("conexion.php");
$doc = $_POST["documento"];
$nom = $_POST["nombre"];
$dir = $_POST["direccion"];
$tel = $_POST["telefono"];
//$fecha = date('Y/m/d');

$sql = "insert into cliente (Documento, Nombre, Direccion, Telefono) values ('$doc', '$nom', '$dir', '$tel')";

$result = mysql_query($sql, $conexion);
if (!$result) {
echo("Fallo en la insercion de registro en la Base de Datos:" . mysql_error());
}else{
   echo "exito";
}
include ("cerrar_conexion.php");

?>


y por ultimo este es el script que uso para llamar los datos de mysql, se que la manera de paginar talvez no sea la correcta incluso talvez sea muy cavernícola, pero realmente no programo en php asi que trate de inmprovisar, disculpen las faltas en la programacion.

Código PHP :

<?php         
   include ("conexion.php");
   $pagina = $_POST["pagina"];
   $registros_paginas = 10; //Numero maximo de registro por pagina
   $inicio = $pagina * $registros_paginas;

   $result_total_registros  = mysql_query("SELECT * FROM cliente  ORDER BY id_cliente", $conexion); 
   $total_registros =  mysql_num_rows($result_total_registros);
   $result_consulta_mostrar = mysql_query("SELECT * FROM cliente  ORDER BY id_cliente DESC LIMIT ". $inicio .", 10 ", $conexion);                   
   $numero_pagina = ceil(($total_registros/$registros_paginas)); // Numero de paginas segun cantidad de registros

   echo "<table id='datos'> \n"; 
   echo "<tr id='titulos'>
      <td width = '30'></td>
      <td width = '30'></td>                                    
      <td width ='100' >Documento</td>
      <td width='220' >Nombre</td>
      <td width='350' >Direccion</td>
      <td width='150' >Telefono</td></tr> \n"; 
   while ($row = mysql_fetch_row($result_consulta_mostrar)){ 
   echo "<tr>
       <td id = 'chk'><input name='checkbox[]' id='checkbox[]' type='checkbox' value= $row[0]></td>
       <td id = 'borrar'><IMG SRC='../img/borrar.png' WIDTH=16 HEIGHT=16 BORDER=0 ALT='Eliminar' ALIGN='center'> </td>
         <td>$row[1]</td>
         <td>$row[2]</td>                
         <td>$row[3]</td>                
         <td>$row[4]</td></tr> \n";       
      } 
   echo "</table> \n"; 
   echo "[";
   echo " ";
   for($i = 1; $i <= $numero_pagina; $i++){
      $pag = $i - 1;            
      echo "<a href = '#' onclick='cargarcliente(".$pag."); return false'>$i</a>";            
      echo " ";         
      }         
      $pagina = $total_registros - 10;
   echo "]";
?>



Bueno despues de tanto codigo, les explico mi problema, cuando le doy click en el boton para guardar, la primera vez guarda dos regitros completamente iguales, pero con codigo diferente (el codigo es autoincrement) se borran los datos y si lleno de nuevo el formulario y vuelvo a darle click en el boton esta vez me guarda 4 veces lo mismo, si de nuevo lleno y guardo se guarda 8 veces y asi sigue duplicandose, lo eh probado y ha llegado hasta 512 registros :'( hasta ahora no eh podido encontrar el problema, eh buscado pero no encuentro la solucion, si alguien podria ayudarme le agradeceria de antemano, les dejare en un enlace tambien los archivos y la base de datos, gracias de antemano.
Nota: hace algunas semanas atras en un foro x realize una pregunta y bueno hubo personas que lo primero que dijeron fue, busca no seas ocioso esto y lo otro, pero bueno esta programacion que eh realizado lo eh hecho buscando informacion de internet con libros y manuales, antes de publicar este post, eh buscando 3 dias en internet pero realmente no eh encontrado solucion, disculpen de antemano cualquier molestia, gracias.

Link del archivo
https://skydrive.live.com/embed?cid=E444745E0078692D&resid=E444745E0078692D%212427&authkey=AHXbGx2gPLW1XOQ

[url]skydrive.live.com/embed?cid=E444745E0078692D&resid=E444745E0078692D%212427&authkey=AHXbGx2gPLW1XOQ][/url]

Por caronte90

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Jul 2013 09:54 pm
Hola caronte90:
Qué tal ? mira mis conocimientos de JQuery son limitados pero , te haré una pregunta cuando envías los datos se te recarga la pagina? Por el return false; que usas no debería pero no está de mas preguntar . Es bueno saber que también si lo deseas puedes usar la función de JQuery preventDefault(); hace lo mismo.
En las pocas pruebas que he hecho he dejado el atributo action vacio o no lo he puesto.
Usas un debuger tipo Firebug o el de chrome,podrás controla la salida y la cantidad de peticiones que se hacen , con esto es fácil. Lo mismo controlar la respuesta echo que haces con PHP, ya que el hecho de que el envío en Ajax sea exitoso no significa que los resultados en tu archivo PHP sena válidos. esto es muy facil:

Código Javascript :

$.ajax({
                      type:"POST",
                      url:"una-URL",
                         data:datos,
                      success: function(respuesta){
                                      $(#mensaje-error).html(mensaje);
                                 });

Para enviar furmularios con jQuery también tienes la función .submit();
Son algunos datos que te puedo dar, siempre todas las soluciones las encontré haciendo estos debugs.
suerte

Por maximil13

70 de clabLevel



Genero:Masculino  

Programador, estudiante de sistemas.

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.