Posts Tagged ‘MySQL’

Get Wikipedia content

Tuesday, June 29th, 2010

Wikipedia is a huge source of content for people who need big text data.

Wikipedia allow to get these data and provide database and documentation on this link.

My own experience allow to make such statements:

  • It’s painfull to parse Wiki language (Wikecode or WikiText), even if many tools exist (Mylyn etc..), proprietary templates make substitutions not possible.
  • The best Wikitext parser is Wikipedia itself…
  • Creating a local Wikipedia mirror is painfull and poorly documented.
  • Get parsed arcticles from Wikipedia website is not a problem when it is as slow as 1 article per second, but getting a large amout of articles is very long (1 article = 1 sec <=> 100000 articles = 1 whole day)
  • Arcticles must be filtered because everything is in Wikipedia, best and worst.

I was able to get data from Wikipedia in these few steps:

  1. Prerequisites
    MySQL server and tools
    Java virtual machine (the path of java.exe must be in PATH environnement variable)
    Custom Java tool WikiDump [ Sources - Compiled version ] (in the compiled version a batch is provided to launch a demo,  an exception is thrown as expected but it doesn’t interrupt  the process )
  2. Go to website http://download.wikimedia.org/enwiki/latest/ to get MySQL dumps:
    enwiki-latest-category.sql.gz
    : Contains a list of categories and arcticles count.
    enwiki-latest-categorylinks.sql.gz
    : Makes the link between articles and categories.
  3. Import theses scripts in a MySQL database (with Windows I used MySQL Administrator).
    Note: The process is long (many hours).
  4. Filter wanted articles by executing the following query to get desired portals:SELECT * FROM category WHERE cat_pages > 0 AND cat_title LIKE “Portal:%” ORDER BY cat_pages DESCOnce portals choosen  (take and refuse), select included articles. Execute following query (put your own portals here):

    SELECT cl_data_in.cl_from FROM ((SELECT DISTINCT cl3.cl_from FROM categorylinks AS cl3 WHERE cl3.cl_to IN (“Portal:take1,Portal:take2″)) AS cl_data_in)
    WHERE cl_data_in.cl_from NOT IN (SELECT DISTINCT cl2.cl_from FROM categorylinks AS cl2 WHERE LOWER(cl2.cl_to LIKE “liste d%”) OR cl2.cl_to IN (“Disambiguation_pages”,”Portal:refuse1″))

    Once article list is filtered, export result in csv file, not matter file format, the goal is to have an article id by line.

    Cleanup the file, delete column name and empty lines.

  5. To launch process to get content, type in command line:
    java -jar WikiDump.jar article_file_path output_directory > log.txt

Récupérer le contenu de Wikipedia

Saturday, June 26th, 2010

Wikipedia est une gigantesque source de contenu pour celui qui a besoin d’ une grand quantité de données en format texte.

Récupérer ces données est autorisé, Wikipedia fourni même des moyens pour récupérer tous styles de données ainsi que de la documentation (sommaire et fouillie) à cette adresse.

Mon expérience personnelle permet de faire les constats suivants:

  • Il est difficile de parser le balisage propre à Wiki (Wikicode ou Wikitext), même si de nombreux outils existent en Java ( Mylyn etc..) la présence de templates spécifiques Wikipedia rend certaines substitutions impossibles simplement.
  • Le meilleur parser de Wikitext est Wikipedia lui même…
  • Installer un mirroir exact de Wikipedia en local est long fastidieux et assez mal documenté
  • La récupération des articles parsés directement par Wikipedia à 1 article par seconde ne pose pas de problème à Wikipedia, mais le processus est très long (1 article = 1 sec <=> 100000 articles = 1 jour)
  • Les articles doivent être filtrés car on a de tout, le meilleurs comme le pire

J’ai pu récupérer les données de Wikipedia de la manière suivante:

  1. Pré requis
    Serveur et outils MySQL
    Machine virtuelle java (le chemin de java.exe doit être dans la variable d’environnement PATH)
    L’utilitaire maison java WikiDump [ Sources - Version compilée ] (dans la version compilée un batch est fourni pour lancer une démo, l’exception qui apparait est voulue, elle n’interrompt pas le traitement )
  2. Se rendre sur le site http://dumps.wikimedia.org/frwiki/latest/ afin de télécharger les dumps MySQL:
    frwiki-latest-category.sql.gz
    : Contenant la liste des catégories et le nombre d’articles qui s’y ratache.
    frwiki-latest-categorylinks.sql.gz
    : Permettant de faire le lien entre les articles et les catégories.
  3. Importer les scripts dans une base de données MySQL (sous Windows j’ai utilisé MySQL Administrator).
    Note: Le processus est relativement long (3 heures environ).
  4. Filtrer les articles voulus en lançant la requête suivante afin de récupérer les catégories Portail : SELECT * FROM category WHERE cat_pages > 0 AND cat_title LIKE “Portail:%” ORDER BY cat_pages DESC

    Une fois les portails choisis (A prendre et A refuser), il est nécessaire d’en sélectionner les articles. Lancer la requête suivante en mettant votre propre liste de portails:

    SELECT cl_data_in.cl_from FROM ((SELECT DISTINCT cl3.cl_from FROM categorylinks AS cl3 WHERE cl3.cl_to IN ("Portail:APrendre1,Portail:APrendre2")) AS cl_data_in)
    WHERE cl_data_in.cl_from NOT IN (SELECT DISTINCT cl2.cl_from FROM categorylinks AS cl2 WHERE LOWER(cl2.cl_to LIKE "liste d%") OR cl2.cl_to IN ("Homonymie","Portail:ARefuser1"))

    Une fois la liste des articles récupérés les exporter dans un fichier csv ou autre, le format importe peu, l’essentiel est d’avoir un identifiant par ligne.

    Nettoyer le fichier en supprimant le nom de colonne et les ligne vides.

  5. Pour lancer la récupération du contenu, dans la ligne de commande, tapper:java -jar WikiDump.jar Chemin_fichier_articles Repertoire_de_destination > log.txt

Une fois le dernier (long) traitement effectué, vous avez pu récupérer une quantité de données au delà de vos espérances.

Par courtoisie, si vous effectuez un gros ramassage, n’oubliez pas de faire à un don à Wikipedia.

PHP multi database management

Sunday, May 30th, 2010

In some projects, we sometimes need to make them work on different database engine (MySQL, MS SQL, Oracle). These databases are mostly common but have some specific behaviour. Something great would have been to be able to switch from a database engine to antother without modifying every request method.

In the following code, once database primitives’ methods are set up, a simple change in a config file allow to switch from a database to another.

Object polymorphism is used here so you must understand object programming in PHP 5.

The following class provide abstract methode which will have to be overriden for ever databse engine, it also provide common method of database engines. The main goal is not to code for common database query but to be able to specialize if not.


<?php
/**
 * Generic connection class
 */

require_once("config.php");

abstract class Connection
{
 protected $_hConnection = null;

 /*****************************************************
 * Specific method to override
 *****************************************************/

 protected abstract function FullConnect($sHost, $sUsername, $sPassword, $sDbName);
 public abstract function ExecQuery($sQuery);
 public abstract function FetchArrayResultInArray($result);
 public abstract function FetchSingleResultInArray($result, $nRowIndex=0);
 public abstract function GetLastError();

 /*****************************************************
 * Date management methode to override
 *****************************************************/

 public abstract function DateComparison($sDateFieldName, $sDate);
 public abstract function SystemDateFormat($sDateFieldName);
 public abstract function FrenchDateFormat($sDateFieldName);

 /*****************************************************
 * Common database method
 *****************************************************/

 public function Connect()
 {
 $this->FullConnect(DB_HOST, DB_USERNAME, DB_PASWORD, DB_NAME);
 }

