Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Elizabeth1999 en Junio 22, 2020, 11:53:58 PM

Título: Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 22, 2020, 11:53:58 PM
Hola, buenas noches. Estoy haciendo un sistema en php. Paso los datos del formulario a otro archivo con el método Post y luego a mi archivo en donde están mis funciones para actualizar, eliminar e insertar, el problema es que no inserta los datos. Este es el código que estoy usando:
Código (php) [Seleccionar]
public function crearCotizacion(){
$c= new conectar();
$conexion=$c->conexion();

date_default_timezone_set("America/Lima");
$fecha = date("d-m-Y H:i:s");

$idventa = self::creaFolio();
$idclient= self::nombreCliente($idCliente);

$datos=$_SESSION['tablaCotizacionTemp'];
$datos2=$_SESSION['tablaCotizacionCienteTemp'];

$idusuario=$_SESSION['iduser'];
$id_cotizacion = "4";
$r=0;

for ($i=0; $i < count($datos) ; $i++) {
$d=explode("||", $datos[$i]);

for ($j=0; $j < count($datos2) ; $j++) {
$e=explode("||", $datos2[$j]);

$mysqli->query("INSERT INTO prints(
id_user,
dateOrder,
delivery_term,
delivery_method,
warehouse)
VALUES(
'$idusuario',
'$fecha',
'$e[5]',
'$e[6]',
'$e[7]')");

$mysqli->query("INSERT INTO quotes(
id_clients,
id_print,
dateQuo,
way_to_pay,
comments,
type_of_currency
)VALUES(
'$e[8]',
'$mysqli->id_print',
'$e[1],
'$e[2]',
'$e[4]',
'$e[3]')");

$mysqli->query("INSERT INTO detail_quo(
id_quotation,
description,
unit_of_measurement,
time_garanty,
quantity,
price_unit,
price_discount,
sub_total
)VALUES(
'$mysqli->id_quotation',
'$d[0]',
'$d[1]',
'$d[2]',
'$d[3]',
'$d[4]',
'$d[5]',
'$d[6]')");
$mysqli->query("INSERT INTO pay(
id_detail_quo,
quo_total,
igv,
total_igv,
)VALUES(
'$mysqli->id_detail_quo',
'$d[8]',
'$d[9]',
'$d[10]')");

$r=$r + $result=mysqli_query($conexion,$sql);
}
}

return $r;
self::descuentaCantidad($d[0], 1);
}
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: d3adly en Junio 23, 2020, 12:47:51 AM
Hola @Elizabeth1999 (https://underc0de.org/foro/index.php?action=profile;u=88357)
Que error te devuelve?
Has verifiado si las variables que le estas pasando no estan vacias?
Verifica si el servidor al cual realiza la peticion esta activo y tienes permisos para realizar la insercion de datos. Si no tienes activada la opcion de display_errors en el archivo de configuracion de php, activalo y vuelve a probar, asi obtienes informacion mas detallada de cual podria ser el error. Tambien puedes probar agregando lo siguiente al inicio del archivo que realiza la peticion al servidor sql:
Código (php) [Seleccionar]

error_reporting(E_ALL);
display_errors(true);


Saludos
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: DtxdF en Junio 23, 2020, 12:50:17 AM
Hola @Elizabeth1999 (https://underc0de.org/foro/index.php?action=profile;u=88357)

En el siguiente snippet, en vez de ir así:
Código (php) [Seleccionar]
      return $r;
      self::descuentaCantidad($d[0], 1);


No fuera mejor de esta manera:
Código (php) [Seleccionar]
      self::descuentaCantidad($d[0], 1);
      return $r;


Lo digo porque estarías retornando e impidiendo que ejecutes el método "descuentaCantidad".

También te aconsejo (y esto es un tema de seguridad) que manejes correctamente los datos para evitar una inyección SQL

O si es un error interno (ya sea del servidor, parte del código o de esta clase) haz lo que te indica @d3adly y muestranos directamente el error.

~ DtxdF
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 01:24:09 AM
descuenta cantidad llama a otra función

Código (php) [Seleccionar]
$mysqli->query("INSERT INTO detail_quo(
id_quotation,
description,
unit_of_measurement,
time_garanty,
quantity,
price_unit,
price_discount,
sub_total
)VALUES(
'$mysqli->id_quotation',
'$d[0]',
'$d[1]',
'$d[2]',
'$d[3]',
'$d[4]',
'$d[5]',
'$d[6]')");
$mysqli->query("INSERT INTO pay(
id_detail_quo,
quo_total,
igv,
total_igv,
)VALUES(
'$mysqli->id_detail_quo',
'$d[8]',
'$d[9]',
'$d[10]')");

$r=$r + $result=mysqli_query($conexion,$sql)or die(mysqli_error($db));
}
}

