Esta sección proporciona una introducción de las opciones disponibles a la hora de desarrollar una aplicación PHP que necesite interactuar con una base de datos MySQL.
Aquí solo trataremos las APIs orientadas a objetos que es la recomendada, puesto que está más actualizada y conlleva una mejor organización de código. Con este tipo de API se instancias clases, y entonces se invocan a métodos de los objetos creados.
Si una aplicación en PHP necesita comunicarse con un servidor de BD, necesitará escribir el código PHP que realice tareas tales como conectar al servidor de BD, realizar consultas y otras funciones relacionadas con BD. Es necesario tener un software instalado en el sistema que proporcione a la aplicación en PHP la API, que manejará la comunicación entre el servidor de BD y la aplicación, posiblemente empleando en caso necesario otras librería. A este software generalmente se le conoce como conector, dado que permite a una aplicación conectar con un servidor de BD.
La extensión mysqli, o MySQL mejorada, se desarrolló para aprovechar las nuevas funcionalidades encontradas en los sistemas MySQL con versión 4.1.3 o posterior. La extensión mysqli viene incluida en las versiones PHP 5 y posteriores.
$mysqli = new mysqli('---servidor---','---usuario---','---clave---','---BD---') OR die('Fallo al conectar a MySQL o BD');
En el parámetro ---servidor--- normalmente se usa localhost
Lo mas común es que la cadena de conexión este en un archivo aparte y uses include();, para no tener que poner cada vez la cadena de conexión. Tener en cuenta de que si se incluye header ('Content-type: text/html; charset=utf-8'); la instrucción include tiene que ser la primera del archivo PHP.
echo $mysqli->character_set_name(); echo $mysqli->get_charset(); echo $mysqli->stat();
Establece el conjunto de caracteres predeterminado del cliente.
$mysqli->set_charset('utf8'); date_default_timezone_set('America/Lima');
Para obtener un conjunto de datos de la BD se usa:
$sql = 'SELECT * FROM tabla [WHERE campo=dato'][GROUP BY campo][HAVING condicion][ORDER BY campo][LIMIT n]; $res = $mysqli->query($sql) OR die('Revisa el query de tabla<p>'. $sql);
Una vez ejecutada la consulta se puedo obtener el conjunto de datos hasta que se liberen expresamente con FREE() o CLOSE() o hasta .
Puedes averiguar el numero de columnas recuperadas.
echo $res->field_count;
Retorna un array asociativo correspondiente a la fila obtenida o NULL si no hubiera más filas.
$res = $mysqli->query("SELECT count(*) AS n FROM tabla"); if ($row = $res->fetch_assoc()){ $tot = $row['n']; }else{ $tot = 0; }
while ($row = $res->fetch_assoc()) { echo $row['nom']; }
Los nombres de los campos devueltos por esta función son sensibles a mayúsculas y minúsculas. Esta función define campos NULOS al valor NULL de PHP.
$sql ='SELECT nom,ape FROM tabla'; $res = $mysqli->query($sql) OR die('Revisa el query de tabla<p>'. $sql); while ($obj = $res->fetch_object()) { echo $obj->nom; echo $obj->ape; }
echo $res->num_rows;
$sql = 'SELECT * FROM tabla'; if ($res = $mysqli->query($sql)){ $col = $res->fetch_fields(); foreach ($col as $val){ echo 'Nombre:'. $val->name; echo 'Tabla:'. $val->table; echo 'Tipo:'. $val->type; } }
Propiedad | Descripción |
---|---|
name | El nombre de la columna |
orgname | El nombre original de la columna si se especificó un alias |
table | El nombre de la tabla al que pertenece el campo (si no es calculado) |
orgtable | El nombre original de la tabla si se especificó un alias |
max_length | El ancho máximo del campo del conjunto de resultados. |
length | El ancho del campo, en bytes, como se especificó en la definición de la tabla. Observe que este número (bytes) podría diferir del valor de la definición de la tabla (caracteres), dependiendo del conjunto de caracteres que se emplee. Por ejemplo, el conjunto de caracteres utf8 tiene 3 bytes por carácter, por lo que varchar(10) devolverá una longitud de 30 para utf8 (10*3), aunque devuelve 10 para latin1 (10*1). |
charsetnr | El número del conjunto de caracteres (id) del campo. |
flag | Un entero que representa las banderas de bits del campo. |
type | El tipo de datos usado por el campo |
decimals | El número de decimales usado (para campos integer) |
Si recuperaste los nombres de los campos automáticamente, probablemente quieras obtener las filas automáticamente también.
while ($row = $res->fetch_assoc()) { echo ''; foreach ($col as $val) { echo ' \n"; }'. $row[$val->name] .' '; } echo "
echo $res->num_cols;
Ademas de hacer consultas en la BD, es posible alterar registros con las siguientes instrucciones.
$sql = 'UPDATE tabla SET campo1=valor1[,campo2=valor2] WHERE condición'; $sql = 'INSERT INTO tabla campo1=valor1[,campo2=valor2]'; $sql = 'DELETE FROM tabla WHERE condición'; $res = $mysqli->query($sql) OR die('Revisa el query de tabla<p>'. $sql);
Es posible averiguar si te funciono un UPDATE o un INSERT o un DELETE y cuantas filas afecto.
if ($mysqli->affected_rows == 1){ $G='Ya grabo...'; }else{ $G='Problemas, no grabo'; }
Devuelve el id autogenerado con el insert.
echo $mysqli->insert_id;
En ocasiones luego de importar tablas de otras fuentes te puedes encontrar con caracteres extraños. Estos se pueden corregir usando este simple instrucción.
UPDATE tabla SET campo=REPLACE(campo,'x','y');
x | y |
---|---|
á | á |
é | é |
ó | ó |
ú | ú |
É | É |
Ó | Ó |
Ú | Ú |
ñ | ñ |
Ñ | Ñ |
¿ | ¿ |
¡ | ¡ |
Escapa caracteres especiales de una cadena en una sentencia SQL, teniendo en cuenta el conjunto de caracteres actual de la conexión. Se usa para crear una cadena SQL legal que pueda ser usada sin peligro en una sentencia SQL.
$var1 = $mysqli->real_escape_string(); $var2 = $mysqli->escape_string();
Evitar lo que se llama SQL inyection.
Siempre se debe liberar la memoria asociada al resultado, cuando el objeto ya no es necesario.
$res->close(); $res->free(); $res->free_result();
Finalmente cuando ya no se requiera hacer mas consultas se debe cerrar la conexión con la BD.
$mysqli->close();