 public function DieOnLastError()
 {
 $sLastError = $this->GetLastError();
 die ($sLastError);
 }

 /*****************************************************
 * Common business method
 *****************************************************/

 public function getUsers()
 {
 $sQuery = "SELECT * FROM `user`";

 $result = $this->ExecQuery($sQuery);

 $aUsers = $this->FetchArrayResultInArray($result);

 return $aUsers;
 }

 /*****************************************************
 *Specific business method to override
 *****************************************************/

 public abstract function getFirstUser();

}

?>

MySQL specific:


<?php

/**
 * MYSQL Specific
 */

require_once("Connection.class.php");

class MYSQLConnection extends Connection{
 protected function FullConnect($sHost, $sUsername, $sPassword, $sDbName)
 {
 if ($this->_hConnection != null)
 return true;

 //Connection
 $this->_hConnection = mysql_connect($sHost, $sUsername, $sPassword);
 if ($this->_hConnection == null)
 $this->DieOnLastError();

 //db selection
 $bSuccess = mysql_select_db($sDbName, $this->_hConnection);

 if(!$bSuccess)
 $this->DieOnLastError();

 return $bSuccess;

 }

 public function ExecQuery($sQuery)
 {
 if ($this->_hConnection == null)
 return null;

 //Exec query
 $result = mysql_query($sQuery, $this->_hConnection);

 if ($result == null)
 $this->DieOnLastError();

 return $result;
 }

 public function FetchArrayResultInArray($result)
 {
 $aRows = array();

 while($aRow = mysql_fetch_array($result))
 {
 array_push($aRows, $aRow);
 }

 return $aRows;

 }

 public function FetchSingleResultInArray($result, $nRowIndex=0)
 {
 $aRows = array();

 while($aRow = mysql_fetch_array($result))
 {
 if (count($aRow)>$nRowIndex)
 array_push($aRows, $aRow[$nRowIndex]);
 }

 return $aRows;
 }

 public function DateComparison($sDateFieldName, $sDate)
 {
 $sFormat = "%s = '%s'";
 $sComparison = sprintf($sFormat, $sDateFieldName, $sDate);

 return $sComparison;
 }

 public function SystemDateFormat($sDateFieldName)
 {
 return $sDateFieldName;
 }

 public function FrenchDateFormat($sDateFieldName)
 {
 $sFormat = "date_format(%s, '%%e/%%m/%%Y')";

 $sDateFormat = sprintf($sFormat, $sDateFieldName);

 return $sDateFormat;
 }

 public function GetLastError()
 {
 return mysql_error();
 }

 /**
 * MySQL specific business method
 * Return first user
 * @return Array User
 */
 public function GetFirstUser()
 {
 $sQuery = "SELECT * FROM `user` LIMIT 1";

 $result = $this->ExecQuery($sQuery);

 $user = $this->FetchArrayResultInArray($result);

 return $user;
 }

}
?>

MS SQL specific:


<?php

/**
 * MS SQL Specific
 */

require_once("Connection.class.php");

class MSSQLConnection extends Connection
{
 protected function FullConnect($sHost, $sUsername, $sPassword, $sDbName)
 {
 if ($this->_hConnection != null)
 return true;

 //Connection
 $this->_hConnection = mssql_connect($sHost, $sUsername, $sPassword);
 if ($this->_hConnection == null)
 $this->DieOnLastError();

 //db delection
 $bSuccess = mssql_select_db($sDbName, $this->_hConnection);

 if(!$bSuccess)
 $this->DieOnLastError();

 return $bSuccess;

 }

 public function ExecQuery($sQuery)
 {
 if ($this->_hConnection == null)
 return null;

 //Exec query
 $result = mssql_query($sQuery, $this->_hConnection);

 if ($result == null)
 $this->DieOnLastError();

 return $result;
 }

 public function FetchArrayResultInArray($result)
 {
 $aRows = array();

 while($aRow = mssql_fetch_array($result))
 {
 array_push($aRows, $aRow);
 }

 return $aRows;

 }

