Category Archives: PHP

PHP Prepared Statements and Data Binding

pdo-php

La maggior parte dei database oggi supportano il concetto di prepared statements ma che cosa sono, ne avete mai visto uno? Dicono abbia la coda lunga ed un occhio solo… 🙄
In realtà è uno strumento avanzato e molto più sicuro per eseguire query in “modalità protetta” mettendosi così al riparo da minacce come SQL Injection. Sul sito ufficiale scrivono “They can be thought of as a kind of compiled template for the SQL that an application wants to run, that can be customized using variable parameters”, più chiaro di così!

I principali vantaggi sono due:

  1. Utilizzando prepared statement l’applicazione evita di ripetere il ciclo di analisi, compilazione e ottimizzazione della query e ciò si traduce in un minor utilizzo di risorse e quindi maggiore velocità.
  2. Se un’applicazione utilizza esclusivamente prepared statement, lo sviluppatore può essere certo che nessuna SQL injection si verificherà.

I prepared statements sono talmente utili ed importanti al punto da essere l’unica caratteristica che PDO emulerà anche per i drivers che non li supportano e questo garantisce all’applicazione il medesimo paradigma di acceso ai dati in maniera del tutto indipendente dal motore di database che si è scelto di utilizzare.

A questo punto basta con le chiacchiere e passiamo a vedere un pò di codice, nell’esempio precedente abbiamo visto come eseguire una query passando direttamente al metodo query() la stringa sql


<?php
include dirname(__FILE__).'/connection.php';

  $connection = new Connection();
  $db = $connection->getConnection();
  // Preparo la query passando i parametri nella query stessa es. matricola = 2
  $sql = " SELECT * FROM Employee WHERE matricola = 2 ";
  // Eseguo la query che mi restituirà come risultato un PDOStatement object
  $resultSet = $db->query($sql);
  print_r($resultSet->fetchObject());
?>

Come detto poc’anzi, questo modo di accedere al db è molto pericoloso in quanto esposto ad attacchi di tipo SQL Injection. Per prevenire ciò modificheremo il codice come segue utilizzando i appunto prepared statements


<?php
include dirname(__FILE__).'/connection.php';

  $connection = new Connection();
  $db = $connection->getConnection();
  // Preparo lo statement
  $stmt = $db->prepare('SELECT * FROM Employee WHERE matricola = ?');
  // Eseguo la query sostituendo il ? con i valori dell'array
  $stmt->execute(array(2));
?>

PDO è in grado di capire il tipo di dato da utilizzare grazie a quello associato al corrispondente valore contenuto nell’array oppure nel caso in cui l’array dovesse contenere valori associati non corrispondendi a tipi di dato previsti dalla query il risultato sarà semplicemente un insuccesso della query ma in ogni caso il nostro database non sarà esposto a pericoli derivanti da attacchi di tipo SQL injections.
I punti interrogativi possono essere sostituiti utilizzando un altro sistema per il binding dei dati basato su stringhe, molto più semplicemente in termini di righe di codice avremo la seguente situazione


<?php
include dirname(__FILE__).'/connection.php';

  $connection = new Connection();
  $db = $connection->getConnection();
  // Preparo lo statement
  $stmt = $db->prepare('SELECT * FROM Employee WHERE matricola = :matricola AND tipo = :ufficio');
  // Eseguo la query sostituendo i valori
  $stmt->execute(array(':matricola'=>2, ':ufficio'=>'amministrativo'));
?>

Anche in questo caso il meccanismo è il medesimo ma sostituiamo i ? con dei nomi che facilitano l’individuazione dei parametri associati.
Per finire è da notare il metodo messo a disposizione da PDO bindParam() che consente di specificare una variabile o un valore come parametro per una query prima della sua esecuzione


<?php
include dirname(__FILE__).'/connection.php';

  $connection = new Connection();
  $db = $connection->getConnection();
  $stmt = $db->prepare ("SELECT * FROM Employee WHERE matricola = :matricola AND tipo = :ufficio");
  $stmt -> bindParam(':matricola', $_POST['matricola'], PDO::PARAM_INT);
  $stmt -> bindParam(':ufficio', $_POST['ufficio'], PDO::PARAM_STR, 12);
  $stmt -> execute();
?>

A questo punto non vi resta che provare per prendere dimistichezza con questo strumento tanto potente e tanto utile quanto semplice nel suo utilizzo.
Alla prossima.


PHP PDO

Category : PHP

pdo-phpPHP Data Objects è una delle estensioni più interessanti introdotte nella versione 5 di PHP, grazie ad essa si può finalmente rimediare ad una grave mancanza che per lungo tempo ha caratterizzato questo linguaggio e cioè l’assenza di un’unica interfaccia per l’accesso alle basi di dati.

