Skip navigation.

ADOdb Tutorial in French (Francais)

Thanks to Daniel Lucazeau daniel.lucazeau#ajornet.com for the translation

Exemple 1: Instruction Select

But: Se connecter à la base Access Northwind par DSN, et visualiser les deux premières colonnes de chaque ligne.

Dans cet exemple, nous créons un objet ADOConnection, qui représente la connection à la base de données. La connexion est réalisée par PConnect, qui est une connexion persistante. A chaque fois que nous devons activer une requête sur une base de données, nous devons appeler la fonction ADOConnection.Execute(). Celle-ci retourne un objet ADORecordSet qui est un curseur contenant la ligne courante dans le tableau fields[]. On utilise MoveNext() pour parcourir les lignes.

NB: SelectLimit, fonction permettant de limiter le nombre de lignes renvoyées, n'est pas utilisée dans cet exemple.

<?
include('adodb.inc.php');       # charge le code deADOdb
$conn = &ADONewConnection('access');    # crée une connexion
$conn->PConnect('northwind');   # se connecte à MS-Access, northwind DSN
$recordSet = &$conn->Execute('select * from products');
if (!$recordSet) 
	print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
	print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
	$recordSet->MoveNext();
}

$recordSet->Close(); # optionnel $conn->Close(); # optionnel ?>

L'objet $recordSet renvoyé contient la ligne courante dans le tableau $recordSet->fields, tableau indexé par le numéro de la colonne (commençant à zéro). On utilise la fonction MoveNext() pour aller de ligne en ligne. La proriété EOF est valorisée à true quand la fin du fichier est atteinte. Si une erreur survient dans Execute(), on retourne false au lieu d'un objet recordset.

Le tableau $recordSet->fields[] est généré par les extensions bases de données de PHP. Quelques extensions de bases de données indexent uniquement par des nombres et n'indexent pas le tableau par le nom des champs. Pour forcer l'indexation par les noms - c'est à dire obtenir des tableaux associatifs - il faut utiliser la variable globale $ADODB_FETCH_MODE. Chaque recordset conserve et utilise la valeur du mode de renvoie qui a été sélectionnée lorts de la création du recordset par les fonctions Execute() or SelectLimit().

	$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
	$rs1 = $db->Execute('select * from table');
	$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
	$rs2 = $db->Execute('select * from table');
	print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1')
	print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')

Pour obtenir le nombre de lignes d'une instruction select , il faut utiliser $recordSet->RecordCount(). Si le nombre de lignes ne peut être déterminé, la valeur renvoyée est -1.

Exemple 2: Utilisation avancée de l'objet Field dans une requête de sélection

But : Faire un Select sur une table, renvoyer les deux premières colonnes. Et si la seconde est une date ou un timestamp, le mettre au foramt de date US.

<?
include('adodb.inc.php');       # charge le code commun deADOdb
$conn = &ADONewConnection('access');    # crée une  connexion
$conn->PConnect('northwind');   # se connecte à MS-Access, northwind dsn
$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders');
if (!$recordSet) 
	print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
	$fld = $recordSet->FetchField(1);
	$type = $recordSet->MetaType($fld->type);

if ( $type == 'D' || $type == 'T') print $recordSet->fields[0].' '. $recordSet->UserDate($recordSet->fields[1],'m/d/Y').'<BR>'; else print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';

$recordSet->MoveNext(); } $recordSet->Close(); # optionnel $conn->Close(); # optionnel ?>

Dans cet exemple, nous étudions le type de champ de la seconde colonne avec FetchField(). Cette fonction retourne un objet avec au moins trois champs.

  • name: nom de la colonne
  • type: Type natif du champ de la colonne
  • max_length: longueur maximum du champ. Quelques bases de données, comme MySQL, ne retournent pas correctement la longueur maximum d'un champ. dans ce cas max_length est valorisée à -1.

On utilise ensuite MetaType() pour convertir le type natif en type generique. actuellement les types generiques suivants sont définis :

  • C: champs caractères qui peuvent être restitués dans un <input type="text"> tag.
  • X: TeXt, champs «large text» fields restitués dans un <textarea>
  • B: Blobs, ou Binary Large Objects. des images typiquement.
  • D: Champ date
  • T: Champ timestamp
  • L: Champ logique (booléen ou champ de bits)
  • I:  Champ entier
  • N: Champ numérique. incluant autoincrement, numerique, valeur flottante, réel et entier.
  • R: Champ «serial». Incluant serial, entiers autoincrement. This works for selected databases.

Si le metatype ets de type date ou timestamp, alors nous l'éditons en utilisant format utilisateur avec UserDate(), qui convertit la date au format PHP SQL dans un autre format, défini par l'utilisateur. Une autre utilisation de MetaType() est la validation des données avant d'exécuter une instruction SQL insert or update.

Exemple 3: Insertion