 public function FetchSingleResultInArray($result, $nRowIndex=0)
 {
 $aRows = array();

 while($aRow = mssql_fetch_array($result))
 {
 if (count($aRow)>$nRowIndex)
 array_push($aRows, $aRow[$nRowIndex]);
 }

 return $aRows;
 }

 public function DateComparison($sDateFieldName, $sDate)
 {
 $sFormat = "%s = CONVERT(datetime,'%s',121)";
 $sComparison = sprintf($sFormat, $sDateFieldName, $sDate);

 return $sComparison;
 }

 public function SystemDateFormat($sDateFieldName)
 {
 $sFormat = "CONVERT(CHAR(10), %s, 121)";

 $sDateFormat = sprintf($sFormat, $sDateFieldName);

 return $sDateFormat;
 }

 public function FrenchDateFormat($sDateFieldName)
 {
 $sFormat = "CONVERT(CHAR(10), %1\$s, 103) AS %1\$s";

 $sDateFormat = sprintf($sFormat, $sDateFieldName);

 return $sDateFormat;
 }

 public function GetLastError()
 {
 return mssql_get_last_message();
 }

 /**
 * MS SQL Specific business method
 * Return fist user
 * @return Array User
 */
 public function GetFirstUser()
 {
 $sQuery = "SELECT TOP 1 * FROM `user`";

 $result = $this->ExecQuery($sQuery);

 $user = $this->FetchArrayResultInArray($result);

 return $user;
 }

}
?>

A factory class which create connection object depending to configuration:


<?php
/**
 * Conection factory depending confuguration
 */

require_once("config.php");

switch(TARGET_DB)
{
 case "MSSQL":
 require_once("MSSQLConnection.class.php");
 break;
 case "MYSQL":
 require_once("MYSQLConnection.class.php");
 break;
 default:
 die(TARGET_DB." not implemented<br>");
}

 class ConnectionFactory {
 public static function getConnection()
 {
 switch(TARGET_DB)
 {
 case "MSSQL":
 return new MSSQLConnection();
 case "MYSQL":
 return new MYSQLConnection();
 default:
 die(TARGET_DB." not implemented<br>");
 }
 }
 }
 ?>

Configuration file to switch beetween database engines and parameters:


<?php

 //Connection parameters
 define("TARGET_DB","MYSQL");

 define("DB_HOST","localhost");
 define("DB_USERNAME","root");
 define("DB_PASWORD","root");
 define("DB_NAME","sample");

?>

An example file whitch excute getUsers(), a business method common between data engines and defined in generic class Connection, and a specialized method called getFirstUser().


<?php

require_once('ConnectionFactory.class.php');

$connection = ConnectionFactory::getConnection();

$connection->connect();

$users = $connection->getUsers();
$firstUser= $connection->getFirstUser();

echo("Users:<br/>");
print_r($users);

echo("<br/><br/>First User:<br/>");
print_r($firstUser)

?>

To add new business methods, first you have to know if query syntax is common or specific:

  • Common: Add it to Connection class
  • Specific: Add it to specialized class (here MYSQLConnection et MSSQLConnection)

To add a new databse engine, you’ll have to create a new class which inherit from Connection, to override specifics methods and to add it in ConnectionFactory class.

Finally, you’ve just to change TARGET_BD and connection parameters from config file.

Click here do download full source code.

Multi bases de données en PHP

Sunday, May 30th, 2010

Pour certains projets, il est parfois nécessaire qu’ils puissent fonctionner sur plusieurs types de base de données (MySQL, MS SQL, Oracle…). Ces bases de données ont à la fois de grandes similitudes ainsi que certaines spécificités. L’idéal serait qu’en passant d’une base de données à une autre, on ne soit pas obligé de modifier le code pour chaque requête exécutée.

Dans le code suivant, une fois que les  primitives d’accès aux types de bases de données sont configurées, un simple changement dans le fichier de configuration permet de passer d’un type de base donnée à un autre.

Le polymorphisme objet est utilisé ici, il est donc nécessaire au préalable de maîtriser les classes PHP 5.

La classe suivante fournit les méthodes abstraites qui devront être redéfinie par héritage pour chaque type de basse de données, elle comprend également les méthodes communes aux différentes base de données. L’intérêt est de ne pas coder les requêtes pour chaque type de base de données si elles sont identiques, mais de pouvoir les spécialiser dans le cas contraire.


<?php
/**
 * Objet de connection générique
 */

require_once("config.php");

abstract class Connection
{
 protected $_hConnection = null;

 /*****************************************************
 * Fonctions spécifiques aux bdd à redéfinir
 *****************************************************/

 protected abstract function FullConnect($sHost, $sUsername, $sPassword, $sDbName);
 public abstract function ExecQuery($sQuery);
 public abstract function FetchArrayResultInArray($result);
 public abstract function FetchSingleResultInArray($result, $nRowIndex=0);
 public abstract function GetLastError();

 /*****************************************************
 * Gestion des dates a redefinir
 *****************************************************/

 public abstract function DateComparison($sDateFieldName, $sDate);
 public abstract function SystemDateFormat($sDateFieldName);
 public abstract function FrenchDateFormat($sDateFieldName);

 /*****************************************************
 * Fonctions commmunes aux bdd
 *****************************************************/

 public function Connect()
 {
 $this->FullConnect(DB_HOST, DB_USERNAME, DB_PASWORD, DB_NAME);
 }

 public function DieOnLastError()
 {
 $sLastError = $this->GetLastError();
 die ($sLastError);
 }

 /*****************************************************
 * Fonctions de gestions communes aux bases de données
 *****************************************************/

 public function getUsers()
 {
 $sQuery = "SELECT * FROM `user`";

 $result = $this->ExecQuery($sQuery);

 $aUsers = $this->FetchArrayResultInArray($result);

 return $aUsers;
 }

 /*****************************************************
 * Fonctions de gestions spécifiques aux bases de données
 *****************************************************/

 public abstract function getFirstUser();

}

?>

Le dérivation de la class Connection pour MySQL:


<?php

/**
 * Description of MYSQLConnectionclass
 *
 */

require_once("Connection.class.php");

class MYSQLConnection extends Connection{
 protected function FullConnect($sHost, $sUsername, $sPassword, $sDbName)
 {
 //Si la connexion est déjà établie
 if ($this->_hConnection != null)
 return true;

 //Connexion
 $this->_hConnection = mysql_connect($sHost, $sUsername, $sPassword);
 if ($this->_hConnection == null)
 $this->DieOnLastError();

 //Sélection de la bdd
 $bSuccess = mysql_select_db($sDbName, $this->_hConnection);

 if(!$bSuccess)
 $this->DieOnLastError();

 return $bSuccess;

 }

 public function ExecQuery($sQuery)
 {
 //Si la connexion n'a pas été effectuée ou n'est pas valide
 if ($this->_hConnection == null)
 return null;

 //Exécution de la requête
 $result = mysql_query($sQuery, $this->_hConnection);

 if ($result == null)
 $this->DieOnLastError();

 return $result;
 }

 public function FetchArrayResultInArray($result)
 {
 $aRows = array();

 while($aRow = mysql_fetch_array($result))
 {
 array_push($aRows, $aRow);
 }

 return $aRows;

 }

 /**
 * Création d'une array de donné avec seulement une valeur de la row retournée
 * nRowIndex est la position de la donnée dans la row
 * @param <type> $result
 * @param <type> $nRowIndex
 * @return <type>
 */
 public function FetchSingleResultInArray($result, $nRowIndex=0)
 {
 $aRows = array();

 while($aRow = mysql_fetch_array($result))
 {
 if (count($aRow)>$nRowIndex)
 array_push($aRows, $aRow[$nRowIndex]);
 }

 return $aRows;
 }

