mysqli_query mysqli_num_rows mysqli_fetch_assoc mysqli_fetch_array mysql_fetch ejemplo consulta php mysqli

php - mysqli_fetch_assoc - mysqli_num_rows



PHP mysqli fetch_row-iterar sobre mĂșltiples registros (1)

He estado jugando con esto durante 3 días, investigando y experimentando: es hora de pedir ayuda.

Tengo un poco de código para una página de visualización de programación que recorre una tabla de base de datos, una vez por tipo de cita. Reúne todas las citas de ese tipo para la semana y las devuelve en una fila, así:

+------+------+-----+-----+-----+-----+-----+-----+-----+------+ | Name | Year | Mon | Tue | Wed | Thu | Fri | Sat | Sun | Purp | +------+------+-----+-----+-----+-----+-----+-----+-----+------+ | IST | NA | 9-4 | | | | | | | ABC | +------+------+-----+-----+-----+-----+-----+-----+-----+------+ | OT | NA | | 8-2 | 8-2 | 8-2 | 8-2 | | | DEF | +------+------+-----+-----+-----+-----+-----+-----+-----+------+

Mi código funciona exactamente como yo quiero, con un defecto fatal. Si hay más de una fila para un "Nombre", obtengo esto como mi fila:

+------+------+-----+-----+-----+-----+-----+-----+-----+------+ | Name | Year | Mon | Tue | Wed | Thu | Fri | Sat | Sun | Purp | +------+------+-----+-----+-----+-----+-----+-----+-----+------+ | IST | NA | 9-4 | | | | | | | ABC | +------+------+-----+-----+-----+-----+-----+-----+-----+------+ | OT | NA | | 8-2 | 8-2 | 8-2 | 8-2 | | | DEF | +------+------+-----+-----+-----+-----+-----+-----+-----+------+-+-----+-+-+-+-+-+-----+ | MTG | | 1-2 | | | | | | | | | 1-2 | | | | | | GHI | | | | | | | | | | | | | | | | | | | JKL | +------+------+-----+-----+-----+-----+-----+-----+-----+------+-+-----+-+-+-+-+-+-----+

Entonces, en lugar de insertarlo en la <td> apropiada, crea un conjunto completamente nuevo de ellos. Es realmente frustrante porque estoy seguro de que es algo simple, pero no puedo verlo ... :(

Código:

$apptnamestop = array("IST", "OT", "MTG", "TR-CN", "EVENT", "EN", "REC", "TO"); $daysofweek = array("1", "2", "3", "4", "5", "6", "0"); foreach ( $apptnamestop as $name) { print str_repeat($tab, 8) . "<tr>/n"; print str_repeat($tab, 9) . "<td class=/"td1s/">$name</td>/n"; print str_repeat($tab, 9) . "<td class=/"td1s/">N/A</td>/n"; $getdataquery = "SELECT appointmentName as name , appointmentType as type, appointmentStartDateTime as sdt , appointmentEndDateTime as edt, appointmentPurpose as purp from tblAppointments where appointmentStaffIDsToAttend like ''%{$_SESSION[''user_id'']}%'' and appointmentName = ''$name'' and (appointmentStartDateTime >= DATE_ADD(CURDATE(), INTERVAL (9 - IF(DAYOFWEEK(CURDATE())=1, 8, DAYOFWEEK(CURDATE()))) DAY) and appointmentEndDateTime < DATE_ADD(CURDATE(), INTERVAL (16 - IF(DAYOFWEEK(CURDATE())=1, 8, DAYOFWEEK(CURDATE()))) DAY)) "; $getdataqueryresults = $mysqli->query($getdataquery) or trigger_error("<p class=/"error/">We''re very sorry, but an error has occurred when interacting with the CHAIRS database. Please try again and see if the error repeats. If it does, please get the following information in its entirety to your database adminapptrator so the CHAIRS developer can get the error resolved.<br />Error Message: " . $mysqli->error, E_USER_ERROR); $datarowcnt = $getdataqueryresults->num_rows; if ($datarowcnt > 0) { while ($row = $getdataqueryresults->fetch_row()) { $rows[] = $row; } foreach ($rows as $row) { $title = $row[0]; $type = $row[1]; $sdt = $row[2]; $edt = $row[3]; $purp = $row[4]; $c=7; if ($type == 1) { $typew = "Mandatory"; } else { $typew = "Elective"; } $sparts = explode(" ", $sdt); $eparts = explode(" ", $edt); $tdiff = getTimeDiff($sparts[1], $eparts[1]); foreach ($daysofweek as $day) { if ($title == $name) { if ($day == date(''w'', strtotime("$sparts[0]"))) { if ($sparts[0] == $eparts[0]) { print str_repeat($tab, 9) . "<td class=/"td1s/">$sparts[1] - $eparts[1]<br />($tdiff) - $typew</td>/n"; $c--; } else { $s = strtotime("$sparts[0]"); $e = strtotime("$eparts[0]"); for ($i=$s; $i<=$e; $i+=86400) { print str_repeat($tab, 9) . "<td class=/"td1s/">$sparts[1] - $eparts[1]<br />($tdiff) - $typew</td>/n"; $c--; } } } if ( $c > 0) { $c--; print str_repeat($tab, 9) . "<td class=/"td1s/"></td>/n"; } } } } $rc++; } else { foreach ($daysofweek as $day) { print str_repeat($tab, 9) . "<td class=/"td1s/"></td>/n"; } } print str_repeat($tab, 9) . "<td class=/"td1s/">$purp</td>/n"; $purp = ""; print "</tr>/n"; }


Las nuevas filas se inician aquí:

foreach ( $apptnamestop as $name) { print str_repeat($tab, 8) . "<tr>/n"; print str_repeat($tab, 9) . "<td class=/"td1s/">$name</td>/n";

Como puede ver, esta nueva fila se inicia una vez por elemento en $apptnamestop , en lugar de una vez por fila de la base de datos. Al código no le importa cuántas filas coincidentes encuentre en la tabla, solo insertará una nueva tabla por nombre.

Hay un par de formas de mejorar esta situación, según sus necesidades.

Si necesita insertar siempre una fila por nombre, independientemente de si hay una fila coincidente en la base de datos, mantenga las líneas 4, 5 y 6 igual que ahora. Tendremos que modificar el ciclo interno ( foreach ($rows as $row) ) para generar las nuevas filas de la tabla para cada ciclo más allá del primero:

$rowCounter = 0; foreach ($rows as $row) { if ($rowCounter > 0) { print "</tr>/n"; // Close the previous table row print str_repeat($tab, 8) . "<tr>/n"; print str_repeat($tab, 9) . "<td class=/"td1s/">$name</td>/n"; print str_repeat($tab, 9) . "<td class=/"td1s/">N/A</td>/n"; } $rowCounter++; // Remainder of the loop code goes here ... }

Si prefiere omitir la creación de la fila de la tabla cuando no se encuentra una fila de base de datos coincidente, mueva las instrucciones de creación de filas al bucle interno por completo; de esta forma solo se ejecutará si se encuentran las filas de la base de datos.

Como nota final, considere implementar un sistema de visualización de plantillas; separando su código lógico de su código de visualización, puede modificar fácilmente uno sin romper el otro. Su código se vuelve mucho más simple de leer y modificar en el futuro.