No entra en la sentencia if, dentro del While – php mysqli

Pregunta:


Sucede lo siguiente, estoy haciendo un update, al ingresar una factura de los proveedores, y al hacer click en un boton x se ejecuta una función(la colocare mas abajo) funciona bien, se actualiza el stock de los productos ingresados con la factura de la sucursal a la que se le ingreso, pero ¿ Que sucede si no existe ese producto en esa sucursal? bueno, hice un if que comprobara que si no arroja un resultado, se insertaran los productos en la sucursal, y si existieran, que se actualizara el stock de cada uno, pero no funciona, creo que el if esta mal. Les dejo mi función (igual es larga… PD: la tabla es porque solamente copie el while que tenia pra q se mostraran los productos.) :

  <?php 

   function ingresar_stock()

          {//consulta

            $id_if=$this->id_if;
            $id_di="";

    $sql="SELECT detalle_ingreso.id_di, detalle_ingreso.cantidad, detalle_ingreso.costo, productos.nombre_producto, 
            marcas.nombre_marca, ingreso_factura.id_if,ingreso_factura.id_suc, detalle_ingreso.codigo_producto, productos.precio_costo 
            FROM detalle_ingreso 
            INNER JOIN productos ON detalle_ingreso.codigo_producto = productos.codigo_producto
            INNER JOIN ingreso_factura ON detalle_ingreso.id_if = ingreso_factura.id_if 
            INNER JOIN marcas ON productos.id_marca = marcas.id_marca WHERE detalle_ingreso.id_if='$id_if'"; 

    $resultado=mysqli_query($this->conexion,$sql);
    $tabla="";


    while ($datos=mysqli_fetch_array($resultado))

    {               $codigo_producto=$datos["codigo_producto"];
                    $nombre_producto=$datos["nombre_producto"];
                    $nombre_marca=$datos["nombre_marca"];
                    $precio_costo=$datos["precio_costo"];
                    $cantidad=$datos["cantidad"];
                    $costo=$datos["costo"];
                    $id_di=$datos["id_di"];
                    $id_suc=$datos["id_suc"];

        $tabla.="<tr>

                    <td style='width: 15px; text-align: center'>$codigo_producto</td>
                    <td style='width: 190px; text-align: center'>$nombre_producto</td>
                    <td style='width: 20px; text-align: center'>$nombre_marca</td>
                    <td style='width: 20px; text-align: center'>$precio_costo</td>
                    <td style='width: 20px; text-align: center'>$cantidad</td>
                    <td style='width: 20px; text-align: center'>$costo</td>
                    <td style='width: 20px; text-align: center'><button    id_di='$id_di' class='btn btn-sm btn-default eliminar' >Eliminar<span class='glyphicon glyphicon-remove'></span></button></td>
                </tr>         <div class='col-md-2' style='top: 25px;'>";

            //--- Mi consulta, para verificar que no existe el producto en esa sucursal
            $sql_con="SELECT productos.codigo_producto , sucursales.id_suc
             FROM productos_sucursales
             INNER JOIN productos ON productos_sucursales.codigo_producto=productos.codigo_producto
             INNER JOIN sucursales ON productos_sucursales.id_suc=sucursales.id_suc
             WHERE productos_sucursales.id_suc='$id_suc' AND productos_sucursales.codigo_producto='$codigo_producto'";       
             $resultado_con=mysqli_query($this->conexion,$sql_con); 

             if($resultado_con==0){

                 $sql_insert="INSERT INTO productos_sucursales values('','$id_suc','$codigo_producto','$cantidad')";
         $resultado_insert=mysqli_query($this->conexion,$sql_insert);


             }

             else{

                 $sql2="UPDATE productos_sucursales
            SET stock_real=stock_real  + $cantidad
            WHERE codigo_producto=$codigo_producto AND id_suc=$id_suc";
        $resultado2=mysqli_query($this->conexion,$sql2);


              }



    }
    return $tabla;
}

   ?>

Preguntado por: Kvothe_0077

sioesi

Debes dejar tu if

if(!$resultado_con){

}

Ya que devuelve false en caso de no encontrar resultados.

Mi respuesta es similar a la de @Error404, solo que la mia se ahorra la evaluacion de == false ya que if evalua resultados booleanos por lo tanto si evaluas !$resultado_con estas buscando el resultado en caso de que sea false (vacio) si no, y trae un object que es el resultado en caso que tu query corresponda caera en la sentencia else

EDICION

Prueba asi :

$rows = $resultado_con->num_rows;
if($rows == 0){
       //insert
}

Buenas, has comprobado qué te devuelve la query? nunca te devolverá 0, devuelve un object o false si la consulta ha fracasado. debes recibir el resultado y tratar-lo para ver qué te ha devuelto, luego haz la comprobación por ejemplo de código producto.

if($resultado_con==0)

La función mysqli_query, tal y como indica en la documentación, devuelve false en caso de no devolver nada. Por tanto, tendrías que cambiar tu if a:

if($resultado_con==false){
   //Código si es falso (si no hay registros)
}else{
  //Código si es verdadero (hay registros)
}

1) Aunque sea un proyecto de prueba, Evita que alguien te de un dolor de cabeza y perdidas de dinero escapando el input (aun si eres tu mismo quine lo genera).

SQL Injection

Acerca de la pregunta, por lo general me evito realizar la consulta para verificar si un item se encuentra en la base de datos utilizando lo que yo llamo un upsert. (Esto solo funciona si tienes claves primarias definidas por lo general lo utilizo con pk combinadas).

La query queda de esta manera:

INSERT INTO table (id_prod, id_suc, value1, value2, value3)
VALUES (1, 2, '1','2','3')
ON DUPLICATE KEY UPDATE
table.value1 = VALUES(table.value1),
table.value2 = VALUES(table.value2);

De esta manera solo debes mantener una query, para este tipo de casos que maneja ambos, insert y update.

Si este forma de realizar las cosas no se adapta a tu estilo, como ya han dicho los demas debes cambiar tu validacion para que trabaje validando si el resultado devuelto por la consulta es false.

if($resultado_con == false) { doSomething(); }

Fuente

Tags:,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *