Feb 09

Valores devueltos por Mysqli

Un problema que me ha costado mucho solucionar ha sido entender el funcionamiento de mysqli.

Veamos los distintos conceptos:

mysqli_query — Realiza una consulta a la Base de Datos

Si no devuelve resultados es que se trata de consultas de creación, borrado, inserción y actualización en la base de datos. De momento eso no se tratará en este artículo.

Cuando devuelve resultados esta consulta se ejecutará acompañada con una sentencia SELECT sobre la base de datos.

En ese momento pueden ocurrir dos cosas, que devuelva datos o que no encuentre datos.

Si no encuentra datos devolverá un error, por eso cada vez que hacemos una consulta con SELECT a la base de datos hay que preguntar por un posible error.

Yo utilizo la siguiente secuencia en mis modelos:

$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

Si hay resultados es donde he encontrado más dificultad para entender como se tratan los mismos.

El resultado es un conjunto de filas de la base de datos que cumplen la condición de la SELECT.

Los datos recibidos se muestran con distintos métodos.

Pongamos el ejemplo de una consulta en la que queremos obtener un único dato. El ejemplo es obtener de la tabla torneos el nombre de un torneo en concreto.

$resultado4 = $mysqli->query(«SELECT mt_torneo FROM torneos WHERE mt_cdgo = ‘$id'»);

$linea = mysqli_fetch_array($resultado4);

return $linea[«mt_torneo»];

En $resultado4 llega un array con sólo una fila de la base de datos y con un solo campo mt_torneo, pero para poder tratarlo como un dato individual hay que extraerlas del array mediante mysqli_fetch_array($resultado4) y luego acceder al dato mediante $linea[«mt_torneo»].


Si lo que se obtiene es un numero indeterminado de filas de la base de datos entonces lo que hay que hacer es rellenar un array que contendra todas las filas obtenidas.

Por ejemplo como la siguiente secuencia en uno de mis modelos:

$resultado = $mysqli->query(«SELECT * FROM partidas WHERE mp_cdgotorneo = ‘$id’ ORDER BY mp_ronda ASC «);

$resultado = $mysqli->query(«SELECT * FROM partidas WHERE mp_cdgotorneo = ‘$id’ ORDER BY mp_ronda ASC «);

while ($fila = mysqli_fetch_array($resultado)) {
echo «Torneo: » . $fila[‘mt_anyo’] . » – » . $fila[‘mt_torneo’] . «<br />»;
}

En $resultado llega un array con varias filas de la base de datos con todos sus campos (columnas) pero para poder tratarlo como datos hay que extraerlo del array mediante mysqli_fetch_array($resultado) y luego acceder a los dato mediante un while que recorre el array y podemos referenciar los campos de cada fila usando como indice el nombre del campo.

Feb 06

Inicio de webRepertorio4 con CodeIgniter

Funcionamiento

El controlador (inicio.php) hace las llamadas necesarias al modelo (torneos_model) para recopilar los datos necesarios para lanzar la vista (inicio.php).

La vista necesita los siguientes datos para mostrar la página de inicio:

  • la fecha del día (fecha_hoy)
  • el número de registros de la tabla torneos (num_tor)
  • el número de registros de la tabla partidas (num_par)
  • una tabla con los años en los que ha habido torneos, para cargar el menú lateral sólo con esos años (tor_exi).

El controlador pide los datos que necesita la vista al modelo

  • $numeroTorneos = $this->Torneos_model->dame_numero_torneos();
  • $numeroPartidas = $this->Torneos_model->dame_numero_partidas();
  • $torneosFinal = $this->Torneos_model->dame_torneos_existen();

y se los envía a la vista en un array de datos

  • $datos = array(‘fecha_hoy’ => $fecha_hoy, ‘num_tor’ => $numeroTorneos, ‘num_par’ => $numeroPartidas, ‘tor_exi’ => $torneosFinal);

El modelo realiza los cálculos necesarios mediante funciones para davolver los datos que le pide el controlador.

  • function dame_numero_torneos()
  • function dame_numero_partidas()
  • function dame_torneos_existen()

Los documentos de Inicio de webRepertorio4

Controlador: inicio.php

function index(){
//cargo el helper de url, con funciones para trabajo con URL del sitio
$this->load->helper(‘url’);

//cargo el helper de date, con funciones para trabajo con fechas del sitio
$this->load->helper(‘date’);
$fecha_ahora = now();

//preparando el dato de fecha de referencia para la página de inicio
$format = ‘DATE_W3C’;
$fecha = standard_date($format, $fecha_ahora);

//ponemos en $fecha_hoy la fecha en formato dd-mm-AAAA
$fecha_hoy = substr($fecha, 8, 2) . ‘-‘ . substr($fecha, 5, 2) . ‘-‘ . substr($fecha, 0, 4);

//ponemos en $fecha_tor la fecha en formato AAAA-mm-dd
$fecha_tor = substr($fecha, 0, 4) . ‘-‘ . substr($fecha, 5, 2) . ‘-‘ . substr($fecha, 8, 2);

//$fecha_partidas = date(‘Y-m-d’,strtotime(‘+7 days’, strtotime($fecha)));
$fecha_inipartidas = date(‘Y-m-d’,strtotime(‘+7 days’, strtotime($fecha)));
$fecha_finpartidas = date(‘Y-m-d’,strtotime(‘-7 days’, strtotime($fecha)));

//cargo el modelo de torneos
$this->load->model(‘Torneos_model’);

//preparando el cálculo del número de torneos en la base de datos mispartidas
$numeroTorneos = $this->Torneos_model->dame_numero_torneos();

//preparando el cálculo del número de partidas en la base de datos mispartidas
$numeroPartidas = $this->Torneos_model->dame_numero_partidas();

//preparar una tabla con sólo los años en los que existen torneos

$torneosFinal = $this->Torneos_model->dame_torneos_existen();

//recopilo en un array los datos de envío a la vista
$datos = array(‘fecha_hoy’ => $fecha_hoy, ‘num_tor’ => $numeroTorneos, ‘num_par’ => $numeroPartidas, ‘tor_exi’ => $torneosFinal);

//cargo la vista pasando el array con los datos recopilados
$this->load->view(‘inicio’, $datos);
}

Modelo: torneos_model.php

class Torneos_model extends CI_Model {

function __construct(){
parent::__construct();
}

function dame_numero_torneos(){
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);
//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

//$resultado = $mysqli->query(«SELECT mt_cdgo FROM torneos ORDER BY mt_cdgo ASC»);
$resultado = $mysqli->query(«SELECT * FROM torneos»);
return mysqli_num_rows($resultado);

// Cerrar la conexión.
mysqli_close($mysqli);

}

// ————————————————————————————————-

function dame_numero_partidas(){
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

$resultado2 = $mysqli->query(«SELECT * FROM partidas»);
return mysqli_num_rows($resultado2);

// Cerrar la conexión.
mysqli_close($mysqli);

}

// ————————————————————————————————-

function dame_torneos_anyo($id){
// $id viene en formato aaaa
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

$resultado3 = $mysqli->query(«SELECT * FROM torneos WHERE mt_anyo = ‘$id’ ORDER BY mt_cdgo ASC»);
return $resultado3;

// Cerrar la conexión.
mysqli_close($mysqli);

}

// ————————————————————————————————-

function dame_torneos_existen(){
$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

//Indicar a la conexión de mysqli que use la codificacion UTF8 ¡¡¡MUY IMPORTANTE!!!
mysqli_set_charset($mysqli,»utf8″);

if ($mysqli->connect_errno) {
echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;
}

// Se seleccionan de la base los torneos comprendidos entre 1987 y 2017

$resultado3 = $mysqli->query(«SELECT * FROM torneos WHERE ((mt_anyo > 1987) AND (mt_anyo < 2017))»);

// Se crea una tabla de 69 elementos conteniendo cada elemento un año desde 1988 hasta 2056

for ($i = 1; $i <= 69; $i++) {
$anyo[$i]=$i + 1987;
}

// inicializar tabla de años ($anyoexiste) que tienen torneos con valor cero
for ($i = 1; $i <= 69; $i++) {
$anyoexiste[$i]=0;
}

// contabilizamos el número de torneos existentes en cada año en la tabla $anyoexiste

$conta_mad = 0;
while ($fila = mysqli_fetch_array($resultado3)) {
$conta_mad += 1;
//echo «Torneo » . $conta_mad . «: » . $fila[‘mt_torneo’] . «
«;

for ($i = 1; $i <= 69; $i++) {
if ($anyo[$i] == $fila[‘mt_anyo’]) {
$anyoexiste[$i]++;
//echo «paso por este año» . $fila[‘mt_anyo’] . » – » . $i . » – » . $anyoexiste[$i] . «
«;
break;
}
}
}

// creamos una tabla ($torneosfinal) con aquellos años que SI tienen torneos en la tabla $anyoexiste
$k = 0;
for ($i = 1; $i <= 69; $i++) {
if ($anyoexiste[$i] |= 0) {
$k++;
$torneosfinal[$k] = $anyo[$i];
//echo $i . » – » . $anyo[$i] . » – » . $anyoexiste[$i] . «
«;
}
}
return $torneosfinal;

// Cerrar la conexión.
mysqli_close($mysqli);

}

Vista: Inicio.php

<!DOCTYPE html>
<head>
<meta charset=»utf-8″ />
<meta name=»viewport» content=»width=device-width, initial-scale=1.0″ />
<title>WebReperetorio4</title>
<?php include ‘includes/head0.inc’ ?>
</head>
<body>
<div id=»wrapper»>
<!– NAV TOP  –>
<?php include ‘includes/menu_superior0.inc’ ?>
<!– /. NAV TOP  –>

<!– Inicio Nav Lateral  –>
<?php include ‘includes/menu_lateral0.inc’ ?>
<!– Fin Nav Lateral  –>

<!– Inicio Page-wrapper –>
<div id=»page-wrapper» >

<!– Inicio Page Inner –>
<div id=»page-inner»>
<div class=»row»>
<div class=»col-md-12″>
<h2>Mi historial de Ajedrez</h2>
<h5>Bienvenido a la página del historial de mi ajedrez. </h5>
</div>
</div>
<!– /. ROW  –>
<hr />
<div class=»row»>
<div class=»col-md-6 col-sm-6 col-xs-6″>
<div class=»panel panel-back noti-box»>
<span class=»icon-box bg-color-red set-icon»>
<i class=»fa fa-envelope-o»></i>
</span>
<div class=»text-box» >
<p class=»main-text»><?php  echo $num_tor . » Torneos»; ?> </p>
<p class=»text-muted»>Torneos</p>
</div>
</div>
</div>
<div class=»col-md-6 col-sm-6 col-xs-6″>
<div class=»panel panel-back noti-box»>
<span class=»icon-box bg-color-green set-icon»>
<i class=»fa fa-bars»></i>
</span>
<div class=»text-box» >
<p class=»main-text»><?php  echo $num_par . » Partidas»; ?></p>
<p class=»text-muted»>Partidas</p>
</div>
</div>
</div>
</div>
<!– /. ROW  –>
<hr />
<?php
echo «Estos son los resultados <br />»;
echo $fecha_hoy . «<br />»;
echo $num_tor . » torneos<br />»;
echo $num_par . » partidas<br /><br />»;

$k = count($tor_exi);
echo «k = » . $k;
echo «<br /><br />»;

for ($i = 1; $i <= $k; $i++) {
echo «tor_exi(» . $i . «) – » . $tor_exi[$i] . «<br />»;
}

?>

</div>
<!– /. PAGE INNER  –>
</div>
<!– /. PAGE WRAPPER  –>
</div>
<!– /. WRAPPER  –>

<!– SCRIPTS -AT THE BOTOM TO REDUCE THE LOAD TIME–>
<?php include ‘includes/scripts0.inc’ ?>

</body>
</html>

Vista: menu_lateral0.inc

<nav class=»navbar-default navbar-side» role=»navigation»>
<div class=»sidebar-collapse»>
<ul class=»nav» id=»main-menu»>
<li class=»text-center»>
<img src=»assets/img/maseda_luis5_80.jpg» class=»user-image img-responsive»/>
</li>

<li>
<?php
echo ‘<a class=»active-menu»  href=»‘ . site_url(») . ‘»><i class=»fa fa-home fa-2x»></i> Inicio</a>’;
?>
</li>
<?php
$k = count($tor_exi);

for ($i = $k; $i >= 1; $i–) {
//for ($i = 1; $i <= $k; $i++) {
if ($tor_exi[$i] |= 0) {
echo ‘<li>’;
echo ‘<a href=»‘ . site_url(‘/torneosanyo/muestraanyo/’ . $tor_exi[$i]) . ‘»><i class=»fa fa-sitemap fa-2x»></i> ‘ . $tor_exi[$i] . ‘<span class=»fa arrow»></span></a>’;
echo ‘<li>’;
}
}
?>

</ul>

</div>

</nav>

Feb 03

Contando registros con mysqli (mysqli_num_rows)

Los documentos de Inicio de webRepertorio4

Controlador

$this->load->model(‘Torneos_model’);

//preparando el cálculo del número de torneos en la base de datos mispartidas

$numeroTorneos = $this->Torneos_model->dame_numero_torneos();

//preparando el cálculo del número de partidas en la base de datos mispartidas

$numeroPartidas = $this->Torneos_model->dame_numero_partidas();

//recopilo en un array los datos de envío a la vista

$datos = array(‘fecha_hoy’ => $fecha_hoy, ‘num_tor’ => $numeroTorneos, ‘num_par’ => $numeroPartidas);

//cargo la vista pasando el array con los datos recopilados

$this->load->view(‘inicio’, $datos);

Modelo

function dame_numero_torneos(){

// Conexión a la base de datos

$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

if ($mysqli->connect_errno) {

echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;

}

//Consulta a la base de datos

$resultado = $mysqli->query(«SELECT * FROM torneos»);

return mysqli_num_rows($resultado);

}

function dame_numero_partidas(){

// Conexión a la base de datos

$mysqli = new mysqli(‘localhost’, ‘root’, », ‘mispartidas’);

if ($mysqli->connect_errno) {

echo «Falló la conexión a MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_errno;

}

//Consulta a la base de datos

$resultado2 = $mysqli->query(«SELECT * FROM partidas»);

return mysqli_num_rows($resultado2);

}

Vista

echo «Estos son los resultados </br >»;
echo $fecha_hoy . » </br >»;
echo $num_tor . » torneos</br >»;
echo $num_par . » partidas</br >»;

Ago 24

Empezando con CodeIgniter

Pero ¿No estaba trabajando en la nueva web de Ajedrez en Madrid?

Bueno, la verdad es que actualmente tengo demasiadas cosas en la cabeza y es necesario poner un poco de orden en todas ellas si no quiero que esto termine en un caos.

Tengo en mente el cambio de servidor, eso implica migrar toda la web de Ajedrez en Madrid a PHP, lo que significa que tengo que aprender a utilizar este lenguaje de programación.

También hay que mejorar el diseño de la página y la programación del sitio, en este sentido de nuevo interviene el saber manejar el PHP, pero además hay que añadir el conocimiento de HTML5, el CSS3 y el Javascript. Así que me tengo que reciclar en profundidad porque, aunque sé algo de HTML y CSS, el Javascript que conozco es de «andar por casa» y el ASP ya no me va a servir de mucho en esta aventura.

Y por si no fuera suficiente con toda esta ensalada de siglas, además entra en escena mi obsesión por hacer las cosas bien.

Si tienes que hacer una cosa ¿por qué no hacerla lo mejor posible?

¿Y eso qué significa?

Pues significa que si quiero combinar todas estas cosas lo tengo que hacer de una forma ordenada y organizada, no de cualquier manera. Y ahí entran en escena las herramientas de desarrollo de aplicaciones, o frameworks. Estas herramientas tienen como objetivo ayudar al programador a realizar sus aplicaciones en un entorno «controlado» y con una metodología específica que proporciona un resultado final más organizado desde el punto de vista del desarrollador y más eficaz para el usuario.

Pero frameworks hay unos cuantos ¿Cual elegir?

Un amigo mío se decantó por el Symphony. Tardo algún tiempo en aprender a utilizarlo, pero como es un gran programador, cuando consiguió dominarlo las aplicaciones le empezaron a salir como churros, incluso las más complejas. Yo estuve valorando esta opción, por un lado tenía la ventaja del soporte personal de mi amigo, pero me pareció que para el uso que yo quería dar a mi proyecto era como «matar moscas a cañonazos«, y si además añadimos que la curva de aprendizaje es lenta, especialmente para alguien como yo con un coeficiente intelectual de lo más normalito, lo tuve que descartar y pensar en otras soluciones.

Así que empecé a buscar entornos de trabajo ligeros, con curva de aprendizaje rápida y que no dieran muchos problemas en el lado del servidor. Ésto último es un factor importante porque no es lo mismo trabajar con el localhost de tu ordenador que trabajar con un servidor de pago, ya que éstos tienen normalmente sus peculiaridades propias que te pueden permitir unos hacer ciertas cosas y otros no, y una de las razones por las que quiero rediseñar la web de Ajedrez en Madrid es que, si una vez instalada en un servidor PHP, la tengo que migrar a otro servidor, no tenga problemas en el lado de los servidores.

Después de mucho analizar artículos y comentarios en la web me quedé con dos candidatos: Laravel 4 y CodeIgniter.

Los dos son ligeros y su aprendizaje es más asumible que el de los otros framewroks.

Según algunos expertos Laravel 4 es en la actualidad mejor producto que CodeIgniter. Sin embargo a la hora de trabajar con ellos parece ser mucho más sencillo de instalar en el servidor el CodeIgniter, además de algunas otras ventajas que comentaré más adelante.


CodeIgniter es un entorno de trabajo para el desarrollo de páginas web dinámicas en PHP que facilita el desarrollo de proyectos ecritos en este lenguaje.

CodeIgniter es un framework escrito en PHP que se caracteriza por su bajo impacto en el servidor y el elevado número de librerías que incluye para trabajar con distintos objetos: calendario, bases de datos, correo electrónico, manipulación de imágenes, FTP, lenguaje, tablas, sesiones, compresión ZIP, etcétera.

A diferencia de otros frameworks, CodeIgniter cuenta con una documentación excelente que permite conocer todos los secretos de este entorno de trabajo. La cantidad de clases definidas por defecto, unido a su interfaz clara y facilidad de acceso ha hecho que CodeIgniter sea avalado incluso por Rasmus Lerdorf, creador del lenguaje PHP.

Codeigniter está basado en el sistema MVC (Modelo Vista Controlador – Model View Controller) para el desarrollo de aplicaciones web. Este sistema permite a los programadores Web mejorar la forma de trabajar y hacerlo a mayor velocidad.

¿Qué es MVC?

El Modelo Vista Controlador (MVC) es un estilo de programación en el que la aplicación está dividida en 3 capas:

  • Modelo (Model): Es dónde se procesan y obtienen los datos, la conexión con la base de datos. El Modelo representa una base de datos, tabla ó registro, así como sus relaciones con otras tablas ó registros. Los Modelos contienen las reglas para las validación de datos. Estas reglas son aplicadas cuando en el Modelo se insertan o actualizan datos.
  • Vista (View): Presenta los datos en pantalla, es donde va el código HTML que verá el usuario. Son archivos HTML con código PHP incluido
  • Controlador (Controller): Se encarga de obtener datos de un Modelo, procesalos, y pasarlos a la vista. Los Controladores manejan las peticiones del servidor. Toman las entradas del usuario (URL y datos de POST), aplican la logica de negocios, utilizan los Modelos para leer y escribir en la base de datos y otras rutas, y mandan la salida apropiada de datos junto con los archivos de Vistas

MVC

CodeIgniter está pensado para gente que tiene un dominio, al menos medio, del lenguaje de programación PHP. Hay que conocer los fundamentos básicos de PHP para empezar a trabajar de forma eficiente con este entorno de trabajo.

Ventajas de utilizar CodeIgniter

  • Las páginas se procesan más rapido, el núcleo de CodeIgniter es bastante ligero.
  • Es sencillo de instalar, basta con subir los archivos al servidor mediante ftp y modificar algunos archivos de configuración para definir el acceso a la base de datos.
  • Reutilización de código, desarrollo ágil.
  • Existe abundante documentación en la red.
  • Facilidad de edición del código ya creado.
  • Facilidad para crear nuevos módulos, páginas o funcionalidades.
  • Acceso a librerías públicas y clases. Entre otras, hay librerías para el login, paginador, calendarios, fechas, etc.
  • Estandarización del código. Fundamental cuando hay que tocar código hecho por otra persona o cuando trabaja más de una persona en un mismo proyecto.
  • URLs amigables con SEO – (Optimización en motores de búsqueda). Hoy en día nadie duda de la importancia del posicionamiento web.
  • Separación de la lógica y arquitectura de la web, el MVC.
  • CodeIgniter es bastante menos rígido que otros frameworks. Define una manera de trabajar, pero podemos seguirla o no (esto puede convertirse en un inconveniente también)
  • Cualquier servidor que soporte PHP+MySQL sirve para CodeIgniter.
  • CodeIgniter se encuentra bajo una licencia open source, es código libre.
  • CodeIgniter usa una versión modificada del Patrón de Base de Datos (Active Record). Este patrón permite obtener, insertar y actualizar información en la base de datos con mínima codificación (El patrón active record en PHP / Accesos a base de datos: Patrón ActiveRecord).
  • Permite queries más seguras, ya que los valores son escapados automáticamente por el sistema.

Evidentemente todas estas definiciones las he tomado de las muchas páginas que he visitado para documentarme para poder tomar una decisión sobre qué camino seguir, ya que yo no dispongo de momento de los conocimientos suficientes para poder emitir estas valoraciones.

Aprovecho para agradecer a tanta gente que comparte sus conocimientos y experiencias de forma altruista y que tanto ayudan a los que empiezan.

Ago 16

Buenas maneras de escribir código PHP

Buenas maneras de escribir código php

Pues eso, que ya que estoy empezando he pensado que mejor empezar haciendo bien las cosas y no de cualquier manera. Así que me he puesto a buscar sitios donde hablen de este tema y voy a tratar de incluirlos en esta entrada.

De entrada distinguir algunos conceptos: