Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: pedro,, en 15 de Marzo 2016, 22:03
-
Hola, dejo otra posible solución. Ejercicio CU00842B del tutorial básico de programación web: PHP desde cero.
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.
<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...
$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.
-
Buenos días Pedro
En el ejercicio 1 esta función
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:
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
-
Buenas.
Creo haber entendido bien lo que dices, así que saqué esas funciones y el código me quedó de la siguiente manera...
<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.
-
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