Autor Tema: PHP consulta SELECT a base datos MySql. Bucle while, mysqli_fetch_array CU00842B  (Leído 4457 veces)

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola, dejo otra posible solución. Ejercicio CU00842B del tutorial básico de programación web: PHP desde cero.

Citar
EJERCICIO 1
Utilizando la tabla agenda que hemos empleado en los ejemplos y funciones para manejo de cadenas PHP, realiza una consulta a la base de datos para extraer todos los nombres y determina cuántos nombres en la base de datos empiezan por M.
Ejemplo de resultados a obtener: En la base de datos los nombres que empiezan por M son: 2

EJERCICIO 2
Utilizando la tabla <<ciudades>> que hemos utilizado para ejercicios de entregas anteriores del curso, crea un archivo php donde se realice una consulta a la base de datos para extraer todos los datos de la tabla y a continuación calcula la suma de habitantes de todos los países y cuántas de estas ciudades tienen metro. Muestra el resultado por pantalla.
Ejemplo de resultados a obtener:
La suma de habitantes de México D.F., Barcelona, Buenos Aires, Medellín, Lima, Caracas, Santiago, Antigua, Quito y La Habana es: 5663886 habitantes
De estas ciudades tienen metro: 5 ciudades.

Código: [Seleccionar]
<html>
<head>
<meta charset="utf-8"> </head>
<body>
<?php
                        
// EJERCICIO 1
function comprobarNombres($resultados) {
if ($resultados !=NULL) {
return strncmp($resultados['nombre'], 'M'1);
}
else {echo "<br/>No hay más datos!!! <br/>";}
}
$link mysqli_connect($hostname $nombreUsuario $contraseña);
mysqli_select_db($link$nombreConexión);
$tildes $link->query("SET NAMES 'utf8'"); //Para que se muestren las tildes
$result mysqli_query($link"SELECT * FROM agenda");
$coincidencias 0;
while ($fila mysqli_fetch_array($result)){
if(comprobarNombres($fila)) {
$coincidencias++;
}
}
mysqli_free_result($result);
mysqli_close($link);
echo 'En la base de datos los nombre que empiezan por M son: ' $coincidencias;
?>

<hr>
<?php
                        
// EJERCICIO 2
//Ejemplo aprenderaprogramar.com
function dameNumeroHabitantes($resultados) {
if ($resultados !=NULL) {
return $resultados['habitantes'];
}
}
function dameNombreCiudad($resultados) {
if ($resultados !=NULL) {
return $resultados['ciudad'];
}
}
function dameTinenMetro($resultados) {
if ($resultados !=NULL) {
return $resultados['tieneMetro'];
}
}
function muestraResultado($numeroHabitantes$ciudades$tienenMetro){
$msg 'La suma de habitantes de ';
for($i 0;$i count($ciudades); $i++) {
if($i == (count($ciudades)-2)) {
$msg $msg $ciudades[$i] . ' y ';
} else if($i ==(count($ciudades)-1)) {
$msg $msg $ciudades[$i] . ' es: ' $numeroHabitantes ' habitantes.<br/>';
} else {
$msg $msg $ciudades[$i] . ', ';
}
}
$msg $msg '<br/>De estas ciudades tienen metro: ' $tienenMetro ' ciudades.';
echo $msg;
}
$link mysqli_connect($hostname $nombreUsuario $contraseña);
mysqli_select_db($link$nombreConexión);
$tildes $link->query("SET NAMES 'utf8'"); //Para que se muestren las tildes
$result mysqli_query($link"SELECT * FROM ciudades");
$numeroHabitantes 0;
$tienenMetro 0;
$i 0;
while ($fila mysqli_fetch_array($result)){
$ciudades[$i++]= dameNombreCiudad($fila);
$numeroHabitantes += dameNumeroHabitantes($fila);
$tienenMetro += dameTinenMetro($fila);
}
mysqli_free_result($result);
mysqli_close($link);
muestraResultado($numeroHabitantes$ciudades$tienenMetro);
?>

</body>
</html>

http://aprendehtml.byethost3.com/CU00842B/ejerciciosCU00842B.php

En las dos lineas...
Código: [Seleccionar]
$link = mysqli_connect($hostname , $nombreUsuario , $contraseña);
mysqli_select_db($link, $nombreConexión);
quité los datos de mi base de datos y la contraseña.

Saludos.
« Última modificación: 17 de Marzo 2016, 09:11 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días Pedro

En el ejercicio 1 esta función

Código: [Seleccionar]
function comprobarNombres($resultados) {
if ($resultados !=NULL) {
return strncmp($resultados['nombre'], 'M', 1);
}
else {echo "<br/>No hay más datos!!! <br/>";}
}

Si se entra en la primera parte del if el resultado es que se devuelve un valor false ó true (o su equivalente numérico 0 ó 1) mediante la sentencia return. Si se entra en el else el resultado es que no hay sentencia return, y a cambio hay una sentencia echo con una cadena de texto.

Esto es una situación que en líneas generales debe evitarse. De hecho, muchos lenguajes de programación no permiten situaciones de este tipo. PHP sí lo permite porque es más relajado en el control de tipos. Sin embargo, a no ser que tengamos un fuerte motivo para hacerlo no es recomendable. El motivo es que la función debe realizar una tarea homogénea (devolver un mismo tipo de dato siempre con un return) en lugar de hacer unas veces una cosa y otras veces otra. Si la función no hace siempre lo mismo es más fácil incurrir en errores a la hora de llamarla, porque la respuesta podría no ser la que esperamos y no obtener la respuesta esperada dar lugar a errores.

El ejercicio 2 funciona correctamente y puede verse como un ejercicio donde has ejercitado el uso de funciones. El diseño realmente no me parece óptimo por varios pequeños detalles.

Por ejemplo:

Código: [Seleccionar]
function dameNumeroHabitantes($resultados) {
if ($resultados !=NULL) {
return $resultados['habitantes'];
}
}

Una función que hace una tarea elemental quizás no merezca la pena ser definida como función, sino incluir su código directamente ya que no supone ahorro de código.

En esta función tenemos un condicional de modo que si se cumple hay un return, y si no no hay nada. Estamos en un caso parecido al comentado antes: la función se comportará de distinta manera, no tiene una respuesta homogénea, y esto a la larga puede traer problemas.

Esta función: function muestraResultado($numeroHabitantes, $ciudades, $tienenMetro)

parece concebida para ser llamada una sola vez. En general una función tendrá interés cuando se vaya a llamar más de una vez. Aunque no está prohibido, es raro definir funciones pensadas para ser llamadas una sola vez. Podría usarse en casos justificados si por ejemplo mejoran la ordenación y legibilidad del código.

Para este ejercicio 2 no le veo ventajas al uso de funciones (aunque tampoco está establecido que no se puedan usar, de hecho en general es preferible usarlas, pero tampoco siempre). En este post hay una solución más compacta sin funciones https://www.aprenderaprogramar.com/foros/index.php?topic=1598.0


Saludos

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Buenas.

Creo haber entendido bien lo que dices, así que saqué esas funciones y el código me quedó de la siguiente manera...

Código: [Seleccionar]
<html>
<head>
<meta charset="utf-8"> </head>
<body>
<?php
// EJERCICIO 1
$link mysqli_connect($hostname $nombreUsuario $contraseña);
mysqli_select_db($link$nombreConexión);
$tildes $link->query("SET NAMES 'utf8'"); //Para que se muestren las tildes
$result mysqli_query($link"SELECT * FROM agenda");
$coincidencias 0;
while ($fila mysqli_fetch_array($result)){
if(!strncmp($fila['nombre'], 'M'1)) {
$coincidencias++;
}
}
mysqli_free_result($result);
mysqli_close($link);
echo 'En la base de datos los nombres que empiezan por M son: ' $coincidencias;
?>

<hr>
<?php
// EJERCICIO 2
$link mysqli_connect($hostname $nombreUsuario $contraseña);
mysqli_select_db($link$nombreConexión);
$tildes $link->query("SET NAMES 'utf8'"); //Para que se muestren las tildes
$result mysqli_query($link"SELECT * FROM ciudades");
$numeroHabitantes 0;
$tienenMetro 0;
$i 0;
$msg 'La suma de habitantes de ';
while ($fila mysqli_fetch_array($result)){
$ciudades[$i++]= $fila['ciudad'];
$numeroHabitantes += $fila['habitantes'];
$tienenMetro += $fila['tieneMetro'];
}
mysqli_free_result($result);
mysqli_close($link);
for($i 0;$i count($ciudades); $i++) {
if($i == (count($ciudades)-2)) {
$msg $msg $ciudades[$i] . ' y ';
} else if($i ==(count($ciudades)-1)) {
$msg $msg $ciudades[$i] . ' es: ' $numeroHabitantes ' habitantes.<br/>';
} else {
$msg $msg $ciudades[$i] . ', ';
}
}
$msg $msg '<br/>De estas ciudades tienen metro: ' $tienenMetro ' ciudades.';
echo $msg;
?>

</body>
</html>

gracias por tu tiempo.

Saludos.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola, ahora veo el código propuesto mucho más limpio. Con lo dicho no he querido decir que no se deban usar funciones, al revés, en general son útiles pero siempre reflexionando sobre si generan ventajas suficientes.

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".