Insertar y actualizar diferentes tablas en la base de datos usando php ajax

Estoy tratando de insertar datos en tbl_stock y al mismo tiempo actualización tbl_product. Hasta ahora he escrito un código ajax abajo:

 

que llama stock-in.php y contiene los siguientes códigos SQL a continuación

php

include_once'connectdb.php';

if($_SESSION['useremail']=="" OR $_SESSION['role']=="Admin"){
    header('location:index.php');
}
if(isset($_POST['stock_up'])){
    $product_category   =   $_POST['productcategory'];
    $product_name       =   $_POST['productname'];
    $current_date       =   $_POST['currentDate'];
    $stockup            =   (int)$_POST['stock_up'];
    $newPrice           =   (int)$_POST['cost'];
    $id                 =   $_POST['id'];
    $oldstock           =   (int)$_POST['oldstock'];

    $new_stock          = $oldstock + $stockup;
    $amount_owed        = $newPrice * $stockup;
    
  try {
      //your stuff
  

    $query="insert into tbl_stock(category_name,product_name,stock_in,stock_price,total_cost,stocked_date) 
    values('$product_category','$product_name','$stockup','$newPrice','$amount_owed','$current_date')");
          $insert=$pdo-prepare($query);
          $stmt = $insert->execute();
          
          
          if($stmt){

                $sql="UPDATE `tbl_product` SET `pstock` = ?, `purchaseprice` = ? WHERE  pid= ? ";
                    $update=$pdo->prepare($sql);
                    $update->execute([$new_stock, $newPrice, $id]);

            }else{
              echo'Error in updating stock'; 
            }

          } catch(PDOException $e) {
            echo $e->getMessage();
        }
}
?>

debug ventana muestra valoresenter image description hereEl inserto no funciona y no se muestra ningún error. He pasado una noche sin dormir intentando averiguar por qué. Por favor, apreciaré su ayuda.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codealchemy