Si immagini di lavorare su un progetto che prevede la creazione di un sito Web basato sull’interazione con un DBMS per l’accesso ai dati, il Database manager utilizzato potrebbe essere per esempio MySQL; a questo scopo lo sviluppatore potrà sfruttare le potenzialità messe a disposizione dalle funzioni native mysql_ based o mysqli_ based, ma cosa succederebbe se, per una qualsiasi esigenza, ci si ritrovasse di fronte alla necessità di trasferire il sito Web su un altro server che ha come DBMS di riferimento SQLServer?

Semplice, si avrebbe la necessità di riscrive l’applicazione da zero o almeno la parte che riguarda l’accesso ai dati. Con PDO invece è ora possibile accedere a dati messi a disposizione da differenti tipologie di Database manager tra cui anche MySQL, SQLite, PostgreSQL, SQLserver e Oracle grazie al fatto che esso fornisce un data-access abstraction layer ovvero un livello più alto di astrazione per l’accesso ai dati, si tratta “semplicemente” di una classe che mette a disposizione un insieme di sotto-classi derivate che agiscono in modo trasparente rispetto all’utente.

Detto ciò ecco un esempio della classe che utilizzo nelle mie WebApp


<?php

class Connection{

  protected $db;

  public function Connection(){

  $conn = NULL;
  $dsn = 'mysql:host=127.0.0.1;dbname=nomeDelDB';
  $user = 'username';
  $password = 'lamiapassword';

  try{
    $conn = new PDO($dsn, $user, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
      echo 'ERROR CONNECTION: ' . $e->getMessage();
    }
    $this->db = $conn;
  }

  public function getConnection(){
    return $this->db;
  }
}

?>
Per accedere ai dati utilizzo il seguente codice

<?php

include dirname(__FILE__).'/connection.php';

  $connection = new Connection();
  $db = $connection->getConnection();
        $sql = " SELECT * FROM Employee WHERE matricola = 2 ";
  $resultSet = $db->query($sql);
       print_r($resultSet->fetchObject());
     
?>

Pec Aruba & PHP Mailer

phpmailerPer chi ha provato ad inviare pec via web con phpmailer seguendo il tutorial di aruba circa la configurazione del server SMTP probabilmente si è trovato nella condizione, come me, di pensare di cambiare mestiere e di andare a fare il carrozziere piuttosto che il ragazzo che consegna i giornali con la bicicletta.

Scherzi a parte e tornando al nostro problema, senza perdere altro tempo posto il codice funzionante con qualche commento. Sono a disposizione per chiarimenti o per riflessioni.


<?php 
  public function sendPec($email) {
    $mail = new PHPMailer();
    $mail->IsSMTP();
    // Da abilitare sontanto in fase di sviluppo.
    $mail->SMTPDebug = 4;
    $mail->Debugoutput = 'html';
    */
    $mail->SMTPAuth = true;
    $mail->SMTPSecure = 'tsl';
    $mail->SMTPOptions = array(
      'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
      )
    );
    $mail->Timeout = '60';
    /*
    Alcuni fornitori bloccano il traffico SMTP in uscita su IPv6.
    Per evitare questo utilizziamo la funzione gethostbyname()
    */
    $mail->Host = gethostbyname('smtps.pec.aruba.it');
    $mail->Port = 587;
    $mail->Username = 'test@pec.it';
    $mail->Password = 'LA-TUA-PASSWORD';
    $mail->AddAddress($email, '');
    $mail->AddReplyTo("noreply@iltuodominio.it", "Do not reply");
    $mail->SetFrom('test@pec.it', 'Email Pec di Testing');
    $mail->IsHTML(true);
    $mail->Subject = "Oggetto della email che si vuole inviare";
    $mail->Body = "

    $mail->Body = "<h1>Test invio Aruba Pec da PHPMailer con html.</h1>";
    if(!$mail->Send()){
      echo 'Mailer error: ' . $mail->ErrorInfo;
      return false;
    } else {
      return true;
    }
  }
?>

Orologio digitale in php

Category : Javascript , PHP

phpLa cosa orrenda nel creare un orologio è l’aggiornamento costante della pagina, in questo script reperito in rete è possibile visualizzare un orologio digitale che si aggiorna ogni secondo grazie al metodo setInterval di javascript. Con Jquery poi effettuiamo la chiamata Ajax


<?php
if (isset($_GET['clock'])) {
    echo date("H:i:s");
    die();
}
?>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function() {
        setInterval(function() {
            $.get("?clock", function(data) {
                $("#digitalClock").html(data);
            });
        }, 1000);
    });
</script>

Per quanto riguarda la visualizzazione basta creare un div con id=”digitalClock”


<div id="digitalClock">
  <?php echo date("H:i:s"); ?>
</div>

Questo articolo è reperito in rete e in buona fede ritenuto di pubblico dominio, qualora la sua pubblicazione violasse eventuali diritti d’autore vogliate comunicarmelo vi e-mail, provvederò alla sua conseguente rimozione o modifica.


WP to LinkedIn Auto Publish Powered By : XYZScripts.com