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 08

Conversion varchar a float

He necesitado cambiar en una tabla unos valores que estaban como tipo varchar a tipo float.

En concreto era una columna de puntuaciones de resultados que tenían decimales, pero que estaba grabada como varchar (3).

Para hacer la conversión correctamente he tenido que asegurarme de quitar los signos + que llevaban algunas puntuaciones. No así con los signos – que han quedado como estaban, porque la conversión los interpreta correctamente como negativos.

También he tenido que asegurarme de que todos los decimales venían con punto (.) y no con coma (,), para ello he hecho un update a la tabla modificando en el campo correspondiente todas las comas por puntos.

A continuación simplemente he ido a la estructura de la tabla y he cambiado el tipo de la columna correspondiente. En este caso lo he cambiado a tipo Float con longitud 2,1 que significa que tiene dos dígitos, uno entero y otro decimal, dado que en este campo sólo podían venir los valores 0.0 0.5 y 1.0.

Para otro caso en el que los valores son mayores he utilizado un tipo Float con longitud 4,2 lo que me permite valores de 99.99 hasta 00.00 ¡incluyendo los negativos!.

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 21

Importar la tabla de torneos de Access a MySQL

Una vez realizados los primeros pasos con páginas estáticas, llega el turno de ponerse a trabajar con las páginas dinámicas.

En este sentido el primer paso es crear la base de datos y las tablas correspondientes para poder empezar a trabajar, y no es tarea sencilla… si no se sabe mucho del tema.

La base de datos – aem

El primer paso es crear la base de datos. Lo voy a hacer en local ya que pienso que luego la exportación al servidor será más sencillo. Para crear la base de datos utilizo el phpMyAdmin y simplemento creo la base con la opción nueva Base de datos.

Esto no tiene ningún misterio.


La tabla de torneos – tabla_torneos

Ahora toca el turno de las tablas de la base de datos. He de reconocer que he tenido que pelearme mucho con ello porque lo que parece tan sencillo como exportar una tabla de Access a un formato que admita MySQL, se complica mucho con el tema de los encodings y las fechas.

Lo intenté con ficheros csv y xml y no conseguí nada.

Por no extenderme diré que encontré un artículo que me hizo ver la luz ya que explicaba este asunto de forma muy clara y didáctica:

Pasar una BD de Access a MySQL con phpMyAdmin

De forma esquemática señalaré el procedimiento;

  • phpMyAdmin admite para importar tablas los siguientes formatos: SQL, CSV, ODS y XML.
  • En esta ocasión vamos a utilizar ODS. ¿Por qué? El formato ODS va a ser capaz de leer las tildes y ñ sin problema.
  • ODS es un formato abierto que utiliza Openoffice.org. Para obtener este formato, debemos abrir nuestro fichero de Access, sobre cada una de las tablas, exportarla a formato Excel (que es el más parecido a ODS).
  • Una vez obtenido el fichero Excel, lo abrimos. Tras abrirlo, utilizaremos Guardar Como para obtener el fichero ODS.
  • Ya tenemos generado nuestro fichero ODS.
  • Ahora volvemos a phpMyAdmin y abrimos la opción IMPORTAR.
  • Pulsamos el botón Examinar y seleccionamos el fichero ODS anteriormente generado. Veremos cómo automáticamente cambia el Formato del fichero a Hoja de Cálculo de Open Document.
  • Si todo ha ido bien, aparecerá un mensaje que nos informará de cuántas estructuras se han creado y cuántas consultas se han ejecutado.
  • Nos ha creado una tabla cuyo nombre es igual al nombre del fichero ODS (tabla_torneos).
  • Las tablas se han importado casi correctamente. Los nombres de los campos los ha cogido perfectamente, pero nos faltarían algunos detalles.
  • En primer lugar, la llave primaria, seleccionamos el campo cdgo_torneo que será llave primaria y en la parte de abajo de la página pulsamos el botón Primaria.
  • Otro problema que teníamos era con las fechas. En nuestro caso tenemos dos fechas inicio_torneo y final_torneo, que son fechas, pero no está almacenado en MySQL como Date.
  • Cambiar simplemente el tipo del campo de Varchar a Date no funciona, ya que en el Varchar están almacenadas las fechas en el formato dd-mm-yyyy y ese formato no lo soporta MySQL.
  • Debemos crear un campo nuevo para cada fecha, de tipo Date. Tras crearlo, debemos realizar un UPDATE como el siguiente:
    UPDATE `tabla_torneos` SET `final_torneo2` = STR_TO_DATE(`final_torneo`, ‘%d/%m/%Y’) UPDATE `tabla_torneos` SET `inicio_torneo2` = STR_TO_DATE(`inicio_torneo`, ‘%d/%m/%Y’)
  • En los nuevos campos ya tenemos los valores de manera correcta, así que podemos borrar los antiguos. Y los campos nuevos renombrarlo para que aparezca con el nombre correcto.
  • Algo parecido pasa con los campos BOOLEANOS, no los coge correctamente y almacena valores de tipo cadena VERDADERO y FALSO.
  • Así, deberíamos crear un campo nuevo, de tipo BOOLEAN, y actualizarlo utilizando la siguiente consulta:
    UPDATE `usuarios` SET `fumadornuevo`=’true’ where `fumador`=’VERDADERO’
    UPDATE `usuarios` SET `fumadornuevo`=’false’ where `fumador`=’FALSO’
  • Con esto tendríamos todo terminado para una única tabla. Si nuestra Base de Datos de Access tiene varias tablas, con llaves externas, tendremos que ir importando todos los ficheros generados para cada tabla.

Para completar el trabajo con la tabla he añadido una nueva columna llamada auto_torneo, que va después de estado_torneo. Este campo va a contener la autonomía del torneo, ya que pienso que puede ser útil para hacer separación de torneos por autonomías.