Acceder a mysql desde PHP

En este nuevo tema vamos a ver una parte fundamental de la asignatura, en la que aprenderemos a conectarnos a una base de datos mysql desde PHP. El procedimiento que seguiremos será el siguente:

  • Crear la conexión
  • Lanzar consutas de cualquier tipo, consultas, inserciones, borrados, actualizaciones. Y también podremos crear o borrar tablas y bases de datos completas. Para hacerlo tenemos que utilizar los comandos que ya vimos en SQL
  • Una vez lanzadas las consultas tendremos que recoger los resultados y procesarlos, siempre de la misma forma, usando el vector asociotivo que retorna cada consulta

Vemos todo por partes.

Creación de conexiones desde PHP a mysql

Para hacer esto usaremos la función: mysql_connect, que deberá recibir como mínimo tres parámetros, hosts, nombre de usuario, clave. En respuesta mysql_connect nos retornará un manejador de conexión que deberemos almacenar en una variable, un ejemplo sería: $conexion=mysql_connect(“localhost”,”root”,”root”) . Con esto tendremos abierta una conexión con nuestra base de datos local.Si la conexión no fuese bien se nos mostrará un mensaje de warning especificando el problema. Siempre deberemos cerrar usando mysql_close($conexión)
Ahora tendremos que seleccionar o crear una base de datos.

Seleccionar una base de datos

Para seleccionar una base de datos, usaremos la función mysql_select_db($db,$conexion), con esta función ya tendremos seleccionada una base de datos. Siguiendo con el ejemplo anterior: mysql_select_db(“pedidos”, $conexion);.

Lanzar consultas

Cuando trabajamos con el servidor de mysql directamente lanzamos consultas, pero para trabajar con php y mysql es muy recomendable empezar por obtener el las tablas de las bases de datos y posteriormente la estructura de dichas tabla. De esa forma podremos dibujar tablas de una forma mucho más automatizada.

Ver las tablas que componen una base de datos

Para ver las tablas de una base de datos usaremos la sentencia sql: show tables, y para leer los reultados se utilizaran las instrucciónes mysql_query ($consulta,$conexion) que retorna un resultado que debe ser tratado con la función mysql_fetch_array($resultado), la cual retorna una array con el resultado (asociativo y escalar).

Por ejemplo:

<?php
$host="localhost";
$user="root";
$clave="root";
$db="pedidos";
$conexion=mysql_connect($host,$user,$clave);
mysql_select_db($db, $conexion);
$consulta ="show tables";  
$resultado= mysql_query( $consulta );  
echo "<p>Esta son las tablas que componen la base de datos <b>$db</b></p>";
echo "<ul>\n";
while($r = mysql_fetch_array($resultado))
		echo "<li>$r[0]</li>";
mysql_close($conexion);
?>

Listar los campos de una tabla

Ahora que ya sabemos las tablas que componen un base de datos, podemos listar los campos de dichas tablas, de la siguiente forma:

<?php
$host="localhost";
$user="root";
$clave="root";
$db="pedidos";
$conexion=mysql_connect($host,$user,$clave);
mysql_select_db($db, $conexion);
$consulta ="show tables";  
$resultado= mysql_query( $consulta );  
echo "<p>Esta son las tablas que componen la base de datos <b>$db</b></p>";
echo "<ul>\n";
while($r = mysql_fetch_array($resultado))
	{
	echo "<li>$r[0]<ul>";
	$consulta2="describe ".$r[0];
	$resultado2= mysql_query($consulta2);  
	while($r2 = mysql_fetch_array($resultado2))
		{
		while($r2 = mysql_fetch_array($resultado2))
			echo "<li>Nombre de campo: ".$r2[0]." Tipo del campo: ".$r2[1]."</li>";
		}
	echo "</ul></li>";
	}
echo "</ul>";		
?>

Principalmente nos interesarán los campos 0 y 1, que son respectivamente nombre del campo y tipo del campo. Nos interesa saber el tipo principalmente para descubrir aquellos campos que son texto y fecha.

Recorrido completo de una tabla

Podremos hacer un recorrido por el contenido de una tabla, como se muestra a continuación:

function mostrar_tabla($tabla)
	{
	$consulta="describe ".$tabla;
	$resultado= mysql_query($consulta); 
	echo "<table border=\"1\" align=\"center\"><thead><tr>";
	while($r=mysql_fetch_array($resultado))
		 echo "<td>".$r[0]."</td>";
	echo "</tr></thead><tbody>";
	$consulta="Select * from $tabla";
	$resultado= mysql_query($consulta); 
	while($r=mysql_fetch_array($resultado))
		{
		$n=count($r)/2;   //Ojo los vectores son dobles viene la parte escalar y la parte asocitiva.
		echo "<tr>";
			for ($i=0;$i<$n;$i++)
				echo "<td>".$r[$i]."</td>";	
		echo "</tr>";
		}
	echo "</tbody></table><br>";
	}

Ejercicios

  1. Haz una función que reciba host, usuario y clave, para retornar una conexión al host especificado
  2. Haz una función que cierra la conexión
  3. Haz una función que recibe una conexión y un nombre de base de datos para seleccionar una base de datos
  4. Haz una función que liste todas las tablas de una base de datos, retornandolas y no mostrandolas.
  5. Haz una función que reciba una tabla de base de datos y retorne un listado de sus campos y tipo
  6. Prueba todo lo anterior consiguiendo un listado similar al del ejemplo con la base de datos world
  7. Crea una función que muestre todo el contenido de una tabla
  8. Modifica la función mostrar para que cada tr sea un formulario y cada td sea un input con un nombre distinto
  9. Crea una función que muestre en las opciones de un select las distintas bases de datos del servidor
  10. Crea un objeto usando los ejercicios anteriores

Objeto manejador de conexiones con Mysql

class mysql
	{
	private $host;
	private $user;
	private $clave;
	private $bd;
	private $conexion;
	
	
	public function conectar($host,$user,$clave)
		{
		$this->host=$host;
		$this->user=$user;
		$this->clave=$clave;
		$this->conexion=mysql_connect($this->host,$this->user,$this->clave);
		}
	/*
	Function seleccionar, recibe una conexión y una base de datos para seleccionar la base de datos
	*/
	public function seleccionar($bd)
		{
		$this->bd=$bd;
		mysql_select_db($this->bd, $this->conexion);
		}
	
	/*
	Esta función retorna todas las tablas de una base de datos, para ello deberemos estar previamente conectados y con la base de datos seleccionada.
	*/
	public function listar_tablas()
		{
		$consulta ="show tables";  
		$resultado= mysql_query( $consulta ); 
		while($r = mysql_fetch_array($resultado))
			$tablas[]=$r[0];
		return $tablas;
		}
	/*
	Esta función muetra la estructura interna de una tabla, para ellos deneremos estar conectados y la base de datos seleccionada. 
	*/
	public function listar_tabla($tabla)
		{
		echo "Esta es la estructura de la tabla $tabla";
		$consulta="describe ".$tabla;
		echo "<ul>";
		$resultado= mysql_query($consulta);  
			while($r=mysql_fetch_array($resultado))
				echo "<li>Campo: <strong>".$r[0]."</strong> Tipo: ".$r[1]."</li>";
		echo "</ul>";
		}
	
	/*
	Muestra el contenido completo de una tabla recibida por parámetro. Deberemos estar conectados y la bs seleccionada.
	Ojo, el vector retornado es tanto escalar como asociativo (doble), tendremos que dividir a la mitad.
	*/
	public function mostrar_tabla($tabla)
		{
		echo "<p>Puede insertar nuevos datos en la tabla</p>";
		echo "Este es el contenido de la tabla $tabla";
		$consulta="describe ".$tabla;
		$resultado= mysql_query($consulta); 
		echo "<table border=\"1\" align=\"center\"><thead><tr>";
		$r=mysql_fetch_array($resultado);
		echo "<td><strong>Borrar</strong></td>";
		while($r=mysql_fetch_array($resultado))
			 echo "<td><strong>".$r[0]."</strong></td>";
		echo "<td><strong>Modificar</strong></td>";	
		echo "</tr></thead><tbody>";
		$consulta="Select * from $tabla";
		$resultado= mysql_query($consulta); 
		while($r=mysql_fetch_array($resultado))
			{
			$n=count($r)/2;   //Ojo los vectores son dobles viene la parte escalar y la parte asociativa.
			echo "<tr><form action=\"modificar.php\"><td><a href=\"borrar.php?id=".$r[0]."&tabla=$tabla\">Borrar</a></td>";
				for ($i=1;$i<$n;$i++)
					echo "<td><input type=\"text\" name=\"campo$i\" value=\"".$r[$i]."\"/></td>";	
			echo "<td><input type=\"submit\" value=\"Modificar\"></td></form></tr>";
			}
		echo "</tbody></table><br>";
		}
	public function cerrar ()
		{
		mysql_close($this->conexion);
		}
	/*
	Función que nos pinta dentro de las opciones del select las distintas bases de datos de nuestro servidor.
	*/
	public function dame_db ()
		{
		$consulta="show databases";
		$resultado= mysql_query( $consulta );  
		while($r = mysql_fetch_array($resultado))
			echo  "<option>".$r[0]."</option>";

		}
	}