3 Respuestas:

  • Usted hizo el movimiento para utilizar PDO y crear declaraciones preparadas, pero luego estropear el buen trabajo incrustando variables directamente dentro de los comandos SQL. No pude probar nada de lo siguiente pero espero que ayude.

    
    
    php
        
        #stock-in.php
        /*
            If you are using sessions you need to start a session!
        */
        error_reporting( E_ALL );
        session_start();
    
        
        
        if( empty( $_SESSION['useremail'] ) OR empty( $_SESSION['role'] ) OR $_SESSION['role']=="Admin" ){
            exit( header('Location: index.php') );
        }
    
        /*
            Check that all fields that are required in the sql have been submitted
        */
        if( isset( 
                $_POST['stock_up'],
                $_POST['productcategory'],
                $_POST['productname'],
                $_POST['currentDate'],
                $_POST['cost'],
                $_POST['id'],
                $_POST['oldstock']
            ) ){
    
            try{
                
                include_once 'connectdb.php';
    
                /*
                    When inserting, updating multiple tables there is some sense in using a transaction
                    so that if one part fails the db is not littered with orphan records
                */
                $pdo-setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                $pdo->beginTransaction();
                
                
                
                
                $product_category   =   $_POST['productcategory'];
                $product_name       =   $_POST['productname'];
                $current_date       =   $_POST['currentDate'];
                $stockup            =   (int)$_POST['stock_up'];
                $newPrice           =   (int)$_POST['cost'];
                $id                 =   $_POST['id'];
                $oldstock           =   (int)$_POST['oldstock'];
    
                $new_stock          = $oldstock + $stockup;
                $amount_owed        = $newPrice * $stockup;
                
                
                /*
                    The sql command should use placeholders rather than embedded fariables - the names are arbitrary
                */
                $sql='insert into `tbl_stock` ( `category_name`, `product_name`, `stock_in`, `stock_price`, `total_cost`, `stocked_date` ) 
                    values 
                ( :cat, :prod, :in, :price, :cost, :date )';
                $stmt=$pdo->prepare( $sql );
                $args=array(
                    ':cat'      =>  $product_category,
                    ':prod'     =>  $product_name,
                    ':in'       =>  $stockup,
                    ':price'    =>  $newPrice,
                    ':cost'     =>  $amount_owed,
                    ':date'     =>  $current_date
                );
                if( !$stmt->execute( $args )  )echo 'stmt#1 failed';
                
                
                
                $sql='update `tbl_product` set `pstock` =:stock, `purchaseprice`=:price where `pid`=:pid';
                $stmt=$pdo->prepare( $sql );
                $args=array(
                    ':stock'    =>  $new_stock,
                    ':price'    =>  $newPrice,
                    ':pid'      =>  $id
                );
                if( !$stmt->execute( $args ) )echo 'stmt#2 failed';
                
                
                
                /*
                    If it all went well, commit these statements to the db
                */
                if( !$pdo->commit() )echo 'commit failed';
                
                
            
            }catch( PDOException $e ){
                /*
                    Any problems, rollback the transaction and report issues - 
                    not necessarily with the full `getMessage()` ~ perhaps just
                    'Error!' etc
                */
                $pdo->rollBack();
                
                echo $e->getMessage();
            }
        }
    ?>
    

    Respondida el Dec 17, 2020 a las 07:42 - por codecanvas

    Votos positivos: 0 | Votos negativos: 0

  • Veamos algunos posibles problemas en tu código que podrían estar causando que la inserción no funcione correctamente:

    • En el archivo PHP, en la línea donde preparas la consulta de inserción (`$insert = $pdo->prepare($query);`), hay un error tipográfico. Debería ser `$insert = $pdo->prepare($query);` en lugar de `$insert=$pdo-prepare($query);`.
    • Asegúrate de que la conexión a la base de datos (`$pdo`) se haya establecido correctamente en el archivo `connectdb.php`.
    • Verifica que los valores que estás pasando desde tu archivo JavaScript a través de AJAX en la solicitud POST estén siendo recibidos correctamente en el archivo PHP. Puedes realizar un `var_dump($_POST);` al inicio del archivo PHP para verificar qué valores se están recibiendo.
    • Asegúrate de tener el control de errores adecuado activado para poder capturar cualquier error que pueda estar ocurriendo durante la ejecución de la consulta SQL. Puedes agregar un bloque `catch` después del bloque `try` para capturar posibles excepciones y mostrar el mensaje de error correspondiente.

    Una vez que hayas revisado estos puntos, prueba nuevamente tu código y verifica si el problema persiste. Si sigues teniendo dificultades, por favor, házmelo saber para poder ayudarte más.

    Respondida el Dec 18, 2020 a las 07:44 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • He revisado tu código y he identificado algunos problemas potenciales:

    • Error tipográfico en la consulta de inserción:

    En la consulta de inserción:

    php
       $query="insert into tblstock(categoryname,productname,stockin,stockprice,totalcost,stockeddate) 
       values('$productcategory','$productname','$stockup','$newPrice','$amountowed','$current_date')");
       

    Falta una coma después de "stocked_date". Debe ser:

    php
       $query="insert into tblstock(categoryname,productname,stockin,stockprice,totalcost,stockeddate) 
       values('$productcategory','$productname','$stockup','$newPrice','$amountowed','$current_date')";
       

    • Falta de manejo de excepciones:

    En el bloque try...catch que maneja la consulta de actualización, falta un manejo de excepciones para la consulta de inserción. Debes agregar un bloque catch para capturar cualquier excepción que pueda ocurrir durante la inserción:

    ```php try { // Inserción en tbl_stock

       // Actualización en tbl_product
       $sql="UPDATE `tbl_product` SET `pstock` = ?, `purchaseprice` = ? WHERE  pid= ? ";
       $update=$pdo->prepare($sql);
       $update->execute([$new_stock, $newPrice, $id]);
    

    } catch(PDOException $e) { echo $e->getMessage(); } ```

    • Falta de verificación de resultados:

    Después de ejecutar la consulta de inserción, no verificas si la inserción fue exitosa. Puedes usar el método rowCount() para verificar si se insertó alguna fila:

    php
       $insert=$pdo-prepare($query);
       $stmt = $insert->execute();

    if($stmt->rowCount() > 0){ // Inserción exitosa } else { // Error en la inserción }

    • Falta de escape de caracteres especiales:

    Los datos que se insertan en la base de datos no están protegidos contra caracteres especiales. Esto puede provocar vulnerabilidades de inyección SQL. Debes utilizar declaraciones preparadas con parámetros enlazados para escapar los datos antes de insertarlos en la base de datos:

    php
       $sql="INSERT INTO tblstock(categoryname,productname,stockin,stockprice,totalcost,stockeddate) 
       VALUES (?, ?, ?, ?, ?, ?)";
       $insert=$pdo->prepare($sql);
       $insert->execute([$productcategory, $productname, $stockup, $newPrice, $amountowed, $current_date]);
       

    Una vez que hayas solucionado estos problemas, tu código debería funcionar correctamente.

    Respondida el Dec 18, 2020 a las 07:48 - por Gemini

    Votos positivos: 0 | Votos negativos: 0