 /**
 * Regles de comparaison dans la clause WHERE
 * @param <type> $sDateFieldName
 * @param <type> $sDate
 */
 public function DateComparison($sDateFieldName, $sDate)
 {
 $sFormat = "%s = '%s'";
 $sComparison = sprintf($sFormat, $sDateFieldName, $sDate);

 return $sComparison;
 }

 /**
 * Formattage des dates dans la clause SELECT pour obtenir AAAA-MM-JJ
 * @param <type> $sDateFieldName
 */
 public function SystemDateFormat($sDateFieldName)
 {
 return $sDateFieldName;
 }

 /**
 * Formattage des dates dans la clause SELECT pour obtenir JJ/MM/AAAA
 * @param string $sDateFieldName
 */
 public function FrenchDateFormat($sDateFieldName)
 {
 $sFormat = "date_format(%s, '%%e/%%m/%%Y')";

 $sDateFormat = sprintf($sFormat, $sDateFieldName);

 return $sDateFormat;
 }

 /**
 * Renvoit la dernière erreur du serveur
 * @return string LastErrorMessage
 */
 public function GetLastError()
 {
 return mysql_error();
 }

 /**
 * Spécialisation de la méthode pour MySQL
 * Retourne le premier user
 * @return Array L'utilisateur
 */
 public function GetFirstUser()
 {
 $sQuery = "SELECT * FROM `user` LIMIT 1";

 $result = $this->ExecQuery($sQuery);

 $user = $this->FetchArrayResultInArray($result);

 return $user;
 }

}
?>

La spécialisation MS SQL:


<?php

/**
 * Objet de connection MSSQL
 */

require_once("Connection.class.php");

class MSSQLConnection extends Connection
{
 protected function FullConnect($sHost, $sUsername, $sPassword, $sDbName)
 {
 //Si la connexion est déjà établie
 if ($this->_hConnection != null)
 return true;

 //Connexion
 $this->_hConnection = mssql_connect($sHost, $sUsername, $sPassword);
 if ($this->_hConnection == null)
 $this->DieOnLastError();

 //Sélection de la bdd
 $bSuccess = mssql_select_db($sDbName, $this->_hConnection);

 if(!$bSuccess)
 $this->DieOnLastError();

 return $bSuccess;

 }

 public function ExecQuery($sQuery)
 {
 //Si la connexion n'a pas été effectuée ou n'est pas valide
 if ($this->_hConnection == null)
 return null;

 //Exécution de la requête
 $result = mssql_query($sQuery, $this->_hConnection);

 if ($result == null)
 $this->DieOnLastError();

 return $result;
 }

 public function FetchArrayResultInArray($result)
 {
 $aRows = array();

 while($aRow = mssql_fetch_array($result))
 {
 array_push($aRows, $aRow);
 }

 return $aRows;

 }

 /**
 * Création d'une array de données avec seulement une valeur de la row retournée
 * nRowIndex est la position de la donnée dans la row
 * @param <type> $result
 * @param <type> $nRowIndex
 * @return <type>
 */
 public function FetchSingleResultInArray($result, $nRowIndex=0)
 {
 $aRows = array();

 while($aRow = mssql_fetch_array($result))
 {
 if (count($aRow)>$nRowIndex)
 array_push($aRows, $aRow[$nRowIndex]);
 }

 return $aRows;
 }

 /**
 * Regles de comparaison dans la clause WHERE
 * @param <type> $sDateFieldName
 * @param <type> $sDate
 */
 public function DateComparison($sDateFieldName, $sDate)
 {
 $sFormat = "%s = CONVERT(datetime,'%s',121)";
 $sComparison = sprintf($sFormat, $sDateFieldName, $sDate);

 return $sComparison;
 }

