Il logo del sito

Appunti sull'interfaccia di PHP con MySQL

Traduzione da MySQL Connect

PHP MySQL Database

§ 2. MySQL Connect

PHP 5 e le versioni successive possono lavorare con un database MySQL usando:

Le precedenti versioni di PHP usano la MySQL estension, che comunque è "deprecata" dal 2012.

§ 2.1. Dovrei usare MySQLi o PDO?

La risposta breve: "Usa quello che ti pare".

Entrambi i sistemi hanno i loro vantaggi:

PDO gira su 12 differenti sistemi di database, mentre MySQLi gira solo su MySQL. Così, se dovrai trasferire il tuo progetto su un altro database, PDO rende la cosa semplice. Devi solo cambiare la stringa di connessione e poche query. Con MySQL, dovrai riscrivere l'intero codice - queries comprese.

Entrambi i sistemi sono object-oriented, ma MySQLi offre anche una API procedurale.

Entrambi i sistemi supportano i Prepared Statements, gli statement precompilati. Gli statement precompilati proteggono da intrusioni, e sono molto importanti per la sicurezza delle applicazioni web.

In questo e nei successivi capitoli, faremo esempi secondo le tre modalità di connessione disponibili:

§ 2.2. Installazione di MySQLi

Per Linux e Windows: l'estensione MySQLi è, di solito, installata automaticamente con il package php5 mysql.

Per i dettagli di installazione vai a php.net/manual/en/mysqli.installation.php.

§ 2.3. Installazione di PDO

Per i dettagli di installazione vai a http://php.net/manual/en/pdo.installation.php.

§ 2.4. Aprire una connessione con MySQL

Il mio provider, hostinggratis.it, mette a disposizione un database mysql gestibile con il tool gratuito phpmyadmin.

Prima di poter accedere ai dati di un database MySQL occorre connettersi al server:

§ 2.4.1. Connessione con MySQLi object-oriented

   <?php
   include 'infoConnessione.php';
      
   // Create connection
   
      $conn = new mysqli($servename, $username, $password);
      
   // Check connection
   
      if ($conn-> connect_error){
         die("Connection failed: " . $conn->connect_error);
      }
      echo "<p class=phpoutput> Connessione mysqli object-oriented riuscita. </p>;
      
    // Close connection
     
      $conn->close();
   ?>                 

Connessione mysqli object-oriented riuscita.

§ 2.4.2. Connessione con MySQLi procedural

   <?php
   include 'infoConnessione.php';
      
   // Create connection 
   
      $conn = new mysqli($servename, $username, $password);
      
   // Check connection
   
      if (!$conn){
         die("Connection failed: " . mysqli_connect_error);
      }
      echo "<p class=phpoutput> Connessione mysqli procedural riuscita. </p>;
      
   // Close connection
      
      mysqli_close($conn);
   ?>                  

Connessione mysqli procedural riuscita

§ 2.4.3. Connessione con PDO

   <?php
   include 'infoConnessione.php';
      $conn = null;
      
      try{
         
         // Create connection 

         $conn = new PDO("mysql:host=$servername;", $username, $password);

         // Set Attribute 
         
         $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         
         echo "<p class=phpoutput> Connessione pdo riuscita. </p>";
      }
      catch(PDOException $e){
         
         echo "Connection failed: " . $e->getMessage();
      }
         // Close connection
      
      if ($conn != null){
         $conn = null;
      } 
   ?>             

Connessione pdo riuscita

Notare che nel testo originale dell'esempio PDO, è stato specificato il nome di un database, "myDB". E si afferma che PDO richiederebbe un nome di database valido a cui connettersi, e che, se questo non venisse specificato, sarebbe lanciata una eccezione.

Questo non mi risulta. Nell'esempio, non ho specificato alcun database, e la connessione è stata stabilita regolarmente. Se fosse vero quello scritto nella nota di w3Schools, non potrei connettermi a MySQL con PDO prima di aver creato un database. Ma come farei a creare un database senza prima connettermi?

Suggerimento: Un grande vantaggio di POD, è che dispone di una classe di eccezioni per gestire qualunque problema possa capitare in una query. Se un eccezione venisse lanciata all'interno del blocco try{}, lo script interromperebbe la sua esecuzione e salterebbe direttamente al primo blocco catch{} che incontrasse.

§ 2.5. Chiusura della connessione.

La connessione sarà chiusa automaticamente al termine dello script. Per chiudere la connessione prima, usare le seguenti direttive:

Nel codice dei tre precedenti esempi, ho sempre chiuso la connessione anche se non ce ne sarebbe stato bisogno.