return $r;
self::descuentaCantidad($d[0], 1);
}
/*
$sql="INSERT into ventas (id_venta,
id_cliente,
id_producto,
id_usuario,
precio,
fechaCompra)
values ('$idventa',
'$d[5]',
'$d[0]',
'$idusuario',
'$d[3]',
'$fecha')";
*/
public function descuentaCantidad($idproducto, $cantidad)
{
$c = new conectar();

$conexion = $c -> conexion();

$sql = "SELECT cantidad
from articulos
where id_producto = '$idproducto'";

$result = mysql_query($conexion, $sql);

$cantidad = mysql_fetch_row($result)[0];

$cantidadNueva = abs($cantidad - $cantidad1);

$sql = "UPDATE articulos set cantidad = '$cantidadNueva'
where id_producto = '$id_producto'";
mysql_query($conexion, $sql);
}

public function creaFolio()
{
$c= new conectar();
$conexion=$c->conexion();

$sql="SELECT id_print from prints group by id_print desc";

$resul=mysqli_query($conexion,$sql);
$id=mysqli_fetch_row($resul)[0];

if($id=="" or $id==null or $id==0){
return 1;
}else{
return $id + 1;
}
}
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: d3adly en Junio 23, 2020, 01:44:15 AM
@Elizabeth1999 (https://underc0de.org/foro/index.php?action=profile;u=88357) lo que sucede es como te explica @DtxdF (https://underc0de.org/foro/index.php?action=profile;u=71723) en esta seccion:
Código (php) [Seleccionar]

return $r;
self::descuentaCantidad($d[0], 1);

La llamada a descuentaCantidad nunca se realiza ya que antes haces un return lo cual termina la ejecucion de la funcion crearCotizacion, respecto a lo de insercion prueba lo antes mencionado. Tambien verifica la clase conectar.
De donde proviene la variable $sql?, asumiendo por el codigo proporcionado es posible que tu error radique en esta seccion ya que la variable puede estar vacia
Código (php) [Seleccionar]

$r=$r + $result=mysqli_query($conexion,$sql)

Activa la opcion de display_errors en el archivo de configuracion, asi podras localizar mas facil tu error.
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 01:02:04 PM
Quisiera saber si el insert que estoy haciendo está bien


Código (php) [Seleccionar]
public function crearCotizacion(){
$c= new conectar();
$conexion=$c->conexion();

date_default_timezone_set("America/Lima");
$fecha = date("d-m-Y H:i:s");

//$idventa = self::creaFolio();
//$idclient= self::nombreCliente($idCliente);

$datos=$_SESSION['tablaCotizacionTemp'] && $_SESSION['tablaCotizacionCienteTemp'];
//$datos2=$_SESSION['tablaCotizacionCienteTemp'];

$idusuario=$_SESSION['iduser'];
$id_cotizacion = "1";
$r=0;

for ($j=0; $j < count($datos2) ; $j++) {
$e=explode("||", $datos2[$j]);

for ($i=0; $i < count($datos) ; $i++) {
$d=explode("||", $datos[$i]);

$mysqli->query("INSERT INTO prints(
id_user,
dateOrder,
delivery_term,
delivery_method,
warehouse)
VALUES(
'$idusuario',
'$fecha',
'$e[5]',
'$e[6]',
'$e[7]')");

$mysqli->query("INSERT INTO quotes(
id_clients,
id_print,
dateQuo,
way_to_pay,
comments,
type_of_currency
)VALUES(
'$e[8]',
'$mysqli->id_print',
'$e[1],
'$e[2]',
'$e[4]',
'$e[3]')");

$mysqli->query("INSERT INTO detail_quo(
id_quotation,
description,
unit_of_measurement,
time_garanty,
quantity,
price_unit,
price_discount,
sub_total
)VALUES(
'id_cotizacion',
'$d[0]',
'$d[1]',
'$d[2]',
'$d[3]',
'$d[4]',
'$d[5]',
'$d[6]')");
$mysqli->query("INSERT INTO pay(
id_detail_quo,
quo_total,
igv,
total_igv,
)VALUES(
'$mysqli->id_detail_quo',
'$d[8]',
'$d[9]',
'$d[10]')");

$r=$r + $result=mysqli_query($conexion,$mysqli)or die(mysqli_error($db));
}
}

return $r;
//self::descuentaCantidad($d[0], 1);
}public function crearCotizacion(){
$c= new conectar();
$conexion=$c->conexion();

date_default_timezone_set("America/Lima");
$fecha = date("d-m-Y H:i:s");

//$idventa = self::creaFolio();
//$idclient= self::nombreCliente($idCliente);

$datos=$_SESSION['tablaCotizacionTemp'] && $_SESSION['tablaCotizacionCienteTemp'];
//$datos2=$_SESSION['tablaCotizacionCienteTemp'];

$idusuario=$_SESSION['iduser'];
$id_cotizacion = "1";
$r=0;

for ($j=0; $j < count($datos2) ; $j++) {
$e=explode("||", $datos2[$j]);

for ($i=0; $i < count($datos) ; $i++) {
$d=explode("||", $datos[$i]);

$mysqli->query("INSERT INTO prints(
id_user,
dateOrder,
delivery_term,
delivery_method,
warehouse)
VALUES(
'$idusuario',
'$fecha',
'$e[5]',
'$e[6]',
'$e[7]')");

$mysqli->query("INSERT INTO quotes(
id_clients,
id_print,
dateQuo,
way_to_pay,
comments,
type_of_currency
)VALUES(
'$e[8]',
'$mysqli->id_print',
'$e[1],
'$e[2]',
'$e[4]',
'$e[3]')");

$mysqli->query("INSERT INTO detail_quo(
id_quotation,
description,
unit_of_measurement,
time_garanty,
quantity,
price_unit,
price_discount,
sub_total
)VALUES(
'id_cotizacion',
'$d[0]',
'$d[1]',
'$d[2]',
'$d[3]',
'$d[4]',
'$d[5]',
'$d[6]')");
$mysqli->query("INSERT INTO pay(
id_detail_quo,
quo_total,
igv,
total_igv,
)VALUES(
'$mysqli->id_detail_quo',
'$d[8]',
'$d[9]',
'$d[10]')");

$r=$r + $result=mysqli_query($conexion,$mysqli)or die(mysqli_error($db));
}
}

return $r;
//self::descuentaCantidad($d[0], 1);
}
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: DtxdF en Junio 23, 2020, 03:02:06 PM
Si mi vista no falla en esta ocasión @Elizabeth1999 (https://underc0de.org/foro/index.php?action=profile;u=88357), la sintaxis está bien, pero si es un error que te genera en tiempo de ejecución sería primordial que nos lo mostraras para poder ayudarte, cualquier cosa aquí estamos pendientes  :D

~ DtxdF
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 03:06:00 PM
este es el error que me da actualmente
Código (html5) [Seleccionar]
<br />
<font size='1'><table class='xdebug-error xe-warning' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\1ejemplo\class\quotes.php on line <i>21</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0006</td><td bgcolor='#eeeeec' align='right'>242672</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp64\www\1ejemplo\processes\ventas\llenarFormCotizacion.php' bgcolor='#eeeeec'>...\llenarFormCotizacion.php<b>:</b>0</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0026</td><td bgcolor='#eeeeec' align='right'>284768</td><td bgcolor='#eeeeec'>cotizaciones->obtenDatosProducto(  )</td><td title='C:\wamp64\www\1ejemplo\processes\ventas\llenarFormCotizacion.php' bgcolor='#eeeeec'>...\llenarFormCotizacion.php<b>:</b>8</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0043</td><td bgcolor='#eeeeec' align='right'>294512</td><td bgcolor='#eeeeec'><a href='http://www.php.net/function.mysqli-fetch-row' target='_new'>mysqli_fetch_row</a>
(  )</td><td title='C:\wamp64\www\1ejemplo\class\quotes.php' bgcolor='#eeeeec'>...\quotes.php<b>:</b>21</td></tr>
</table></font>
{"description":null,"unit_of_measurement":null,"time_garanty":null,"quantity":null,"price_unit":null,"price_discount":null,"sub_total":null}
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 03:08:10 PM
en la anterior respuesta me sale que no estoy pasando los datos, null
esta es mi función que está dentro del archivo en donde se encuentra el formulario
$('#btnAgregaCotizacion').click(function(){
         vacios=validarFormVacio('regCot');
         if(vacios > 0){
            alertify.alert("Debes llenar todos los campos");
            return false;
         }
         datos=$('#regCot').serialize();
         $.ajax({
            type:"POST",
            data:datos,
            url:"../processes/ventas/agregaCotizacionTemp.php",
            success:function(r){
               $('#tablaCotizacionTemp').load("./cotizacion/tablaCotizacionTemp.php");
            }
         });
      });
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 03:11:56 PM
este es el archivo agregaCotizacionTemp.php
<?php
   session_start();
   require_once "../../class/conexion.php";

   $c= new conectar();
   $conexion=$c->conexion();

   /*$total_producto=0;
   $calc_igv = "";
   $total_a_pagar= "";*/

   $descripcion=$_POST['descripcion'];
   $unidadMedida=$_POST['unidadMedida'];
   $tiemgaranty=$_POST['tiemgaranty'];

   $cantidadC=$_POST['cantidadC'];
   $priceunit=$_POST['priceunit'];
   $priceDes=$_POST['priceDes'];
   
   $subtotalRes=$_POST['subtotalRes'];

   /*$total_producto=$total_producto+$subtotalRes;   
   $i++;
   $calc_igv=$total_producto*0.18;
   $total_a_pagar = $calc_igv + $total_producto;*/

   $articulo =  $descripcion."||".
            $unidadMedida."||".
            $tiemgaranty."||".
            $cantidadC."||".
            $priceunit."||".
            $priceDes."||".
            $subtotalRes;
            /*$total_producto."||".
            $calc_igv."||".
            
            $total_a_pagar*/

   $_SESSION['tablaCotizacionTemp'][] = $articulo;

?>
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 03:19:23 PM
esta es mi función crearCotizacion, por ahora estoy intentando pasar los datos a una sola tabla, ya que actualmente no inserta a ninguna :'v
P. D. en mis tablas usuarios, clientes, almacén si inserta bien, y estoy utilizando lo mismo, solo que para este caso tengo que pasar los datos de dos formularios, pero por ahora estoy tratando de insertar los datos solo a  la tabla detail_quo
function crearCotizacion(){
      $.ajax({
         //type:"POST",
         //data:"idcotizacioncliente=" + $('#regClient').val(), /*pasar los datos de las dos tablas*/
             //"idcotizacion=" + $('#regCot').val(),
         url:"../processes/ventas/crearcotizacion.php",
         success:function(r){
            if(r > 0){
               $('#tablaCotizacionTemp').load("./cotizacion/tablaCotizacionTemp.php");
               $('#regCot')[0].reset();
               /*$('#tablaCotizacionCienteTemp').load("./cotizacion/tablaCotizacionTemp.php");
               $('#regClient')[0].reset();*/
               alertify.alert("Cotización creada con éxito. consulte la información de esta, en lista de cotizaciones.");
            }else if(r==0){
               alertify.alert("No hay lista de cotización");
            }else{
               alertify.error("No se pudo crear la cotización");
            }
         }
      });
   }
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Elizabeth1999 en Junio 23, 2020, 03:24:27 PM
Esta es mi actual función de crearCotización que está dentro de mi carpeta clases:
public function crearCotizacion(){
      $c= new conectar();
      $conexion=$c->conexion();

      date_default_timezone_set("America/Lima");
      $fecha = date("d-m-Y H:i:s");

      //$idventa = self::creaFolio();
      //$idclient= self::nombreCliente($idCliente);

      $datos=$_SESSION['tablaCotizacionTemp'] /*&& $_SESSION['tablaCotizacionCienteTemp']*/;
      //$datos2=$_SESSION['tablaCotizacionCienteTemp'];

      $idusuario=$_SESSION['iduser'];
      $id_cotizacion = "3";
      $r=0;

      /*for ($j=0; $j < count($datos2) ; $j++) {
         $e=explode("||", $datos2[$j]);*/

         for ($i=0; $i < count($datos) ; $i++) {
            $d=explode("||", $datos[$i]);
            
         /*$mysqli->query("INSERT INTO prints(
                              id_user,
                              dateOrder,
                              delivery_term,
                              delivery_method,
                              warehouse)
                           VALUES(
                              '$idusuario',
                              '$fecha',
                              '$e[5]',
                              '$e[6]',
                              '$e[7]')");

         $mysqli->query("INSERT INTO quotes(
                              id_clients,
                              id_print,
                              dateQuo,
                              way_to_pay,
                              comments,
                              type_of_currency
                           )VALUES(
                              '$e[8]',
                              '$mysqli->id_print',
                              '$e[1],
                              '$e[2]',
                              '$e[4]',
                              '$e[3]')");*/

         $sql->query("INSERT INTO detail_quo(
                              id_quotation,
                              description,
                              unit_of_measurement,
                              time_garanty,
                              quantity,
                              price_unit,
                              price_discount,
                              sub_total
                           )VALUES(
                              '$id_cotizacion',
                              '$d[0]',
                              '$d[1]',
                              '$d[2]',
                              '$d[3]',
                              '$d[4]',
                              '$d[5]',
                              '$d[6]')");
         /*$mysqli->query("INSERT INTO pay(
                              id_detail_quo,
                              quo_total,
                              igv,
                              total_igv,
                           )VALUES(
                              '$mysqli->id_detail_quo',
                              '$d[8]',
                              '$d[9]',
                              '$d[10]')");*/

            $r=$r + $result=mysqli_query($conexion,$sql)or die(mysqli_error($result));
         }   
      //}

      return $r;
      //self::descuentaCantidad($d[0], 1);
   }
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: DtxdF en Junio 23, 2020, 03:43:03 PM
La advertencia que se te muestra en el navegador te brinda un indicio para determinar la posible causa. En este caso leyendo un poco la documentación de php y especificamente sobre mysqli_fetch_row (https://www.php.net/manual/es/mysqli-result.fetch-row.php) y mysqli_query (https://www.php.net/manual/es/mysqli.query.php) te proporciona más ayuda.

mysqli_fetch_row(...) retorna NULL en caso de un error o una incongruencia, así que éso es un factor a tener en cuenta para determinar por qué se muestran NULLs en la respuesta misma.

mysqli_fetch_row(...) espera un objeto mysqli_result (https://www.php.net/manual/es/class.mysqli-result.php) pero es pasado un dato tipo booleano, se debe a un error de mysqli_query(...). Las posibles causas pueden ser:

* La conexión no se realizó con éxito, puede ser por credenciales inválidas, permisos inconcedidos, entre otros
* Que haya una incongruencia en la tabla, columna o cualquier dato de la base de datos que posiblemente no exista
* Entre otros

Posible solución: Tendrías que realizar una pequeña investigación sobre qué es lo que falta y falla respecto al mismo código, la conexión y los datos que están almacenados en la base de datos, pero lo principal de todo y para que se te facilite aún más tu trabajo es realizar un tratamiento de errores.

Nota: Por favor usar las etiquetas correspondientes para insertar código y dentro de lo posible colocarlo en un mismo comentario

~ DtxdF
Título: Re:Insert a tablas relacionadas con php 5.4
Publicado por: Mortal_Poison en Junio 25, 2020, 08:29:48 AM
Hola Elizabeth1999, (https://underc0de.org/foro/profile/Elizabeth1999/)

Te comento. Como te han mencionado los otros Underc0ders, la sintaxis al parecer está correcta. Sin embargo, debuggear 'a ojo' a veces suele ser un reto bien grande. Además, también pasa eso por el tema de las funciones. Lo que te recomiendo es, que con tu IDE, logres debuggear línea por línea tu programa. XDebug es muy bueno para eso. Te lo menciono, porque hace unos años atrás, tuve un lío con un código de PHP grandísimo y es hacer eso o sino ir sentenciando línea por línea con dumps y demás funciones para que paren ahí.

Finalmente, con debugear en tiempo de ejecución, sabrás casi que al primer o segundo intento, qué está sucediendo en las líneas de inserción.

Otra cosa, es recomendable sanitizar tu código. Veo que no estás sanitizando la entrada y existen algunos XSS, como por ejemplo, en tu archivo de agregaCotizacionTemp.php. Estás recibiendo los parámetros y no los sanitizas. Es un vistazo rápido, pero sanitizando tu código y aplicándole refactoring, te evitaras muchos problemas más adelante.

Inténta lo de XDebug y nos cuentas. Puedes ahorrarte un tiempo.

Un saludo.