0
<?php
        function query($conn,$sql){
            $resultado=mysqli_query($conn,$sql) or die("Fallo en la query: ".mysqli_errno($conn));
            return $resultado;
        }

        $conn=mysqli_connect("localhost","root","") or die("No se ha podido conectar al servidor");
        mysqli_select_db($conn,"php_prep_examen") or die("No se ha podido encontrar la base de datos");
        mysqli_set_charset($conn,"utf8");

        $sql="SELECT apellido,oficio,dir,salario,comision,dnombre FROM emple inner join depart";
        $result=query($conn,$sql);


        while($row=mysqli_fetch_assoc($result)) {
            var_dump($result);  /*Antes del for*/
            $responsabilidad=0;
            foreach($result as $valor) {
                if($valor["dir"]==$row["dir"]){
                    $responsabilidad++;
                }
            }
            echo "<br>";
            var_dump($result); /*Después del for */

            ($row["comision"]==null)?$comision=0:$comision=$row["comision"];
            echo "<p>*************************************************</p>";
            echo "
            <p>
                Liquidación del empleado: ".$row["apellido"]." Dpto: ".$row["dnombre"]." Oficio: ".$row["oficio"]."
            </p>
            ";              
            echo "
                <table border='1'>  
                    <tr>
                        <td>Salario</td>
                        <td>".$row["salario"]."</td>
                    </tr>
                    <tr>
                        <td>Comp. Responsabilidad</td>
                        <td>".$responsabilidad."</td>
                    </tr>
                    <tr>
                        <td>Comisión</td>
                        <td>".$comision."</td>
                    </tr>
                    <tr>
                        <td colspan='2'><hr></td>
                    </tr>
                    <tr>
                        <td>Total</td>
                        <td>".($row["salario"]+$comision)."</td>
                    </tr>
            ";  
            echo "</table>";
        }           
    ?>

Después de hacer el foreach se vacía la variable $result.

var_dump($result) antes del foreach

object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(6) ["lengths"]=> array(6) { [0]=> int(7) [1]=> int(8) [2]=> int(4) [3]=> int(4) [4]=> int(0) [5]=> int(12) } ["num_rows"]=> int(56) ["type"]=> int(0) } 

var_dump($result) después del foreach

object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(6) ["lengths"]=> NULL ["num_rows"]=> int(56) ["type"]=> int(0) }
Tiberius
  • 894
  • 1
  • 5
  • 16
  • ¿Cómo que se *vacía*? Yo veo los dos var_dump iguales. ¿Cuál es el problema en sí? – A. Cedano Feb 19 '19 at 20:42
  • No son iguales uno tiene ["lengths"]=> array(6) y el otro ["lengths"]=> NULL. – Tiberius Feb 19 '19 at 20:44
  • El problema es que después del foreach ya no vuelve a hacer el while porque result no tiene el resultado de la consulta y solo me recorre el primer empleado es decir la primera fila. – Tiberius Feb 19 '19 at 20:45
  • Pero ¿qué es lo que quieres hacer? Se supone que una vez leídos los resultados ya los tienes y ahora debes trabajar los resultados. ¿Será que no entiendes bien como funciona? La consulta te devuelve un recurso que apunta a los datos y cuando los recorres con un bucle se va moviendo fila por fila hasta traerlos todos, una vez traídos, si los necesitas luego guárdalos en un array y olvídate del recurso que trajo los datos, ya no lo necesitas. Ciérralo o guárdalo para ejecutar otra consulta (en caso de consultas preparadas por ejemplo). – A. Cedano Feb 19 '19 at 20:45
  • el problema esta en que recorres `while($row=mysqli_fetch_assoc($result)){` y no se porque comparas `foreach($result as $valor) { ` si la asignastes a `$row` anteriormete y por cada `while($row=mysqli_fetch_assoc($result)){` se hace un `shift` o eliminacion de posicion que se asigna a `$row` fuera de que siges eliminando posiciones al darle el `foreach` por ello al terminar a eliminado todas las posiciones o vaciado el arreglo! no se que intentas pero debes plantearte una logica diferente! – Bryro Feb 19 '19 at 20:45
  • Cada empleado tiene a cargo otros empleados, con el foreach intento sacar el número de empleados que tiene a cargo cada uno. El shift me lo hace el foreach, pero no entiendo porque si no modifico en ningun momento la variable. – Tiberius Feb 19 '19 at 20:49
  • es algo que php hace automaticamente! si no el while jamas terminaria y quedar en un loop eterno! – Bryro Feb 19 '19 at 20:51
  • Lee mi anterior comentario. Cuando haces una consulta los datos vienen como recurso, o sea, un puntero activo para irlos recorriendo fila por fila, cada vez que aplicas un método, por ejemplo `fetch_assoc` sobre los recursos, se mueve una fila. En el `while` te lee todas las filas. Entonces lo que tienes que hacer ahí es guardar un array con los datos si te interesa usarlos luego, algo así: `while($row=mysqli_fetch_assoc($result)) { $arrDatos[]=$row; //otras cosas que quieras }` ahí te guardará los resultados en `$arrDatos` y puedes usarlo posteriormente. Si intentas usar de nuevo... – A. Cedano Feb 19 '19 at 20:52
  • `$result` **no tiene ningún sentido**, porque ya recorriste los datos fila por fila, ese es el sentido del `while`. Los datos en ese caso estaría ahora en `$arrDatos` porque durante el bucle ya vaciaste el recurso. Es importante que comprendas cómo funcionan las consultas y qué es lo que devuelven, está explicado en el Manual de PHP. – A. Cedano Feb 19 '19 at 20:52
  • Muchas gracias, ya lo he entendido, no sabia que al recorrerlo se iba borrando. – Tiberius Feb 19 '19 at 20:59
  • Está explicado en el primer párrafo de [esta respuesta](https://es.stackoverflow.com/a/143420/29967). – A. Cedano Feb 19 '19 at 21:03

1 Answers1

0

puedes hacerlo asi:
el problema esta en que recorres while($row=mysqli_fetch_assoc($result)){ y no se porque comparas foreach($result as $valor) { si la asignastes a $row anteriormete y por cada while($row=mysqli_fetch_assoc($result)){ se hace un shift de manera automatica o eliminacion de posicion que se asigna a $row fuera de que siges eliminando posiciones al darle el foreach por ello al terminar a eliminado todas las posiciones o vaciado el arreglo
solucion:

$rows = array();
while($row=mysqli_fetch_assoc($result)){
  $rows[] = $row;
}

foreach($rows as $result) {

            $responsabilidad=0;
            foreach($rows as $valor) {
                if($valor["dir"]==$result["dir"]){
                    $responsabilidad++;
                }
}
($result["comision"]==null)?$comision=0:$comision=$result["comision"];
Bryro
  • 8,278
  • 1
  • 7
  • 24