Diferència entre revisions de la pàgina «A1- Accés a BD amb PHP (10h)»
(→PDO) |
|||
(64 revisions intermèdies per 2 usuaris que no es mostren) | |||
Línia 2: | Línia 2: | ||
La base de dades a utilitzar serà '''mysql''' que haureu d'instal·la en el servidor Web. | La base de dades a utilitzar serà '''mysql''' que haureu d'instal·la en el servidor Web. | ||
− | |||
Per connectar-nos a BD podem utilitzar tres maneres: | Per connectar-nos a BD podem utilitzar tres maneres: | ||
Línia 68: | Línia 67: | ||
try { | try { | ||
+ | //$conn = new PDO("mysql:host=$servername", $username, $password); //Se conecta sin tener base de datos | ||
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password); | $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password); | ||
// set the PDO error mode to exception | // set the PDO error mode to exception | ||
Línia 83: | Línia 83: | ||
?> | ?> | ||
</source> | </source> | ||
+ | |||
+ | |||
+ | info-> | ||
+ | PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION | ||
+ | https://www.quora.com/What-is-SetAttribute-PDO-ATTR_ERRMODE-PDO-ERRMODE_EXCEPTION-in-PHP | ||
==Haig d'utilitzar MySQLi o PDO ?== | ==Haig d'utilitzar MySQLi o PDO ?== | ||
Línia 88: | Línia 93: | ||
Tant MySQLi i PDO tenen els seus avantatges : | Tant MySQLi i PDO tenen els seus avantatges : | ||
− | '''PDO''' treballarà en 12 sistemes de bases de dades diferents, però '''MySQLi''' només funciona amb bases de dades MySQL . | + | '''PDO''' treballarà en [https://cursos.mejorcodigo.net/article/pdo-vs-mysqli-cuales-son-las-diferencias-37 12 sistemes de bases de dades ] diferents , però '''MySQLi''' només funciona amb bases de dades MySQL . var_dump( PDO::getAvailableDrivers() ); |
Per tant, si preveus que es possible que canviarà el sistema de base de dades del teu projecte utilitza PDO. Només hauràs de canviar els paràmetres de connexió i algunes consultes. Amb '''MySQLi''', hauràs de tornar a escriure tot el codi - consultes incloses. | Per tant, si preveus que es possible que canviarà el sistema de base de dades del teu projecte utilitza PDO. Només hauràs de canviar els paràmetres de connexió i algunes consultes. Amb '''MySQLi''', hauràs de tornar a escriure tot el codi - consultes incloses. | ||
Línia 144: | Línia 149: | ||
reg_date TIMESTAMP | reg_date TIMESTAMP | ||
)"; | )"; | ||
+ | $conn = new mysqli($servername, $username, $password, $dbname); | ||
</source> | </source> | ||
=== Mysqli Object Oriented === | === Mysqli Object Oriented === | ||
Línia 157: | Línia 163: | ||
<source lang="php"> | <source lang="php"> | ||
/* Es supossa que existeix una connexió */ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | if (mysqli_query($conn, $sql)) { | ||
+ | echo "Table MyGuests created successfully"; | ||
+ | } else { | ||
+ | echo "Error creating table: " . mysqli_error($conn); | ||
+ | } | ||
+ | </source> | ||
+ | === PDO === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | // use exec() because no results are returned | ||
+ | $conn->exec($sql); | ||
+ | echo "Table MyGuests created successfully"; | ||
+ | </source> | ||
+ | |||
+ | == Afegir un registre a una taula == | ||
+ | S'afegirà un registre a una taula ja creada utilitzant els tres mètodes d'accès a BD: | ||
+ | === Mysqli Object Oriented === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | $sql = "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('John', 'Doe', 'john@example.com')"; | ||
+ | |||
+ | if ($conn->query($sql) === TRUE) { | ||
+ | echo "New record created successfully"; | ||
+ | } else { | ||
+ | echo "Error: " . $sql . "<br>" . $conn->error; | ||
+ | } | ||
+ | </source> | ||
+ | === Mysql Procedural === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | $sql = "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('John', 'Doe', 'john@example.com')"; | ||
+ | |||
+ | if (mysqli_query($conn, $sql)) { | ||
+ | echo "New record created successfully"; | ||
+ | } else { | ||
+ | echo "Error: " . $sql . "<br>" . mysqli_error($conn); | ||
+ | } | ||
+ | </source> | ||
+ | === PDO === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | $sql = "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('John', 'Doe', 'john@example.com')"; | ||
+ | // use exec() because no results are returned | ||
+ | $conn->exec($sql); | ||
+ | echo "New record created successfully"; | ||
+ | </source> | ||
+ | |||
+ | |||
+ | == Afegir multiples registres a una taula == | ||
+ | S'afegiran molts registres a una taula ja creada utilitzant els tres mètodes d'accès a BD: | ||
+ | === Mysqli Object Oriented === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | $sql = "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('John', 'Doe', 'john@example.com');"; | ||
+ | $sql .= "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('Mary', 'Moe', 'mary@example.com');"; | ||
+ | $sql .= "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('Julie', 'Dooley', 'julie@example.com')"; | ||
+ | |||
+ | if ($conn->multi_query($sql) === TRUE) { | ||
+ | echo "New records created successfully"; | ||
+ | } else { | ||
+ | echo "Error: " . $sql . "<br>" . $conn->error; | ||
+ | } | ||
+ | </source> | ||
+ | === Mysql Procedural === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | $sql = "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('John', 'Doe', 'john@example.com');"; | ||
+ | $sql .= "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('Mary', 'Moe', 'mary@example.com');"; | ||
+ | $sql .= "INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('Julie', 'Dooley', 'julie@example.com')"; | ||
+ | |||
+ | if (mysqli_multi_query($conn, $sql)) { | ||
+ | echo "New records created successfully"; | ||
+ | } else { | ||
+ | echo "Error: " . $sql . "<br>" . mysqli_error($conn); | ||
+ | } | ||
+ | </source> | ||
+ | === PDO === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | // begin the transaction | ||
+ | $conn->beginTransaction(); | ||
+ | // our SQL statememtns | ||
+ | $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('John', 'Doe', 'john@example.com')"); | ||
+ | $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('Mary', 'Moe', 'mary@example.com')"); | ||
+ | $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES ('Julie', 'Dooley', 'julie@example.com')"); | ||
+ | |||
+ | // commit the transaction | ||
+ | $conn->commit(); | ||
+ | echo "New records created successfully"; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == Prepared Sentences == | ||
+ | Una declaració preparada és una funció que s'utilitza per executar les mateixes (o similars) sentències SQL amb alta eficiència. | ||
+ | |||
+ | #'''Prepare''' : Es crea una plantilla SQL i s'envia a la base de dades. Alguns valors es deixen sense especificar, anomenat paràmetres (amb l'etiqueta "?") . Exemple : '''INSERT INTO MyGuests VALUES ( ?, ?,? )''' | ||
+ | #La base de dades '''analitza, compila i optimitza''' les consultes SQL Preparades i emmagatzema el resultat sense executar-ho. | ||
+ | #'''Executar ''': En un moment posterior, l'aplicació afegeix els paràmetres que falten, i la base de dades executa la instrucció . L'aplicació pot executar la instrucció tantes vegades com es vulgui amb diferents valors. | ||
+ | |||
+ | Les declaracions preparades tenen dos avantatges principals : | ||
+ | |||
+ | #Les declaracions preparades redueixen el temps d'anàlisi per què la preparació de la consulta es realitza només una vegada (encara que la sentència s'executa diverses vegades ) | ||
+ | #Minimitzen l'ample de banda al servidor al enviar només els paràmetres cada vegada, i no tota la consulta. | ||
+ | #Les declaracions preparades són molt útils contra els atacs d'injeccions SQL, ja que els valors dels paràmetres , que es transmeten posteriorment utilitzant un protocol diferent, no tenen per què ser escapats correctament. | ||
+ | |||
+ | A continuació mostro un exemple amb cada mètode: | ||
+ | === Mysqli Object Oriented i Procedural === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | // prepare and bind | ||
+ | $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"); | ||
+ | $stmt->bind_param("sss", $firstname, $lastname, $email); | ||
+ | |||
+ | // set parameters and execute | ||
+ | $firstname = "John"; | ||
+ | $lastname = "Doe"; | ||
+ | $email = "john@example.com"; | ||
+ | $stmt->execute(); | ||
+ | |||
+ | $firstname = "Mary"; | ||
+ | $lastname = "Moe"; | ||
+ | $email = "mary@example.com"; | ||
+ | $stmt->execute(); | ||
+ | |||
+ | $firstname = "Julie"; | ||
+ | $lastname = "Dooley"; | ||
+ | $email = "julie@example.com"; | ||
+ | $stmt->execute(); | ||
+ | |||
+ | echo "New records created successfully"; | ||
+ | |||
+ | $stmt->close(); | ||
+ | </source> | ||
+ | En el SQL, inserim un signe d'interrogació ( '''?''' ) On volem substituir en un enter, cadena, valor doble o blob. | ||
+ | |||
+ | A continuació, fer un cop d'ull a la funció '''bind_param ()''': | ||
+ | <source lang="php"> | ||
+ | $stmt- >bind_param ( "sss" , $cognom , $cognom , $email ) ; | ||
+ | </source> | ||
+ | Aquesta funció enllaça les paràmetres a la instrucció SQL i li diu a la base de dades quins són els paràmetres. L'argument '''sss''' diu els tipus de dades de cada paràmetre. El caràcter '''s''' diu que el paràmetre és una cadena. | ||
+ | |||
+ | Els tipus de dades poden ser de quatre tipus: | ||
+ | |||
+ | #i - nombre enter | ||
+ | #d - doble | ||
+ | #s - cadena | ||
+ | #b - BLOB | ||
+ | |||
+ | En dir-li a mysql quin tipus de dades que poden esperar, minimitzem el risc d'injeccions SQL. | ||
+ | |||
+ | === PDO === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | // prepare sql and bind parameters | ||
+ | $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) | ||
+ | VALUES (:firstname, :lastname, :email)"); | ||
+ | $stmt->bindParam(':firstname', $firstname); | ||
+ | $stmt->bindParam(':lastname', $lastname); | ||
+ | $stmt->bindParam(':email', $email); | ||
+ | |||
+ | // insert a row | ||
+ | $firstname = "John"; | ||
+ | $lastname = "Doe"; | ||
+ | $email = "john@example.com"; | ||
+ | $stmt->execute(); | ||
+ | |||
+ | // insert another row | ||
+ | $firstname = "Mary"; | ||
+ | $lastname = "Moe"; | ||
+ | $email = "mary@example.com"; | ||
+ | $stmt->execute(); | ||
+ | |||
+ | // insert another row | ||
+ | $firstname = "Julie"; | ||
+ | $lastname = "Dooley"; | ||
+ | $email = "julie@example.com"; | ||
+ | $stmt->execute(); | ||
+ | |||
+ | echo "New records created successfully"; | ||
+ | </source> | ||
+ | |||
+ | == Seleccionar dades == | ||
+ | A continuació mostro un exemple amb cada mètode: | ||
+ | === Mysqli Object Oriented === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | $sql = "SELECT id, firstname, lastname FROM MyGuests"; | ||
+ | $result = $conn->query($sql); | ||
+ | |||
+ | if ($result->num_rows > 0) { | ||
+ | echo "<table><tr><th>ID</th><th>Name</th></tr>"; | ||
+ | // output data of each row | ||
+ | while($row = $result->fetch_assoc()) { | ||
+ | echo "<tr><td>".$row["id"]."</td><td>".$row["firstname"]." ".$row["lastname"]."</td></tr>"; | ||
+ | } | ||
+ | echo "</table>"; | ||
+ | } else { | ||
+ | echo "0 results"; | ||
+ | } | ||
+ | </source> | ||
+ | === Mysql Procedural === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | $sql = "SELECT id, firstname, lastname FROM MyGuests"; | ||
+ | $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["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; | ||
+ | } | ||
+ | } else { | ||
+ | echo "0 results"; | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | === PDO === | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | foreach($conn->query('SELECT * FROM table') as $row) { | ||
+ | echo $row['field1'].' '.$row['field2']; //etc... | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | El mètode <code>query()</code> retorna un objecte <code>PDOStatement</code>. Podries recórrer les dades de la següent manera: | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $stmt = $conn->query('SELECT * FROM table'); | ||
+ | |||
+ | while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { | ||
+ | echo $row['field1'].' '.$row['field2']; //etc... | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | o: | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $stmt = $conn->query('SELECT * FROM table'); | ||
+ | $results = $stmt->fetchAll(PDO::FETCH_ASSOC); | ||
+ | //use $results | ||
+ | </source> | ||
+ | |||
+ | Si queremos hacer una consulta consulta a un id | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $stmt = $conn->query('SELECT * FROM table where id=2'); | ||
+ | $results = $stmt->fetch(PDO::FETCH_ASSOC); | ||
+ | //use $results | ||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | == Esborrar registres == | ||
+ | A continuació mostro un exemple amb cada mètode: | ||
+ | === Mysqli Object Oriented === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | // sql to delete a record | ||
+ | $sql = "DELETE FROM MyGuests WHERE id=3"; | ||
+ | |||
+ | if ($conn->query($sql) === TRUE) { | ||
+ | echo "Record deleted successfully"; | ||
+ | } else { | ||
+ | echo "Error deleting record: " . $conn->error; | ||
+ | } | ||
+ | </source> | ||
+ | === Mysql Procedural === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | |||
+ | // sql to delete a record | ||
+ | $sql = "DELETE FROM MyGuests WHERE id=3"; | ||
+ | |||
+ | if (mysqli_query($conn, $sql)) { | ||
+ | echo "Record deleted successfully"; | ||
+ | } else { | ||
+ | echo "Error deleting record: " . mysqli_error($conn); | ||
+ | } | ||
+ | </source> | ||
+ | === PDO === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | // sql to delete a record | ||
+ | $sql = "DELETE FROM MyGuests WHERE id=3"; | ||
+ | |||
+ | // use exec() because no results are returned | ||
+ | $conn->exec($sql); | ||
+ | echo "Record deleted successfully"; | ||
+ | |||
+ | </source> | ||
+ | |||
+ | == Actualitzar Dades == | ||
+ | A continuació mostro un exemple amb cada mètode: | ||
+ | === Mysqli Object Oriented === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | $sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2"; | ||
+ | |||
+ | if ($conn->query($sql) === TRUE) { | ||
+ | echo "Record updated successfully"; | ||
+ | } else { | ||
+ | echo "Error updating record: " . $conn->error; | ||
+ | } | ||
+ | </source> | ||
+ | === Mysql Procedural === | ||
+ | <source lang="php"> | ||
+ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | $sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2"; | ||
+ | |||
+ | if (mysqli_query($conn, $sql)) { | ||
+ | echo "Record updated successfully"; | ||
+ | } else { | ||
+ | echo "Error updating record: " . mysqli_error($conn); | ||
+ | } | ||
+ | |||
</source> | </source> | ||
=== PDO === | === PDO === | ||
<source lang="php"> | <source lang="php"> | ||
/* Es supossa que existeix una connexió */ | /* Es supossa que existeix una connexió */ | ||
+ | |||
+ | $sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2"; | ||
+ | |||
+ | // Prepare statement | ||
+ | $stmt = $conn->prepare($sql); | ||
+ | |||
+ | // execute the query | ||
+ | $stmt->execute(); | ||
+ | |||
+ | // echo a message to say the UPDATE succeeded | ||
+ | echo $stmt->rowCount() . " records UPDATED successfully"; | ||
+ | } | ||
+ | |||
+ | //también puede ser esta otra forma | ||
+ | // $sql = "UPDATE myguests SET lastname='Doe' WHERE id=2"; | ||
+ | // $conn->exec($sql); | ||
</source> | </source> | ||
+ | |||
+ | <!-- | ||
+ | === EJEMPLOS Conexiones a BD amb MYSQLI === | ||
+ | |||
+ | Connexió de PHP amb el MySQL | ||
+ | L'estructura per accedir a una base de dades és molt semblant al protocol per accedir a | ||
+ | un fitxer: | ||
+ | * Obrir la base de dades. | ||
+ | * Trametre la comanda SQL a la base de dades. | ||
+ | * Retornar el resultat de la consulta. | ||
+ | * Tancar la connexió de la base de dades. | ||
+ | Presentarem ara algunes de les seqüències utilitzades per atacar una base de dades MySQL | ||
+ | |||
+ | |||
+ | '''FUNCIONS BÀSIQUES''' | ||
+ | |||
+ | '''mysqli_connect ( $host, $usuari, $contrasenya,$baseDeDades)''' | ||
+ | Fa una connexió amb el servidor del MySQL. | ||
+ | Per exemple : | ||
+ | $conn = mysqli_connect("localhost", "jnoguera","jnoguera","BD_prueba"); | ||
+ | |||
+ | |||
+ | '''mysqli_query ($conn,$sql)''' | ||
+ | Envia una sentència SQL a la base de dades. | ||
+ | Per exemple: | ||
+ | $sql1 = "select * from usuaris"; | ||
+ | $resul = mysqli_query($conn,$sql1); | ||
+ | |||
+ | |||
+ | '''mysqli_close ($conn)''' | ||
+ | Tanca la connexió amb el servidor de BD. | ||
+ | Per exemple : | ||
+ | mysqli_close($conn); | ||
+ | |||
+ | |||
+ | '''Funcions relacionades amb les consultes''' | ||
+ | |||
+ | '''mysqli_fecth_row ( $resul)''' | ||
+ | S'accedeix a la següent fila activa del resultat de la seqüència SQL generada. Retorna un | ||
+ | array numèric i mou l’apuntador de dades cap endavant. | ||
+ | Per exemple : | ||
+ | $resul = mysqli_query($conn,$sql1); | ||
+ | $arr_resul = mysqli_fetch_row($resul); | ||
+ | |||
+ | |||
+ | '''mysqli_fetch_assoc ($resul)''' | ||
+ | Com l’anterior però amb un array associatiu | ||
+ | |||
+ | |||
+ | '''mysqli_fetch_array ($ resul, $tipus)''' | ||
+ | Retorna el resultat de la consulta realitzada dins un array associatiu, numèric o ambdós | ||
+ | a l’hora. En $tipus es poden definir tres constants: MYSQL_ASSOC, MYSQL_NUM, | ||
+ | MYSQL_BOTH (predeterminat). | ||
+ | Per exemple: | ||
+ | $resul = mysqli_query($conn,$sql1); | ||
+ | $arr_resul = mysqli_fetch_array($resul); | ||
+ | |||
+ | |||
+ | '''mysqli_num_rows ($resul)''' | ||
+ | Retorna la quantitat de files o seqüències que ha retornat la consulta SQL. | ||
+ | Per exemple: | ||
+ | $resul = mysqli_query($conn,$sql1); | ||
+ | echo mysqli_num_rows ($resul); | ||
+ | |||
+ | |||
+ | '''mysqli_field_count ($resul)''' | ||
+ | Informa de la quantitat de camps que s'han retornat en el resultat d'una consulta | ||
+ | |||
+ | |||
+ | '''ALTRES FUNCIONS ÚTILS''' | ||
+ | |||
+ | |||
+ | '''mysqli_affected_rows ($conex)''' | ||
+ | Retorna la quantitat de registres afectats per l'última sentència SQL d'actualització o | ||
+ | eliminació. | ||
+ | |||
+ | |||
+ | '''mysqli_error ($conex)''' | ||
+ | Retorna un missatge de text amb l'error produït a l’anterior operació MySql. | ||
+ | |||
+ | |||
+ | '''mysqli_connect_errno( )''' | ||
+ | Retorna l'últim codi d'error de la última crida a mysqli_connect(). | ||
+ | |||
+ | |||
+ | '''mysqli_connect_error()''' | ||
+ | Retorna l'últim missatge d'error de la última crida a mysqli_connect(). | ||
+ | |||
+ | Normalment es fa un codi semblant a: | ||
+ | if (mysqli_connect_errno()) { | ||
+ | printf("La connexió ha fallat: %s\n", mysqli_connect_error()); | ||
+ | exit(); | ||
+ | } | ||
+ | |||
+ | |||
+ | '''mysqli_free_result ($resul)''' | ||
+ | Allibera l'espai on ha emmagatzemat el resutat de la sentència SQL. És convenient | ||
+ | utilitzar-la quan ja no necessitem els resultats. | ||
+ | |||
+ | EXEMPLE | ||
+ | <source lang="php"> | ||
+ | |||
+ | <html> | ||
+ | <head> | ||
+ | <title> <?php echo utf8_decode("EJEMPLO"); ?></title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | |||
+ | $conn = mysqli_connect("localhost", USUARI, PASS,"basedatos"); | ||
+ | |||
+ | /* Establim la comanda SQL que volem executar */ | ||
+ | $sql1 = "select * from usuaris"; | ||
+ | |||
+ | /* A $resul ens guardem el resultat de la consulta */ | ||
+ | if (!$resul = mysqli_query($conn, $sql1)) { | ||
+ | echo "No s'ha pogut realitzar la consulta"; | ||
+ | echo mysqli_error($conn); | ||
+ | exit; | ||
+ | } | ||
+ | /* Recorrem l'array de resultat per mostrar valors en pantalla. */ | ||
+ | echo "<h3>"; | ||
+ | while ($arr_resul = mysqli_fetch_row($resul)) { | ||
+ | foreach ($arr_resul as $valor) { | ||
+ | echo $valor . " "; | ||
+ | } | ||
+ | echo "<br>"; | ||
+ | } | ||
+ | |||
+ | echo "</h3>"; | ||
+ | |||
+ | /* Alliberem l'espai de memòria ocupat pel resultat de la consulta */ | ||
+ | mysqli_free_result($resul); | ||
+ | |||
+ | /* Tanquem connexió amb el servidor de BD*/ | ||
+ | mysqli_close($conn); | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | </source> | ||
+ | |||
+ | --> | ||
+ | |||
+ | '''GESTION INSITUTO''' | ||
+ | |||
+ | Se trata de hacer la gestión de un instituto por tanto, en nuestra base de datos tendremos una tabla en la cual almacenaremos usuario, password, role (introduciremos un usuario de cada). Deberemos poner un formulario de acceso en función del usuario accederá a su página de sesión, deberá mostrar un mensaje si es alumno, profesor o directora. | ||
+ | |||
+ | '''SOLUCIÓ''' | ||
+ | |||
+ | <!-- | ||
+ | :[[sol_gestion_instituto]] | ||
+ | --> | ||
+ | |||
+ | === Exercici Login === | ||
+ | Crea una pàgina on hi hagi 3 opcions: | ||
+ | *Registrar usuari | ||
+ | *Esborrar usuari | ||
+ | *Login d'usuari | ||
+ | A la pàgina de login d'usuari accedirà a una intranet on pot veure el seu nom i un enllaç per sortir de sessió. | ||
+ | Totes les dades d'usuari s'emmagatzemen a base de dades. | ||
+ | |||
+ | === Fer un CRUD === | ||
+ | Tenemos una base de datos llamada 'crud' que contiene Nombre, email y datos, se desea crear una web que muestre los datos de esa tabla, los edite, elimine y cree. | ||
+ | '''solució''' | ||
+ | ::[[sol_crud]] | ||
+ | |||
+ | === Exercici: Login === | ||
+ | Crea un formulari HTML com el del [[https://proxy proxy]] del institut que utilitzi el mètode GET i un altre que utilitzi el mètode POST. Imprimeix per pantalla el nom d'usuari i la contrasenya codificada en MD5 i en SHA1. | ||
+ | |||
+ | https://es.stackoverflow.com/questions/97719/encriptar-contrase%c3%b1a-o-datos-md5-sha1 | ||
+ | |||
+ | ::[[css_login]] | ||
+ | solució: | ||
+ | |||
+ | ::[[sol_login_php]] | ||
+ | |||
+ | =Exercici de Rols = | ||
+ | Utilitzant com a a base la solució de l'exercici anterior volem crear una aplicació on hi hagi dos ROL, l'usuari Administrador que podrà crear usuaris i esborrar-los i l'usuari Normal que només podrà accedir a la Intranet. | ||
+ | L'usuari Administrador podrà Crear i Eliminar usuaris una vegada hagi entrat a la Intranet. | ||
+ | |||
+ | =Exercici Carret de compra = | ||
+ | Es vol que a la intranet de l'exercici anterior afegir la funcionalitat de carret de compra. | ||
+ | *L'administració pot afegir i treure productes. | ||
+ | *L'usuari logat pot anar seleccionat productes al carret i, quan l'usuari vulgui, fer la compra de tot el carret. | ||
+ | |||
+ | |||
+ | =SINGLETON= | ||
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | class Connection | ||
+ | { | ||
+ | // Contenedor Instancia de la clase | ||
+ | private static $instance = NULL; | ||
+ | private $con = NULL; | ||
+ | // Constructor privado, previene la creación de objetos vía new | ||
+ | private function __construct() { | ||
+ | $this->con = mysqli_connect("localhost", "jnoguera","jnoguera","jnoguera_prueba"); | ||
+ | } | ||
+ | |||
+ | // Clone no permitido | ||
+ | private function __clone() { } | ||
+ | |||
+ | // Método singleton | ||
+ | public static function getInstance() | ||
+ | { | ||
+ | if (is_null(self::$instance)) { | ||
+ | self::$instance = new Connection(); | ||
+ | |||
+ | } | ||
+ | |||
+ | return self::$instance; | ||
+ | } | ||
+ | |||
+ | |||
+ | public function insertar($firstname, $lastname, $email, $fecha){ | ||
+ | $sql = "INSERT INTO MyGuests (firstname, lastname, email, reg_date ) VALUES ('$firstname', '$lastname', '$email','$fecha')"; | ||
+ | |||
+ | if ($this->con->query($sql) === TRUE) { | ||
+ | echo "New record created successfully"; | ||
+ | } else { | ||
+ | echo "Error: " . $sql . "<br>" . $conn->error; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $con= Connection::getInstance(); | ||
+ | print_r($con); | ||
+ | //$con->insertar('julio','noguera','nuevo@mail.com','2019-11-07 18:55:32'); | ||
+ | echo "<br>"; | ||
+ | |||
+ | $con1= Connection::getInstance(); //es la misma instancia | ||
+ | print_r($con1); | ||
+ | echo "<br>"; | ||
+ | |||
+ | $con2 = new Connection(); | ||
+ | print_r($con2->getInstance()); //No crea la instancia | ||
+ | echo "<br>"; | ||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | https://blog.michelletorres.mx/patron-singleton-en-php/ | ||
+ | https://evilnapsis.com/2019/03/07/patron-singleton-en-php-caso-practico/ |
Revisió de 18:08, 15 nov 2021
Contingut
- 1 Connexió a BD amb PHP
- 1.1 Mysqli Procedural
- 1.2 Mysqli object-oriented
- 1.3 PDO
- 1.4 Haig d'utilitzar MySQLi o PDO ?
- 1.5 Creació d'una Base de Dades
- 1.6 Creació d'una Taula
- 1.7 Afegir un registre a una taula
- 1.8 Afegir multiples registres a una taula
- 1.9 Prepared Sentences
- 1.10 Seleccionar dades
- 1.11 Esborrar registres
- 1.12 Actualitzar Dades
- 2 Exercici de Rols
- 3 Exercici Carret de compra
- 4 SINGLETON
Connexió a BD amb PHP
La base de dades a utilitzar serà mysql que haureu d'instal·la en el servidor Web.
Per connectar-nos a BD podem utilitzar tres maneres:
- mysqli procedural
- mysqli object-oriented
- PDO (PHP Data Objects)
Mysqli Procedural
<?php
/*Establir la connexió*/
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
/*Tancar la connexió*/
mysqli_close($conn);
?>
Mysqli object-oriented
<?php
/*Establir la connexió*/
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
/*Tancar la connexió*/
$conn->close();
?>
PDO
<?php
/*Establir la connexió*/
$servername = "localhost";
$username = "username";
$password = "password";
try {
//$conn = new PDO("mysql:host=$servername", $username, $password); //Se conecta sin tener base de datos
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
/*Tancar la connexió*/
$conn = null;
?>
info->
PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
https://www.quora.com/What-is-SetAttribute-PDO-ATTR_ERRMODE-PDO-ERRMODE_EXCEPTION-in-PHP
Haig d'utilitzar MySQLi o PDO ?
Tant MySQLi i PDO tenen els seus avantatges :
PDO treballarà en 12 sistemes de bases de dades diferents , però MySQLi només funciona amb bases de dades MySQL . var_dump( PDO::getAvailableDrivers() );
Per tant, si preveus que es possible que canviarà el sistema de base de dades del teu projecte utilitza PDO. Només hauràs de canviar els paràmetres de connexió i algunes consultes. Amb MySQLi, hauràs de tornar a escriure tot el codi - consultes incloses.
Tots dos són orientat a objectes, però MySQLi també ofereix una API procedimental.
Tots dos recolzen Sentències preparades. Sentències preparades (Prepared Sentences) protegeixen d'injecció SQL , i són molt importants per a la seguretat de les aplicacions web.
Creació d'una Base de Dades
Veurem les tres maneres que hi ha de creació d'una base de dades:
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
// Create database
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "Database created successfully";
} else {
echo "Error creating database: " . $conn->error;
}
Mysql Procedural
/* Es supossa que existeix una connexió */
// Create database
$sql = "CREATE DATABASE myDB";
if (mysqli_query($conn, $sql)) {
echo "Database created successfully";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
PDO
/* Es supossa que existeix una connexió */
$sql = "CREATE DATABASE myDBPDO";
// use exec() because no results are returned
$conn->exec($sql);
echo "Database created successfully<br>";
Creació d'una Taula
La Taula següent es crearà utilitzant els tres metodes:
// sql to create table
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
$conn = new mysqli($servername, $username, $password, $dbname);
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
if ($conn->query($sql) === TRUE) {
echo "Table MyGuests created successfully";
} else {
echo "Error creating table: " . $conn->error;
}
Mysql Procedural
/* Es supossa que existeix una connexió */
if (mysqli_query($conn, $sql)) {
echo "Table MyGuests created successfully";
} else {
echo "Error creating table: " . mysqli_error($conn);
}
PDO
/* Es supossa que existeix una connexió */
// use exec() because no results are returned
$conn->exec($sql);
echo "Table MyGuests created successfully";
Afegir un registre a una taula
S'afegirà un registre a una taula ja creada utilitzant els tres mètodes d'accès a BD:
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
Mysql Procedural
/* Es supossa que existeix una connexió */
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
PDO
/* Es supossa que existeix una connexió */
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
// use exec() because no results are returned
$conn->exec($sql);
echo "New record created successfully";
Afegir multiples registres a una taula
S'afegiran molts registres a una taula ja creada utilitzant els tres mètodes d'accès a BD:
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
if ($conn->multi_query($sql) === TRUE) {
echo "New records created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
Mysql Procedural
/* Es supossa que existeix una connexió */
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
if (mysqli_multi_query($conn, $sql)) {
echo "New records created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
PDO
/* Es supossa que existeix una connexió */
// begin the transaction
$conn->beginTransaction();
// our SQL statememtns
$conn->exec("INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')");
$conn->exec("INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com')");
$conn->exec("INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')");
// commit the transaction
$conn->commit();
echo "New records created successfully";
}
Prepared Sentences
Una declaració preparada és una funció que s'utilitza per executar les mateixes (o similars) sentències SQL amb alta eficiència.
- Prepare : Es crea una plantilla SQL i s'envia a la base de dades. Alguns valors es deixen sense especificar, anomenat paràmetres (amb l'etiqueta "?") . Exemple : INSERT INTO MyGuests VALUES ( ?, ?,? )
- La base de dades analitza, compila i optimitza les consultes SQL Preparades i emmagatzema el resultat sense executar-ho.
- Executar : En un moment posterior, l'aplicació afegeix els paràmetres que falten, i la base de dades executa la instrucció . L'aplicació pot executar la instrucció tantes vegades com es vulgui amb diferents valors.
Les declaracions preparades tenen dos avantatges principals :
- Les declaracions preparades redueixen el temps d'anàlisi per què la preparació de la consulta es realitza només una vegada (encara que la sentència s'executa diverses vegades )
- Minimitzen l'ample de banda al servidor al enviar només els paràmetres cada vegada, i no tota la consulta.
- Les declaracions preparades són molt útils contra els atacs d'injeccions SQL, ja que els valors dels paràmetres , que es transmeten posteriorment utilitzant un protocol diferent, no tenen per què ser escapats correctament.
A continuació mostro un exemple amb cada mètode:
Mysqli Object Oriented i Procedural
/* Es supossa que existeix una connexió */
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
En el SQL, inserim un signe d'interrogació ( ? ) On volem substituir en un enter, cadena, valor doble o blob.
A continuació, fer un cop d'ull a la funció bind_param ():
$stmt- >bind_param ( "sss" , $cognom , $cognom , $email ) ;
Aquesta funció enllaça les paràmetres a la instrucció SQL i li diu a la base de dades quins són els paràmetres. L'argument sss diu els tipus de dades de cada paràmetre. El caràcter s diu que el paràmetre és una cadena.
Els tipus de dades poden ser de quatre tipus:
- i - nombre enter
- d - doble
- s - cadena
- b - BLOB
En dir-li a mysql quin tipus de dades que poden esperar, minimitzem el risc d'injeccions SQL.
PDO
/* Es supossa que existeix una connexió */
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// insert a row
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
Seleccionar dades
A continuació mostro un exemple amb cada mètode:
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table><tr><th>ID</th><th>Name</th></tr>";
// output data of each row
while($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["id"]."</td><td>".$row["firstname"]." ".$row["lastname"]."</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
Mysql Procedural
/* Es supossa que existeix una connexió */
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$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["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
PDO
<?php
foreach($conn->query('SELECT * FROM table') as $row) {
echo $row['field1'].' '.$row['field2']; //etc...
}
El mètode query()
retorna un objecte PDOStatement
. Podries recórrer les dades de la següent manera:
<?php
$stmt = $conn->query('SELECT * FROM table');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['field1'].' '.$row['field2']; //etc...
}
o:
<?php
$stmt = $conn->query('SELECT * FROM table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
//use $results
Si queremos hacer una consulta consulta a un id
<?php
$stmt = $conn->query('SELECT * FROM table where id=2');
$results = $stmt->fetch(PDO::FETCH_ASSOC);
//use $results
</source>
Esborrar registres
A continuació mostro un exemple amb cada mètode:
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
// sql to delete a record
$sql = "DELETE FROM MyGuests WHERE id=3";
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . $conn->error;
}
Mysql Procedural
/* Es supossa que existeix una connexió */
// sql to delete a record
$sql = "DELETE FROM MyGuests WHERE id=3";
if (mysqli_query($conn, $sql)) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . mysqli_error($conn);
}
PDO
/* Es supossa que existeix una connexió */
// sql to delete a record
$sql = "DELETE FROM MyGuests WHERE id=3";
// use exec() because no results are returned
$conn->exec($sql);
echo "Record deleted successfully";
Actualitzar Dades
A continuació mostro un exemple amb cada mètode:
Mysqli Object Oriented
/* Es supossa que existeix una connexió */
$sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2";
if ($conn->query($sql) === TRUE) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . $conn->error;
}
Mysql Procedural
/* Es supossa que existeix una connexió */
$sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2";
if (mysqli_query($conn, $sql)) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . mysqli_error($conn);
}
PDO
/* Es supossa que existeix una connexió */
$sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2";
// Prepare statement
$stmt = $conn->prepare($sql);
// execute the query
$stmt->execute();
// echo a message to say the UPDATE succeeded
echo $stmt->rowCount() . " records UPDATED successfully";
}
//también puede ser esta otra forma
// $sql = "UPDATE myguests SET lastname='Doe' WHERE id=2";
// $conn->exec($sql);
GESTION INSITUTO
Se trata de hacer la gestión de un instituto por tanto, en nuestra base de datos tendremos una tabla en la cual almacenaremos usuario, password, role (introduciremos un usuario de cada). Deberemos poner un formulario de acceso en función del usuario accederá a su página de sesión, deberá mostrar un mensaje si es alumno, profesor o directora.
SOLUCIÓ
Exercici Login
Crea una pàgina on hi hagi 3 opcions:
- Registrar usuari
- Esborrar usuari
- Login d'usuari
A la pàgina de login d'usuari accedirà a una intranet on pot veure el seu nom i un enllaç per sortir de sessió. Totes les dades d'usuari s'emmagatzemen a base de dades.
Fer un CRUD
Tenemos una base de datos llamada 'crud' que contiene Nombre, email y datos, se desea crear una web que muestre los datos de esa tabla, los edite, elimine y cree. solució
Exercici: Login
Crea un formulari HTML com el del [proxy] del institut que utilitzi el mètode GET i un altre que utilitzi el mètode POST. Imprimeix per pantalla el nom d'usuari i la contrasenya codificada en MD5 i en SHA1.
https://es.stackoverflow.com/questions/97719/encriptar-contrase%c3%b1a-o-datos-md5-sha1
solució:
Exercici de Rols
Utilitzant com a a base la solució de l'exercici anterior volem crear una aplicació on hi hagi dos ROL, l'usuari Administrador que podrà crear usuaris i esborrar-los i l'usuari Normal que només podrà accedir a la Intranet. L'usuari Administrador podrà Crear i Eliminar usuaris una vegada hagi entrat a la Intranet.
Exercici Carret de compra
Es vol que a la intranet de l'exercici anterior afegir la funcionalitat de carret de compra.
- L'administració pot afegir i treure productes.
- L'usuari logat pot anar seleccionat productes al carret i, quan l'usuari vulgui, fer la compra de tot el carret.
SINGLETON
class Connection
{
// Contenedor Instancia de la clase
private static $instance = NULL;
private $con = NULL;
// Constructor privado, previene la creación de objetos vía new
private function __construct() {
$this->con = mysqli_connect("localhost", "jnoguera","jnoguera","jnoguera_prueba");
}
// Clone no permitido
private function __clone() { }
// Método singleton
public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new Connection();
}
return self::$instance;
}
public function insertar($firstname, $lastname, $email, $fecha){
$sql = "INSERT INTO MyGuests (firstname, lastname, email, reg_date ) VALUES ('$firstname', '$lastname', '$email','$fecha')";
if ($this->con->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}
}
$con= Connection::getInstance();
print_r($con);
//$con->insertar('julio','noguera','nuevo@mail.com','2019-11-07 18:55:32');
echo "<br>";
$con1= Connection::getInstance(); //es la misma instancia
print_r($con1);
echo "<br>";
$con2 = new Connection();
print_r($con2->getInstance()); //No crea la instancia
echo "<br>";
https://blog.michelletorres.mx/patron-singleton-en-php/ https://evilnapsis.com/2019/03/07/patron-singleton-en-php-caso-practico/