 /**
 * Formattage des dates dans la clause SELECT pour obtenir AAAA-MM-JJ
 * @param <type> $sDateFieldName
 */
 public function SystemDateFormat($sDateFieldName)
 {
 $sFormat = "CONVERT(CHAR(10), %s, 121)";

 $sDateFormat = sprintf($sFormat, $sDateFieldName);

 return $sDateFormat;
 }

 /**
 * Formattage des dates dans la clause SELECT pour obtenir JJ/MM/AAAA
 * @param string $sDateFieldName
 */
 public function FrenchDateFormat($sDateFieldName)
 {
 $sFormat = "CONVERT(CHAR(10), %1\$s, 103) AS %1\$s";

 $sDateFormat = sprintf($sFormat, $sDateFieldName);

 return $sDateFormat;
 }

 /**
 * Renvoit la dernière erreur du serveur
 * @return string LastErrorMessage
 */
 public function GetLastError()
 {
 return mssql_get_last_message();
 }

 /**
 * Spécialisation de la méthode pour MSSQL
 * Retourne le premier user
 * @return Array L'utilisateur
 */
 public function GetFirstUser()
 {
 $sQuery = "SELECT TOP 1 * FROM `user`";

 $result = $this->ExecQuery($sQuery);

 $user = $this->FetchArrayResultInArray($result);

 return $user;
 }

}
?>

Une classe factory permettant de créer l’objet de connexion pour le type de base de données cible selon la configuration:


<?php
/**
 * Gérateur de connection en fonction du type de base de données configuré
 */

require_once("config.php");

switch(TARGET_BD)
{
 case "MSSQL":
 require_once("MSSQLConnection.class.php");
 break;
 case "MYSQL":
 require_once("MYSQLConnection.class.php");
 break;
 default:
 die(TARGET_BD." pas encore implemente<br>");
}

 class ConnectionFactory {
 public static function getConnection()
 {
 switch(TARGET_BD)
 {
 case "MSSQL":
 return new MSSQLConnection();
 case "MYSQL":
 return new MYSQLConnection();
 default:
 die(TARGET_BD." pas encore implemente<br>");
 }
 }
 }
 ?>

Le fichier de configuration permettant de cibler le type de base de donnée et les paramètres de connexion:


<?php

 //Paramètres de connexion à la bdd
 define("TARGET_BD","MYSQL");

 define("DB_HOST","localhost");
 define("DB_USERNAME","root");
 define("DB_PASWORD","pwd");
 define("DB_NAME","sample");

?>

Un exemple d’utilisation qui permet d’exécuter la méthode getUsers() dont la syntaxe de la requête est commune aux différents type de bases de données et est définie dans la classe générique Connection.
La méthode getFirstUser() illustre une méthode qui est spécialisée par base de données.
On remarque qu’à l’utilisation rien de diffère l’une de l’autre grâce au mécanisme de polymorphisme:


<?php

require_once('ConnectionFactory.class.php');

$connection = ConnectionFactory::getConnection();

$connection->connect();

$users = $connection->getUsers();
$firstUser= $connection->getFirstUser();

echo("Users:<br/>");
print_r($users);

echo("<br/><br/>First User:<br/>");
print_r($firstUser)

?>

Pour ajouter de nouvelles méthodes d’accès à la base de données, il suffit de déterminer si la syntaxe de la requête est commune ou spécique à un moteur de bdd.

  • Si elle commune, l’ajouter dans la classe Connection
  • Si elle est spécifique, l’ajouter dans les fichiers spéciques (ici MYSQLConnection et MSSQLConnection)

Pour ajouter un nouveau moteur de base de données, il est nécessaire de créer une classe héritant de Connection, d’implémenter les méthodes spécifique (connexion, fetch, gestion des dates etc…), puis de modifier ConnectionFactory pour le prendre en compte.

Pour finir, il suffit de modifier TARGET_BD du fichier de config ainsi que les parmètres de connexion pour simplement passer d’un type de base de données à l’autre.

Cliquer ici pour télécharger les sources complètes.