PHP i MySQL: exemples bàsics

De wikijoan
La revisió el 09:31, 13 abr 2022 per Joan (discussió | contribucions) (Es crea la pàgina amb «=Introducció= En aquesta assignatura hem estat treballant bases de dades des de diversos aspectes (disseny, llenguatge SQL, procediments,...). Com a alumne de DAM t'i...».)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca

Introducció

En aquesta assignatura hem estat treballant bases de dades des de diversos aspectes (disseny, llenguatge SQL, procediments,...). Com a alumne de DAM t'interessa com els llenguatges de programació (PHP, per exemple) poden atacar les bases de dades.

En aquesta pràctica farem exemples atòmics (senzills) de diversos aspectes que ens interessen. Hem escollit PHP com a llenguatge de programació (però haguéssim pogut escollir qualsevol altre llenguatge). L'obectiu no és aprendre PHP, sinó veure que tot el que hem estat estudiant de bases de dades pren sentit quan des de les teves aplicacions que estàs programant accedeixes a les bases de dades.

Docker de PHP i mysqli

PHP és un llenguatge de programació de scripts. És popular perquè integrat en un servidor web com l'Apache serveix per programar pàgines web. Però també es pot programar PHP fora de la web, tan sols com a llenguatge de script.

mysqli és la llibreria de PHP per accedir al MySQL. El core de PHP d'entrada no pot accedir a MySQL. S'ha d'instal·lar aquesta llibreria.

Ho farem a partir d'un docker:

Dins del directori de treball creem una carpeta, i el fitxer Dockerfile:

$ mkdir php-mysqli

$ joe Dockerfile
FROM php:7

# Set the locale
RUN apt-get clean && apt-get update && apt-get install -y locales

ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

RUN docker-php-ext-install mysqli
RUN apt-get -y install vim nano joe

El docker de partida és un Linux que té instal·lada la versió 7 de PHP, i a sobre instal·lem la llibreria mysqli. També instal·lem els editors nano i joe, i els locals de UTF8 per no tenir problemes amb els accents i caràcters especials.

Muntem el nostre docker:

$ docker build -t php-mysqli .

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM php:7
7: Pulling from library/php
c229119241af: Pull complete 
47e86af584f1: Pull complete 
e1bd55b3ae5f: Pull complete
...
 ---> 58ed6de5ca0e
Successfully built 58ed6de5ca0e
Successfully tagged php-mysqli:latest
$ docker image ls
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
php-mysqli                latest              7f9a1bfd7f5a        6 seconds ago       531MB
php                       7                   928524d94214        2 weeks ago         473MB

I ja podem arrencar-lo:

$ docker run -dit --name php-mysqli -d php-mysqli /bin/bash
bc728fb6b8f3955dc28f30e963061c9f907c269bb9d93d66ccef544b64a7e978

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                       NAMES
bc728fb6b8f3        php-mysqli                 "docker-php-entrypoi…"   34 seconds ago      Up 33 seconds                                         php-mysqli

I ara ja podem entrar dins del docker, on crearem una carpeta nostra dins del home:

$ docker exec -it php-mysqli bash
root@bc728fb6b8f3:/#
root@f7c81ddaf004:/# cd /home/
root@f7c81ddaf004:/home# mkdir nom_alumne
root@f7c81ddaf004:/home# cd nom_alumne/

I ara ja podem fer la primera prova de PHP:

$ nano hola_mon.php

<?php
echo "hola mon";
?>

Executem el script:

# php hola_mon.php 
hola mon

Treballar amb dos dockers

Un dels principals avantatges dels dockers és que pesen poc, i podem tenir un docker associat a cada servei que necessitem. Acabem de crear un docker amb PHP i mysqli (que el tens en la primera consola), i en una altra consola has d'obrir el docker de l'assignatura amb les bases de dades (on tens les 10 bases de dades de l'assignatura):

$ docker start mysql_m02bd
$ docker exec -it mysql_m02bd mysql -ualumne -pkeiL2lai HR

Per tant, tens dues consoles obertes, amb dos dockers.

Programació amb PHP

Per fer els nostres scripts de PHP treballarem amb la base de dades HR i la taula employees

mysql> desc employees;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| employee_id   | int          | NO   | PRI | NULL    | auto_increment |
| first_name    | varchar(20)  | YES  |     | NULL    |                |
| last_name     | varchar(25)  | NO   |     | NULL    |                |
| email         | varchar(100) | NO   |     | NULL    |                |
| phone_number  | varchar(20)  | YES  |     | NULL    |                |
| hire_date     | date         | NO   |     | NULL    |                |
| job_id        | int          | NO   | MUL | NULL    |                |
| salary        | decimal(8,2) | NO   |     | NULL    |                |
| manager_id    | int          | YES  | MUL | NULL    |                |
| department_id | int          | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

Connexió a la bd

Per saber quina és la IP del nostre docker mysql_m02bd, i per tant saber quina és la IP del servidor de MySQL al que ens volem connectar, fem:

$ docker ps -> sabem quin és el ID del docker

$ docker inspect 046dc7501fff
...
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
...

Aquesta IP és la mateixa que necessitem si ens volem connectar amb el Mysql Workbench, per tant això ja ho has fet moltes vegades.

I ara que ja sabem la IP, aquest és el servidor MySQL al qual ens volem connectar:

script ''connexio.php''':
<pre>
<?php
$conn = mysqli_connect("172.17.0.2", "alumne", "keiL2lai", "HR");

if (!$conn) {
    echo "Error de connexió al MySQL." . PHP_EOL;
    exit;
}

echo "Èxit: S'ha realitzat la connexió a la bd HR." . PHP_EOL;
echo "Informació del host: " . mysqli_get_host_info($conn) . PHP_EOL;

mysqli_close($conn);
?>

Executem:

# php connexio.php 
Èxit: S'ha realitzat la connexió a la bd HR.
Informació del host: 172.17.0.2 via TCP/IP

Insert

script insert.php:

<?php
$servername = "172.17.0.2";
$username = "alumne";
$password = "keiL2lai";
$dbname = "HR";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO employees (first_name, last_name, email, hire_date, job_id, salary) values ('Pere','Rovira','provira@gmail.com','2020-05-24',16,10400)";

if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    echo "New record created successfully. Last inserted ID is: " . $last_id. "\n";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
?>
# php insert.php 
New record created successfully. Last inserted ID is: 207

I ara podem fer una select a la taula:

mysql> select * from employees where last_name='Rovira';
+-------------+------------+-----------+-------------------+--------------+------------+--------+----------+------------+---------------+
| employee_id | first_name | last_name | email             | phone_number | hire_date  | job_id | salary   | manager_id | department_id |
+-------------+------------+-----------+-------------------+--------------+------------+--------+----------+------------+---------------+
|         207 | Pere       | Rovira    | provira@gmail.com | NULL         | 2020-05-24 |     16 | 10400.00 |       NULL |          NULL |
+-------------+------------+-----------+-------------------+--------------+------------+--------+----------+------------+---------------+

update

script update.php:

<?php
$servername = "172.17.0.2";
$username = "alumne";
$password = "keiL2lai";
$dbname = "HR";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "UPDATE employees set last_name='Rovira Virgili', phone_number='636.42.64.24' WHERE last_name='Rovira'";

if (mysqli_query($conn, $sql)) {
  echo "Record updated successfully\n";
} else {
  echo "Error updating record: ".mysqli_error($conn)."\n";
}

mysqli_close($conn);
?>
# php update.php 
Record updated successfully
mysql> select * from employees where last_name='Rovira Virgili';
+-------------+------------+----------------+-------------------+--------------+------------+--------+----------+------------+---------------+
| employee_id | first_name | last_name      | email             | phone_number | hire_date  | job_id | salary   | manager_id | department_id |
+-------------+------------+----------------+-------------------+--------------+------------+--------+----------+------------+---------------+
|         207 | Pere       | Rovira Virgili | provira@gmail.com | 636.42.64.24 | 2020-05-24 |     16 | 10400.00 |       NULL |          NULL |
+-------------+------------+----------------+-------------------+--------------+------------+--------+----------+------------+---------------+

delete

script delete.php:

<?php
$servername = "172.17.0.2";
$username = "alumne";
$password = "keiL2lai";
$dbname = "HR";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "DELETE FROM employees where last_name='Rovira Virgili'";

if (mysqli_query($conn, $sql)) {
  echo "Record deleted successfully\n";
} else {
  echo "Error deleting record: ".mysqli_error($conn)."\n";
}

mysqli_close($conn);
?>
# php delete.php 
Record deleted successfully
mysql> select * from employees where last_name='Rovira Virgili';
Empty set (0.00 sec)

select una fila

script select_single_row.php:

<?php
$servername = "172.17.0.2";
$username = "alumne";
$password = "keiL2lai";
$dbname = "HR";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
  die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT employee_id, first_name, last_name, email FROM employees where employee_id=104";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
   $row = mysqli_fetch_assoc($result);
   echo "id: " . $row["employee_id"]. " - Name: " . $row["first_name"]. " " . $row["last_name"]. " (" . $row["email"] . ")\n";
} else {
  echo "0 results";
}

mysqli_close($conn);
?>
# php single_row.php
id: 104 - Name: Bruce Ernst (bruce.ernst@sqltutorial.org)

select múltiples files

script select_multiple_rows.php:

<?php
$servername = "172.17.0.2";
$username = "alumne";
$password = "keiL2lai";
$dbname = "HR";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
  die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT employee_id, first_name, last_name, email FROM employees";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
  // output data of each row
  while($row = mysqli_fetch_assoc($result)) {
    echo "id: " . $row["employee_id"]. " - Name: " . $row["first_name"]. " " . $row["last_name"]. " (" . $row["email"] . ")\n";
  }
} else {
  echo "0 results";
}

mysqli_close($conn);
?>
# php select_multiple_rows.php 
id: 100 - Name: Steven King (steven.king@sqltutorial.org)
id: 101 - Name: Neena Kochhar (neena.kochhar@sqltutorial.org)
id: 102 - Name: Lex De Haan (lex.de haan@sqltutorial.org)
id: 103 - Name: Alexander Hunold (alexander.hunold@sqltutorial.org)
id: 104 - Name: Bruce Ernst (bruce.ernst@sqltutorial.org)
id: 105 - Name: David Austin (david.austin@sqltutorial.org)
...
<pre>
==execute procedure==
Ara treballarem amb la base de dadse
*https://wiki.joanillo.org/index.php/Cursors
A la bd ''classicmodels'' tenim el procediment ''createEmailList()'' que ja vam veure (el tens a l'enllaç), i l'executes de la següent manera:
<pre>
SET @emailList = ""; 
CALL createEmailList(@emailList); 
SELECT @emailList;

És un paràmetre d'entrada/sortida (INOUT). Com executem aquest procediment des de PHP, i visualitzem la sortida?

script executar_llista_mails.php:

<?php
$conn = new mysqli("172.17.0.2", "alumne", "keiL2lai", "classicmodels");
if ($conn->connect_errno) {
    echo "Error en la connexió a MySQL: (" . $conn->connect_errno . ") " . $conn->connect_error;
}


if (!$conn->query("SET @emailList = ''") || !$conn->query("CALL createEmailList(@emailList)")) {
    echo "Falló CALL: (" . $conn->errno . ") " . $mysqli->error;
}

if (!($resultat = $conn->query("SELECT @emailList as llista_mails"))) {
    echo "Error en recuparar els resultats: (" . $mysqli->errno . ") " . $mysqli->error;
}

$fila = $resultat->fetch_assoc();
echo $fila['llista_mails']."\n";
?>
# php executar_llista_mails.php 
mgerard@classicmodelcars.com;ykato@classicmodelcars.com;mnishi@classicmodelcars.com;tking@classicmodelcars.com;pmarsh@classicmodelcars.com;afixter@classicmodelcars.com;bjones@classicmodelcars.com;lbott@classicmodelcars.com;pcastillo@classicmodelcars.com;ghernande@classicmodelcars.com;lbondur@classicmodelcars.com;gvanauf@classicmodelcars.com;ftseng@classicmodelcars.com;spatterson@classicmodelcars.com;jfirrelli@classicmodelcars.com;lthompson@classicmodelcars.com;ljennings@classicmodelcars.com;abow@classicmodelcars.com;gbondur@classicmodelcars.com;wpatterson@classicmodelcars.com;jfirrelli@classicmodelcars.com;mpatterso@classicmodelcars.com;dmurphy@classicmodelcars.com;

creat per Joan Quintana Compte, abril 2022