But : Insérer une ligne dans la table Orders contenant des dates et des chaînes de caractères nécessitant d'être quotées (backslashées) avant de pouvoir être acceptées par la base de données, par exemple le guillemet simple dans le mot John's.

<?
include('adodb.inc.php');       # load code common toADOdb
$conn = &ADONewConnection('access');    # create a connection

$conn->PConnect('northwind'); # connect to MS-Access, northwind dsn $shipto = $conn->qstr("John's Old Shoppe");

$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) "; $sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";

if ($conn->Execute($sql) === false) { print 'error inserting: '.$conn->ErrorMsg().'<BR>'; } ?>

Dans cet exemple, nous voyons la gestion évoluée des dates et des quotes fournie parADOdb. Le timestamp Unix (qui est un entier long) est de façon appropriée préparé pour Access avec DBDate(), et le caractère d'échappement correct est utilisé pour protéger la chaîne de caractère John's Old Shoppe, qui est John''s Old Shoppe et non la valeur par défaut de PHP John's Old Shoppe avec qstr().

Notez la gestion des erreurs dans l'instruction Execute. Execute() retourne false si une erreur survient. Le mesage d'erreur de la dernière erreur survenue est obtenu par ErrorMsg(). Note: il faut pour cela que php_track_errors soit à vrai pour que les messages puissent être sauvegardés.

Exemple 4: Debugging

<?
include('adodb.inc.php');       # charge le code commun deADOdb
$conn = &ADONewConnection('access');    # crée une connexion
$conn->PConnect('northwind');   # se connecte to MS-Access, northwind dsn
$shipto = $conn->qstr("John's Old Shoppe");
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
$conn->debug = true;
if ($conn->Execute($sql) === false) print 'error inserting';
?>

Dns l'exemple ci-dessus, on a activé le debuggage par debug = true. Cela permet la visualisation de l'instruction SQL avant son exécution, cela affiche aussi tous les messages d'erreurs éventuels. dans ce cas, il n'y a pas besoin d'appeler ErrorMsg(). Pour visualiser le recordset voir l'exemple d'utilisation de lafonction rs2html().

Voir aussi la section sur la Gestion Personnalisée des erreurs.

Exemple 5: MySQL et les Menus

But : Se connecter à la base MySQL agora, et générer un menu avec la balise <select> à partir d'une requête SQL dans laquelle les libellés des balises <option> sont dans la première colonne , et les valeurs renvoyées au serveur sont la seconde.

<?
include('adodb.inc.php'); # load code common toADOdb
$conn = &ADONewConnection('mysql');  # create a connection
$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
$sql = 'select CustomerName, CustomerID from customers';
$rs = $conn->Execute($sql);
print $rs->GetMenu('GetCust','Mary Rosli');
?>

Nous définissons ici un menu nommé GetCust, avec l'option nommée 'Mary Rosli' pré-sélectionnée. Voir GetMenu(). Il ya aussi une fonction qui renvoie un recordset sous forme d'un tableau : GetArray(), ou comme un tableau associatif dont les clés sont dans la première colonne : GetAssoc().

Depuis la version 1.50 deADOdb la variable globale $ADODB_FETCH_MODE permet de définir si l'on souhaite un tableau associatif ou indexé par des entiers.

Exemple 6: Se connecter simultanément à deux bases de données

<?
include('adodb.inc.php');     # load code common toADOdb
$conn1 = &ADONewConnection('mysql');  # create a mysql connection
$conn2 = &ADONewConnection('oracle');  # create a oracle connection

$conn1->PConnect($server, $userid, $password, $database); $conn2->PConnect(false, $ora_userid, $ora_pwd, $oraname);

$conn1->Execute('insert ...'); $conn2->Execute('update ...'); ?>

Exemple 7: Générer des requêtes SQL de mise à jour (Update) et d'insertion (Insert)

ADOdb 1.31 ou plus supporte deux nouvelles fonctions sur les recordset : GetUpdateSQL( ) et GetInsertSQL( ). Elles permettent à partir de l'exécution d'une requête "SELECT * FROM table query WHERE...", de faire une copie de $rs->fields, d'en modifier les champs, et ensuite de générer l'instruction SQL pour mettre à jour ou insérer un nouvel enregistrement dans la table.

On va montrer comment ces fonctions peuvent être utilisées en acèdant à la table avec les champs suivants : (ID, FirstName, LastName, Created).

Avant de pouvoir utiliser ces fonctions, il faut initialiser le recordset par l'exécution d'une requête de sélection sur cette table. Idée et code de Jonathan Younger jyounger#unilab.com.

<?
#==============================================
# SAMPLE GetUpdateSQL() and GetInsertSQL() code
#==============================================
include('adodb.inc.php');
include('tohtml.inc.php');

#========================== # This code tests an insert

$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; # Select an empty record from the database

$conn = &ADONewConnection("mysql"); # create a connection $conn->debug=1; $conn->PConnect("localhost", "admin", "", "test"); # connect to MySQL, testdb $rs = $conn->Execute($sql); # Execute the query and get the empty recordset