?>

Examinador de bases de datos

Usando el anterior obsejo, podemos hacer de forma sencilla una manejador como el que se muestra a continuación:

<?php
include ("mysql_clase.php");
$miconexion=new mysql;
?>
<!DOCTYPE html>
<html lang=es>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>Examinador de bases de datos</h2>
<p>Seleccione los valores para conectar con una base a base de datos MySQl, host, user y clave. Si no conoce los valores adecuados para la base de datos, deje este espacio en blanco.</p>
<form method="post" action="mysql.php">
Host:
<input type="text" value="<?php if(isset($_POST['host'])) echo $_POST['host'];?>" name="host"/>
User:
<input type="text" value="<?php if(isset($_POST['user'])) echo $_POST['user'];?>" name="user"/>
Clave:
<input type="secret" value="<?php if(isset($_POST['clave'])) echo $_POST['clave'];?>" name="clave"/>
db:
<select name="bd" >
<?php
$miconexion->conectar($_POST['host'],$_POST['user'],$_POST['clave']);
$miconexion->dame_db();
$miconexion->cerrar();
?>
</select>
<input type="submit" value="Examinar">
</form>
<?php
if (isset($_POST['host'])&&isset($_POST['user'])&&isset($_POST['clave']))
	{
	$host=$_POST["host"];
	$user=$_POST["user"];
	$clave=$_POST["clave"];
	if (isset ($_POST['bd']))
		{
		$bd=$_POST["bd"];
		$miconexion->conectar($host,$user,$clave);
		$miconexion->seleccionar($bd);
		$tablas=$miconexion->listar_tablas();
		foreach ($tablas as $tabla)
			{
			$miconexion->listar_tabla($tabla);
			$miconexion->mostrar_tabla($tabla);
			}
		$miconexion->cerrar();
		}
	}
?>
</body>
</html>

Originally posted 2011-03-20 21:36:47.

5 Responses to “ Acceder a mysql desde PHP ”

  1. feliciana dice:

    juan luis,no me gusta molestarte,pero estoy haciendo la parte index de modificar
    he hecho lo siguiente:
    conectar();
    $tabla=$_GET[‘tabla’];
    $consulta=”Select * from $tabla”;
    $resultado=mysql_query($consulta);
    while($r=mysql_fetch_array($resultado))
    {
    $n=count($r)/2; //Ojo los vectores son dobles viene la parte escalar y la parte asocitiva.
    echo “”;
    “$r[‘nombre’]”;
    “$r[‘nota1’]”;
    “$r[‘nota2’]”;
    ” $r[‘trabajo’]”;
    ” $r[‘trabajo’]”;
    $r[‘id_alumnosnotas’];
    echo “”;
    return $tabla;

    ?>
    <form action="modificar.php?tabla=” method=”post”>

    Borrar

    Me dice que en esta línea:
    “$r[‘nombre’]”;

    parse error, expecting `T_STRING’ or `T_VARIABLE’ or `T_NUM_STRING’.
    ¿me podrías decir cuál es error o si esto está mal hecho?Gracias

  2. feliciana dice:

    ahora tengo que hacer borrar.php ¿include clases o index?no lo tengo claro porque el borrar esta en el index.

    • jlmora dice:

      Al borrar lo llamas por url, entonces no tendrá que estar incluido en el index. Si borrar.php va a usar alguna clase de la que tenemos en clases.php entinces tendrá que incluir clases.php.

  3. Pol dice:

    ¡Maestro!, me sé el UML, lo que no puedo es la traducción al PHP5, ¿raro?, pero no le doy ni una, alguna sugerencia?,
    Gracias ¡Maestro!

Deja un comentario