Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Victor26 en 8 Febrero 2020, 19:41 pm



Título: Problema insert de datos en PHP
Publicado por: Victor26 en 8 Febrero 2020, 19:41 pm
Buenas a todos, les pido el favor para una colaboracion para un tema que estoy haciendo y no se como solucionarlo.
ESTE ES EL INDEX:
(https://i.ibb.co/Sr6YR1d/Captura-de-pantalla-de-2020-02-08-12-47-17.png)
Resulta que estoy realizando un formulario donde digito informacion acerca del usuario que voy a ingresar, el numero de factura, iva, fecha de creacion de la factura y fecha de entrega. Esa informacion no necesito repetirla, porque es unica.
Pero la informacion que tengo a la izquierda es el codigo y cantidad del producto que deseo anotar, Ahora.. Abajo tengo un boton llamado "+", el cual se encarga de cojer esos dos inputs del lado de la izquierda y repetirlos, para poder digitar otros codigos de productos, y todo eso me da normal...
El problema que veo es que al momento de yo mandar los datos a travez del boton "Submit", el los manda pero no se como hacer para que en el sistema del INSERT se pueda digitar las variables que ya estan asociadas (Numero de factura, Usuario, Iva, Fecha de Creacion y Entrega), con las que estoy repitiendo (Codigo y Cantidad).

PD: Ya encontre como mandar un grupo de array por php a mysql que seria asi
Código
  1. <?php
  2. include("../conexion_mysql.php");
  3. $numfact = $_POST['numfact'];
  4. $codigo  = $_POST['codigo'];
  5. $cantid  = $_POST['cantidad'];
  6. $usuari  = $_POST['user'];
  7. $iva = $_POST['iva'];
  8. $fc = $_POST['fc'];
  9. $fe = $_POST['fe'];
  10. $vtotal  = 0;
  11. $cadena  = "INSERT INTO factura (num_factura, codigo, usuario, cantidad, iva, fechacrea, fechaentre, vtotal) VALUES ";
  12.  
  13. for ($i=0; $i < count($codigo); $i++) {
  14. $cadena.= "(".$numfact[$i]."', '".$codigo[$i]."', '".$usuari[$i]."', '".$cantid[$i].",".$iva[$i]."', '".$fc[$i]."', '".$fe[$i]."', '".$vtotal[$i]."'),";
  15. }
  16.  
  17. echo json_encode(array('cadena' => $cadena));
  18. $cadena_final = substr($cadena, 0,-1);
  19. $cadena_final.=";";
  20. $sql = mysqli_query($conectar, $cadena_final);
  21. if ($sql) {
  22. header("location:index.php");
  23. }else {
  24. echo 'Error';
  25. }
  26. $mysqli = mysqli_close($conectar);
  27.  
  28. ?>

Pero ovbiamente al momento de mandar me sale un error que este.
Código:
<br />
<b>Notice</b>:  Trying to access array offset on value of type int in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
<br />
<b>Notice</b>:  Undefined offset: 1 in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
<br />
<b>Notice</b>:  Undefined offset: 1 in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
<br />
<b>Notice</b>:  Undefined offset: 1 in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
<br />
<b>Notice</b>:  Undefined offset: 1 in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
<br />
<b>Notice</b>:  Undefined offset: 1 in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type int in <b>/opt/lampp/htdocs/MiPagina/php/Facturacion/validarfactu.php</b> on line <b>15</b><br />
{"cadena":"INSERT INTO factura (num_factura, codigo, usuario, cantidad, iva, fechacrea, fechaentre, vtotal) VALUES ('01', '1234', 'usuario', '5,5', '2020-02-08', '2020-02-20', ''),('', '1235', '', '6,', '', '', ''),"}

Utilizo Jquery por el metodo JSON para mandar los datos de html a php
el HTML es este:
Código
  1. <section class="cuerpo">
  2. <form method="POST" action="validarfactu.php" class="factura">
  3. <div class="container">
  4. <div class="row">
  5. <div class="col-12 col-sm-6">
  6. <br><label for="nf">Numero de Factura</label>
  7.    <br><input type="number" id="nf" name="numfact[]">
  8.    <br><label for="code">Cliente</label>
  9.    <br><select name="user[]">
  10.     <option>Seleccione el cliente</option>
  11.     <?php
  12.     $sql = "SELECT usuario FROM usuario";
  13.     $consulta = mysqli_query($conectar, $sql);
  14.     while ($mover = mysqli_fetch_array($consulta)){
  15.     ?>
  16.     <option value="<?php echo $mover['usuario']; ?>"><?php echo $mover['usuario']; ?></option>
  17.    <?php }?>
  18.    </select>
  19.    <br><label for="iva">IVA</label>
  20.    <br><input type="number" id="iva" name="iva[]">
  21.    <br><label for="fc">Fecha de Creacion</label>
  22.    <br><input type="date" id="fc" name="fc[]">
  23.    <br><label for="fe">Fecha de Entrega</label>
  24.    <br><input type="date" id="fe" name="fe[]">
  25. </div>
  26.  
  27. <div class="col-12 col-sm-6 repetido">
  28.    <label for="code">Codigo</label>
  29.    <br><input id="code" type="number" name="codigo[]">
  30.    <br><label for="cantidad">Cantidad</label>
  31.    <br><input type="number" id="cantidad" name="cantidad[]">
  32. </div>
  33.  <button type="submit" class="btn btn-primary submit">Submit</button>
  34. </div>
  35. </div>
  36. </form>
  37. <center><input type="submit" id="agregar" value="+"></center>
  38. </section

el Jquery
Código
  1. // CLONAR Y ELIMINAR INPUT
  2.  
  3. $(document).ready(function(e){
  4. // VARIABLES
  5. var html = '<center><div><label for="code">Codigo</label><br><input id="code" type="number" name="codigo[]"><br><label for="cantidad">Cantidad</label><br><input type="number" id="cantidad" name="cantidad[]"><br> <hr><button id="exit">X</button></div></center>';
  6. // CLONAR
  7. $("#agregar").click(function(){
  8. $(".repetido").append(html);
  9. });
  10. // ELIMINAR
  11. $(".repetido").on('click','#exit',function(){
  12. $(this).parent('div').remove();
  13. });
  14. });
  15.  
  16.  
  17.  
  18. // PETICION TIPO AJAX
  19.  
  20. jQuery(document).on('submit','.factura',function(event){
  21. event.preventDefault();
  22. jQuery.ajax({
  23. url: 'validarfactu.php',
  24. type: 'POST',
  25. dataType: 'json',
  26. data: $(this).serialize(),
  27. })
  28. .done(function(respuesta){
  29. console.log(respuesta);
  30. if(!respuesta.error) {
  31. alert("Los datos se ingresaron correctamente");
  32. }else {
  33. alert("Los datos NO se ingresaron correctamente");
  34. }
  35. })
  36. .fail(function(resp){
  37. console.log(resp.responseText);
  38. })
  39. .always(function(){
  40. console.log("complete");
  41. })
  42. });

Alguna persona que me pueda colaborar?, por favor gracias  :D


Título: Re: Problema insert de datos en PHP
Publicado por: WHK en 9 Febrero 2020, 01:32 am
El problema erstá acá:

Código:
	for ($i=0; $i < count($codigo); $i++) { 
$cadena.= "(".$numfact[$i]."', '".$codigo[$i]."', '".$usuari[$i]."', '".$cantid[$i].",".$iva[$i]."', '".$fc[$i]."', '".$fe[$i]."', '".$vtotal[$i]."'),";
}

Estás haciendo un for con una cantidad de vueltas igual a la longitud de $codigo, pero no todos los campos ingresados tienen la misma longitud, por lo cual cuando php intenta acceder al itemd e un array a traves del valor de $i este arroja un error porque el array no tiene esa cantidad de datos. Lo que no se sabe es cual de todos los datos exactamente no tiene la misma cantidad de registros, pero por otro lado tampoco tienes un control que indique que todos los arrays deben tener la misma cantidad de datos.

Haz algo, haz un print_r() a todos los datos antes de procesarlos y cuentalos. Tambien puedes probar con count($codigo)-1 ya que debes contar el valor 0 del array.

Saludos.