$record = array(); # Initialize an array to hold the record data to insert

# Set the values for the fields in the record $record["firstname"] = "Bob"; $record["lastname"] = "Smith"; $record["created"] = time();

# Pass the empty recordset and the array containing the data to insert # into the GetInsertSQL function. The function will process the data and return # a fully formatted insert sql statement. $insertSQL = $conn->GetInsertSQL($rs, $record);

$conn->Execute($insertSQL); # Insert the record into the database

#========================== # This code tests an update

$sql = "SELECT * FROM ADOXYZ WHERE id = 1"; # Select a record to update

$rs = $conn->Execute($sql); # Execute the query and get the existing record to update

$record = array(); # Initialize an array to hold the record data to update

# Set the values for the fields in the record $record["firstname"] = "Caroline"; $record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith

# Pass the single record recordset and the array containing the data to update # into the GetUpdateSQL function. The function will process the data and return # a fully formatted update sql statement with the correct WHERE clause. # If the data has not changed, no recordset is returned $updateSQL = $conn->GetUpdateSQL($rs, $record);

$conn->Execute($updateSQL); # Update the record in the database $conn->Close(); ?>

Exemple 8: Pagination avec « Next » et « Previous »

Le code suivant crée une pagination très simple d'un recordset, ce qui permet de le visualiser de page en page.

include_once('../adodb.inc.php');
include_once('../adodb-pager.inc.php');
session_start();

$db = NewADOConnection('mysql');

$db->Connect('localhost','root','','xphplens');

$sql = "select * from adoxyz ";

$pager = new ADODB_Pager($db,$sql); $pager->Render($rows_per_page=5);

Ce code crée la pagination de base suivante qui ressemble à ceci :

|<   <<   >>   >|  

IDFirst NameLast NameDate Created
36  Alan  Turing  Sat 06, Oct 2001 
37  Serena  Williams  Sat 06, Oct 2001 
38  Yat Sun  Sun  Sat 06, Oct 2001 
39  Wai Hun  See  Sat 06, Oct 2001 
40  Steven  Oey  Sat 06, Oct 2001 

Page 8/10

Le nombre de lignes de chaque page est défini par la méthode Render($rows). La valeur par défaut du nombre de lignes par page est fixée à 10, obtenue par l'absence de paramètre passée à la méthode.

On contrôle le titre des colonnes en modifiant la requête SQL(supporté par la plupart des bases de données) :

$sql = 'select id as "ID", firstname as "First Name", 
          lastname as "Last Name", created as "Date Created" 
from adoxyz';

Le code ci-dessus est extrait de l'exemple adodb/tests/testpaging.php inclus avec cette version, et la classe ADODB_Pager est dans adodb/adodb-pager.inc.php. Le code de ADODB_Pager peut être adapté par un programmeur afin de remplacer les liens textuels par des liens sur des images, et la triste couleur blanche du fond peut elle être remplacée par des couleurs plus attrayantes.

Une partie du code utilisé ici est issu de la contribution de Iván Oliva and Cornel G.

Exemple 9: Exportrer des données au format CSV ou délimté par des tabulations

La librairie fourni des fonctions utils pour exporter au format CSV - délimité par des point-virgules - ou au format délimité par des tabulations:

include_once('/path/to/adodb/toexport.inc.php');
include_once('/path/to/adodb/adodb.inc.php');
$db = &NewADOConnection('mysql');
$db->Connect($server, $userid, $password, $database);

$rs = $db->Execute('select fname as "First Name", surname as "Surname" from table');

print "<pre>";
print rs2csv($rs); # retourne une chaîne de caractères, au format CSV

print '<hr>';
$rs->MoveFirst(); # attention, quelques SGBD ne supportent pas le MoveFirst
print rs2tab($rs,false); # retourne une chaîne de caractères au format délimité par des tabulations # false == supprime la première ligne avec les nom des champs

print '<hr>';
$rs->MoveFirst();
rs2tabout($rs); # envoie directement la chaîne vers la sortie standard (il y a aussi la fonction rs2csvout) print "</pre>";

$rs->MoveFirst();
$fp = fopen($path, "w"); if ($fp) {
rs2csvfile($rs, $fp); # écrit la chaîne dans un fichier (il ya aussi la fonction rs2tabfile) fclose($fp);
}

Les retour-chariot el sauts de ligne sont convertis en espace. Les noms des champs sont restitués dans la première ligne du text. Les chaînes contenant le caractère délimiteur sont restituées «quotées» par des guillemets doubles. Les guillemets doubles sont eux «double-quoted». C'est conforme aux règles d'import-export d'Excel.

Toutes les fonctions ci-dessus ont un dernier paramètre optionnel, $addtitles qui vaut true par défaut. Quand il est valorisé à false la première ligne du fichier ne contient pas le nom des champs mais directement les données.