<?xml version="1.0" encoding="utf-8"?><rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:cc="http://backend.userland.com/creativeCommonsRssModule"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    
	<channel>
		<title>Gastero Prod - Tags - PEAR</title>
		<link>http://www.gasteroprod.com/tags/pear.html</link>
		<description></description>
		<image>
			<url>http://www.gasteroprod.com/design/images/button_gasteroprod.png</url>
			<width>80</width>
			<height>15</height>
			<title>Gastero Prod</title>
			<link>http://www.gasteroprod.com/</link>
		</image>
		<language>fr</language>
		<generator>SPIP 2.0.0 dev</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<ttl>60</ttl>
		<cc:license>http://creativecommons.org/licenses/by-nc-sa/1.0/</cc:license>
		
		<item>
			<title>Guide du d&#233;butant pour PEAR DB</title>
			<link>http://www.gasteroprod.com/blog/blog/guide-du-debutant-pour-pear-db.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>Traduction du tutoriel de <a href="mailto:cox@idecnet.com" class="spip_mailto">Tomas V. V. Cox</a> publié en anglais à l&#8217;adresse suivante&nbsp;: <a href="http://vulcanonet.com/soft/?pack=pear_tut" class="spip_url spip_out">http://vulcanonet.com/soft/?pack=pe...</a></p></div>
        	<div><h3 class="spip">Introduction (à écrire !)</h3>
<p>Ceci est un tutoriel sur l&#8217;utilisation de l&#8217;extension PEAR DB.</p>

<p>PEAR DB est un ensemble de classe proposant&nbsp;:</p>

<ul class="spip"><li> abstraction de bases de données</li><li> gestion avancée des erreurs</li><li> etc </li></ul>
<h3 class="spip">Obtenir et installer Pear</h3>
<p>Pour le moment, le projet PEAR est encore fortement en développement, donc le meilleur moyen de l&#8217;obtenir est depuis le CVS (la distribution de PEAR DB livrée avec PHP est obsolète, même celle avec PHP 4.0.6 !). Ensuite, la seule chose que vous avez à faire est d&#8217;ajouter le répertoire racine de PEAR au paramètre <i>include_path</i> de votre fichier <i>php.ini</i>. Vous pouvez aussi procéder comme ceci&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>ini_set('include_path', '/pear_base_dir');</code></div>
<p>Voici un exemple pas à pas&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>Placez-vous là où vous voulez que soient les sources de PEAR<br />
# cd /usr/local/lib<br />
Connectez-vous au CVS (utilisez &quot;phpfi&quot; comme mot de passe)<br />
# cvs -d :pserver:cvsread@cvs.php.net:/repository login<br />
Lancez la commande suivante pour récupérer tous les fichiers<br />
de PEAR. Vous pouvez également l'utiliser pour mettre à jour<br />
des fichiers déjà récupérés. D'autres options possibles sont<br />
&quot;today&quot;, &quot;last month&quot;, ...<br />
# cvs -d :pserver:cvsread@cvs.php.net:/repository export -D &quot;last week&quot; php4/pear<br />
Editez votre php.ini et ajoutez le répertoire /usr/local/lib/php4/pear<br />
à votre paramètre include_path. Si vous n'avez pas accès au<br />
fichier php.ini, vous pouvez utiliser<br />
ini_set('include_path', 'path_to_pear'); dans votre code.</code></div>
<p>La documentation complète du CVS PHP peut être trouvée <a href="http://cvs.php.net/" class="spip_out">ici</a>.</p>

<p>Notez que PEAR DB nécessite PHP > 4.0.4, mais d&#8217;autres packages  de PEAR comme le parser XML Parser ou le script <i>pear installer</i> nécessitent PHP >= 4.0.5.</p>

<p>Pour l&#8217;instant, ce guide couvre la dernière version CVS de PEAR DB, mais il peut être valide pour toute version récente.</p>

<h3 class="spip">Utilisation de PEAR DB</h3>
<p><strong>Se connecter et se déconnecter d&#8217;une base de données</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// The pear base directory must be in your include_path<br />
require_once 'DB.php';<br />
$user = 'foo';<br />
$pass = 'bar';<br />
$host = 'localhost';<br />
$db_name = 'clients_db';<br />
// Data Source Name: This is the universal connection string<br />
$dsn = &quot;mysql://$user:$pass@$host/$db_name&quot;;<br />
// DB::connect will return a Pear DB object on success<br />
// or a Pear DB Error object on error<br />
// You can also set to TRUE the second param<br />
// if you want a persistent connection:<br />
// $db = DB::connect($dsn, true);<br />
$db = DB::connect($dsn);<br />
// With DB::isError you can diferentiate between an error or<br />
// a valid conection.<br />
if (DB::isError($db)) {<br />
 &nbsp;die ($db-&gt;getMessage());<br />
}<br />
....<br />
// You can disconnect from the database with:<br />
$db-&gt;disconnect();<br />
?&gt;</code></div>
<p>La chaine de connexion Data Source Name (paramètre <i>$dsn</i> dans l&#8217;exemple ci-dessus) peut avoir les formats autorisés suivants (copie directe de la méthode parseDSN de pear/DB.php)&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>* &nbsp;phptype: Database backend used in PHP (mysql, odbc etc.)<br />
* &nbsp;dbsyntax: Database used with regards to SQL syntax etc.<br />
* &nbsp;protocol: Communication protocol to use (tcp, unix etc.)<br />
* &nbsp;hostspec: Host specification (hostname[:port])<br />
* &nbsp;database: Database to use on the DBMS server<br />
* &nbsp;username: User name for login<br />
* &nbsp;password: Password for login<br />
*<br />
* The format of the supplied DSN is in its fullest form:<br />
*<br />
* &nbsp;phptype(dbsyntax)://username:password@protocol+hostspec/database<br />
*<br />
* Most variations are allowed:<br />
*<br />
* &nbsp;phptype://username:password@protocol+hostspec:110//usr/db_file.db<br />
* &nbsp;phptype://username:password@hostspec/database_name<br />
* &nbsp;phptype://username:password@hostspec<br />
* &nbsp;phptype://username@hostspec<br />
* &nbsp;phptype://hostspec/database<br />
* &nbsp;phptype://hostspec<br />
* &nbsp;phptype(dbsyntax)<br />
* &nbsp;phptype</code></div>
<p>Les bases de données actuellement supportées (partie <i>phptype</i> du DSN) sont&nbsp;:</p>

<table class="spip">
<tbody>
<tr class='row_even'>
<td>mysql</td>
<td>MySQL</td></tr>
<tr class='row_odd'>
<td>pgsql</td>
<td>PostgreSQL</td></tr>
<tr class='row_even'>
<td>ibase</td>
<td>InterBase</td></tr>
<tr class='row_odd'>
<td>msql</td>
<td>Mini SQL</td></tr>
<tr class='row_even'>
<td>mssql</td>
<td>Microsoft SQL Server</td></tr>
<tr class='row_odd'>
<td>oci8</td>
<td>Oracle 7/8/8i</td></tr>
<tr class='row_even'>
<td>odbc</td>
<td>ODBC (Open Database Connectivity)</td></tr>
<tr class='row_odd'>
<td>sybase</td>
<td>SyBase</td></tr>
<tr class='row_even'>
<td>ifx</td>
<td>Informix</td></tr>
<tr class='row_odd'>
<td>fbsql</td>
<td>FrontBase</td></tr>
</tbody>
</table>
<p>Notez que certaines fonctionnalités peuvent ne pas être supportées par tous les gestionnaires de bases de données. Référez-vous au document donnant le status des extensions PEAR DB situé dans <i>&lt;pear base dir>/DB/STATUS</i> pour avoir la liste détaillée.</p>

<p><strong>Effectuer une requête dans la base de données</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Once you have a valid DB object<br />
...<br />
$sql = &quot;select * from clients&quot;;<br />
// If the query is a &quot;SELECT&quot;, $db-&gt;query will return<br />
// a DB Result object on success.<br />
// Else it simply will return a DB_OK<br />
// On failure it will return a DB Error object.<br />
$result = $db-&gt;query($sql);<br />
// Always check that $result is not an error<br />
if (DB::isError($result)) {<br />
 &nbsp;die ($result-&gt;getMessage());<br />
}<br />
...<br />
?&gt;</code></div>
<p><strong>Récupérer les enregistrements résultant de la requête</strong></p>

<p><i> <strong>Fonctions fetch</strong> </i></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Once you have a valid DB Result object<br />
...<br />
// Get each row of data on each iteration until<br />
// there is no more rows<br />
while ($row = $result-&gt;fetchRow()) {<br />
 &nbsp;$id = $row[0];<br />
}<br />
?&gt;</code></div>
<p>Plutôt que <i>fetchRow()</i> vous pouvez utiliser <i> <strong>fetchInto()</strong> </i> qui renseigne directement la valeur <i>$row</i>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
while ($result-&gt;fetchInto($row)) {<br />
 &nbsp;$id = $row[0];<br />
}<br />
?&gt;</code></div>
<p><i> <strong>Sélectionner le format de l&#8217;enregistrement récupéré</strong> </i></p>

<p>Les modes de <i>fetch</i> supportés sont <i>DB_FETCHMODE_ORDERED</i> (par défaut), <i>DB_FETCHMODE_ASSOC</i> et <i>DB_FETCHMODE_OBJECT</i>.</p>

<p>Exemples de structures de données retournées par les méthodes <i>fetch</i>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
$res = $db-&gt;query('select id, name, email from users');<br />
$row = $res-&gt;fetchRow($mode);<br />
//With $mode = DB_FETCHMODE_ORDERED<br />
//The default behavior is to return an ordered array.<br />
$row = array (<br />
 &nbsp;0 =&gt; &lt;column &quot;id&quot; data&gt;,<br />
 &nbsp;1 =&gt; &lt;column &quot;name&quot; data&gt;,<br />
 &nbsp;2 =&gt; &lt;column &quot;email&quot; data&gt;<br />
);<br />
$id = $row[0];<br />
//With $mode = DB_FETCHMODE_ASSOC<br />
//Returns an associative array with column names as array keys:<br />
$row = array (<br />
 &nbsp;'id' &nbsp; &nbsp;=&gt; &lt;column &quot;id&quot; data&gt;,<br />
 &nbsp;'name' &nbsp;=&gt; &lt;column &quot;name&quot; data&gt;,<br />
 &nbsp;'email' =&gt; &lt;column &quot;email&quot; data&gt;<br />
);<br />
$id = $row['id'];<br />
//With $mode = DB_FETCHMODE_OBJECT<br />
//Returns a DB_row object with column names as properties:<br />
$row = db_row Object<br />
(<br />
 &nbsp;[id] &nbsp; &nbsp;=&gt; &lt;column &quot;id&quot; data&gt;,<br />
 &nbsp;[name] &nbsp;=&gt; &lt;column &quot;name&quot; data&gt;,<br />
 &nbsp;[email] =&gt; &lt;column &quot;email&quot; data&gt;<br />
)<br />
$id = $row-&gt;id;<br />
?&gt;</code></div>
<p><i> <strong>Configurer le format des enregistrements retournés</strong> </i></p>

<p>Vous pouvez indiquer quel mode de retour utiliser aux méthodes <i>fetchRow()</i> et <i>fetchInto()</i> ou définir un mode par défaut pour l&#8217;instance de DB.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
// 1) Set the mode per call:<br />
while ($row = $result-&gt;fetchRow(DB_FETCHMODE_ASSOC)) {<br />
 &nbsp;[..]<br />
}<br />
while ($result-&gt;fetchInto($row, DB_FETCHMODE_ASSOC)) {<br />
 &nbsp;[..]<br />
}<br />
// 2) Set the mode for all calls:<br />
$db = DB::connect($dsn);<br />
// this will set a default fetchmode for this Pear DB instance<br />
// (for all queries)<br />
$db-&gt;setFetchMode(DB_FETCHMODE_ASSOC);<br />
$result = $db-&gt;query(...);<br />
while ($row = $result-&gt;fetchRow()) {<br />
 &nbsp;$id = $row['id'];<br />
}<br />
?&gt;</code></div>
<p><i> <strong>Récupérer les enregistrements par indice</strong> </i></p>

<p>Le système de <i>fetch</i> de PEAR DB supporte aussi un autre paramètre pour permettre de récupérer les enregistrement par leur indice numérique. Cela est particulièrement intéressant si vous souhaitez exploiter seulement une partie d&#8217;un ensemble de résultats (par exemple pour contruire des <a href="http://vulcanonet.com/soft/index.php?pack=pager" class="spip_out">listes paginées</a>), récupérer les enregistrements dans un ordre particulier, etc.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
// the row to start fetching<br />
$from = 50;<br />
// how many results per page<br />
$res_per_page = 10;<br />
// the last row to fetch for this page<br />
$to = $from + $res_per_page;<br />
foreach (range($from, $to) as $rownum) {<br />
 &nbsp;if (!$row = $res-&gt;fetchrow($fetchmode, $rownum)) {<br />
 &nbsp; &nbsp;break;<br />
 &nbsp;}<br />
 &nbsp;$id = $row[0];<br />
 &nbsp;....<br />
}<br />
?&gt;</code></div>
<p><i> <strong>Vider le résultat</strong> </i></p>

<p>Une fois que vous avez terminé d&#8217;utiliser le résultat, vous pouvez le vider avec la méthode <strong>free()</strong>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
$result = $db-&gt;query('SELECT * FROM clients');<br />
while ($row = $result-&gt;fetchRow()) {<br />
 &nbsp;...<br />
}<br />
$result-&gt;free();<br />
?&gt;</code></div>
<p><strong>Récupération rapide de données</strong></p>

<p>PEAR DB fourni quelques méthodes particulières pour récupérer le résultat d&#8217;une requête sans avoir besoin d&#8217;utiliser <i>fetchRow()</i> pour le parcourir. Ce sont les méthodes <i>getOne</i>, <i>getRow</i>, <i>getCol</i>, <i>getAssoc</i> et <i>getAll</i>. Voici quelques exemples d&#8217;utilisation&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
require_once 'DB.php';<br />
$db = DB::connect('pgsql://postgres@unix+localhost/clients_db');<br />
// -----------------------------------------------------------<br />
// getOne retrieves the first result of the first column<br />
// from a query<br />
$numrows = $db-&gt;getOne('select count(id) from clients');<br />
// -----------------------------------------------------------<br />
// getRow will fetch the first row and return it as an array<br />
$sql = 'select name, address, phone from clients where id=1';<br />
if (is_array($row = $db-&gt;getRow($sql))) {<br />
 &nbsp;list($name, $address, $phone) = $row;<br />
}<br />
// -----------------------------------------------------------<br />
// getCol will return an array with the data of the<br />
// selected column. It accepts the column number to retrieve<br />
// as the second param.<br />
// The next sentence could return for example:<br />
// $all_client_names = array('Stig', 'Jon', 'Colin');<br />
$all_client_names = $db-&gt;getCol('select name from clients');<br />
// -----------------------------------------------------------<br />
// Other functions are: getAssoc() and getAll().<br />
// For the moment refer to their in-line documentation<br />
// at pear/DB/common.php<br />
// -----------------------------------------------------------<br />
?&gt;</code></div>
<p>La famille des méthodes <i>get*()</i> fait tout le "sale boulot" pour vous, c&#8217;est à dire&nbsp;: exécuter la requête, récupérer les données et vider le résultat. Notez que comme toutes les fonctions de PEAR DB, elles retourneront un object PEAR DB_error en cas d&#8217;erreur.</p>

<p><strong>Obtenir plus d&#8217;informations sur le résultat des requêtes (numRows, numCols, affectedRows, tableInfo)</strong></p>

<p>Avec PEAR DB vous avez plusieurs façons d&#8217;obtenir des informations intéressantes sur les résultats de requêtes. Ce sont&nbsp;:</p>

<ul class="spip"><li> <strong>numRows()</strong>&nbsp;: Donne le nombre total d&#8217;enregistrements retournés par une requête de type "SELECT".</li><li> <strong>numCols()</strong>&nbsp;: Donne le nombre total de colonnes retournées par une requête de type "SELECT".</li><li> <strong>affectedRows()</strong>&nbsp;: Donne le nombre d&#8217;enregistrements affectés par une requête de manipulation de données ("INSERT", "UPDATE" or "DELETE").</li><li> <strong>tableInfo()</strong>&nbsp;: Donne un tableau associatif contenant des informations sur les champs retournés par une requête de type "SELECT". </li></ul>
<p>Exemples d&#8217;utilisation&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
$db = DB::connect($dsn);<br />
$sql = 'select * from clients';<br />
$res = $db-&gt;query($sql);<br />
// Don't forget to check if the returned result from your<br />
// action is a Pear Error object. If you get a error message<br />
// like 'DB_error: database not capable', means that<br />
// your database backend doesn't support this action.<br />
//<br />
// Number of rows<br />
echo $res-&gt;numRows();<br />
// Number of cols<br />
echo $res-&gt;numCols();<br />
// Table Info<br />
print_r ($res-&gt;tableInfo());<br />
// Affected rows<br />
$sql = &quot;delete from clients&quot;;<br />
// remember that this statement won't return a result object<br />
$db-&gt;query($sql);<br />
echo 'I have deleted ' . $db-&gt;affectedRows() . 'clients';<br />
?&gt;</code></div>
<p><strong>Séquences</strong></p>

<p>Les séquences sont un moyen d&#8217;obtenir des IDs uniques pour les enregistrements. Si vous faites la majeure partie de votre travail avec par exemple MySQL, pensez aux séquences comme un autre moyen de gérer AUTO_INCREMENT. Cela est relativement simple, tout d&#8217;abord vous demandez un ID, puis vous insérez cette valeur dans le champ correspondant du nouvel enregistrement que vous êtes en train de créer. Vous pouvez avoir plus d&#8217;une séquence pour toutes vos tables, mais assurez-vous que vous utilisez toujours la même séquence pour une table particulière.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
// Get an ID (if the sequence doesn't exist, it will be created)<br />
$id = $db-&gt;nextID('mySequence');<br />
// Use the ID in your INSERT query<br />
$res = $db-&gt;query(&quot;INSERT INTO myTable (id,text) VALUES ($id,'foo')&quot;);<br />
...<br />
?&gt;</code></div>
<p><strong>Prepare &amp; Execute/ExcuteMultiple (pas encore écrit)</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// UNTESTED CODE !!!<br />
//<br />
// Example inserting data<br />
$alldata = array(<br />
 &nbsp;array(1, 'one', 'en'),<br />
 &nbsp;array(2, 'two', 'to'),<br />
 &nbsp;array(3, 'three', 'tre'),<br />
 &nbsp;array(4, 'four', 'fire')<br />
);<br />
$sth = $dbh-&gt;prepare(&quot;INSERT INTO numbers VALUES(?,?,?)&quot;);<br />
foreach ($alldata as $row) {<br />
 &nbsp;$dbh-&gt;execute($sth, $row);<br />
}<br />
//Here's an example of a file placeholder:<br />
$myfile = &quot;/tmp/image.jpg&quot;;<br />
$sth = $dbh-&gt;prepare('INSERT INTO images (?, &amp;)');<br />
$dbh-&gt;execute($sth, array(&quot;this is me&quot;, $myfile));<br />
//After I commit a bugfix that I have on my laptop, you can use<br />
//parameter arrays in the getXxx methods too:<br />
$ver = $dbh-&gt;getOne(&quot;SELECT stableversion FROM packages WHERE name = ?&quot;,<br />
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;array($package));<br />
?&gt;</code></div>
<p><strong>autoCommit, commit and rollback (pas encore écrit)</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
//examples here<br />
?&gt;</code></div>
<h3 class="spip">Liste des méthodes disponibles</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
/*<br />
* From the DB_(driver) objects<br />
*/<br />
// get the object with, ie:<br />
$db = DB::connect('mysql://user:pass@localhost/my_db');<br />
<br />
// Set options<br />
$db-&gt;setErrorHandling();<br />
$db-&gt;setFetchmode();<br />
// Information<br />
$db-&gt;affectedRows();<br />
$db-&gt;tableInfo();<br />
// Database manipulation<br />
$db-&gt;query();<br />
// Data fetch<br />
$db-&gt;nextId();<br />
$db-&gt;getOne();<br />
$db-&gt;getRow();<br />
$db-&gt;getCol();<br />
$db-&gt;getAssoc();<br />
$db-&gt;getAll();<br />
// Place holders and execute related<br />
$db-&gt;quote();<br />
$db-&gt;prepare();<br />
$db-&gt;execute();<br />
$db-&gt;executeMultiple();<br />
// Transactions<br />
$db-&gt;autoCommit();<br />
$db-&gt;commit();<br />
$db-&gt;rollback();<br />
// Disconnection<br />
$db-&gt;disconnect();<br />
<br />
/*<br />
* From DB_result objects<br />
*/<br />
// get the object with, ie:<br />
$res = $db-&gt;query('select * from foo');<br />
<br />
// Data fetch<br />
$res-&gt;fetchRow();<br />
$res-&gt;fetchInto();<br />
// Result Info<br />
$res-&gt;numCols();<br />
$res-&gt;numRows();<br />
$res-&gt;tableInfo();<br />
// Free<br />
$res-&gt;free();<br />
<br />
/*<br />
* From DB_error objects<br />
*/<br />
// get the object with, ie:<br />
$error = $db-&gt;query('select * from no_table');<br />
<br />
$error-&gt;getMessage();<br />
$error-&gt;getDebugInfo();<br />
$error-&gt;toString();<br />
?&gt;</code></div>
<h3 class="spip">Gestion des erreurs</h3>
<p><strong>Récupérer le message d&#8217;erreur d&#8217;une erreur PEAR DB</strong></p>

<p>Toutes les erreurs retournées par PEAR DB sont des objets PEAR Error. Voici un moyen de récupérer leurs informations&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
$res = $db-&gt;query('select * from no_table');<br />
if (DB::isError($res)) {<br />
 &nbsp;// get the portable error string<br />
 &nbsp;echo $res-&gt;getMessage();<br />
}<br />
?&gt;</code></div>
<p><strong>Débuguer les erreurs PEAR DB</strong></p>

<p>PEAR DB utilise un système de messages d&#8217;erreur portable pour signaler les erreurs à l&#8217;utilisateur. Cela a beaucoup d&#8217;avantages comme proposer un moyen simple de les transposer en autres langages ou réaliser une action spécifique en cas d&#8217;erreur spécifique. Mais cela ne donne pas beaucoup d&#8217;informations au développeur sur ce qui est arrivé. Pour récupérer l&#8217;erreur réelle donnée par le gestionnaire de bases de données ainsi que la dernière requête effectuée, vous pouvez utiliser la méthode <i>getDebugInfo()</i>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
$sql = 'select * from no_table';<br />
if (DB::isError($res = $db-&gt;query($sql))) {<br />
 &nbsp;// get the native backend error<br />
 &nbsp;// and the last query<br />
 &nbsp;echo $res-&gt;getDebugInfo();<br />
}<br />
?&gt;</code></div>
<p>Normalement quand une fonction PHP échoue, un message d&#8217;erreur est affiché. Dans PEAR ce fonctionnement a été désactivé. Mais peut-être aurez-vous parfois besoin de visualiser ces messages pour ôter des erreurs obscures de votre code. Cela peut être fait avec la fonction PHP set_error_handler qui est documentée dans le manuel PHP. Voici un exemple simple&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// what messages to report<br />
error_reporting (E_ALL ^ E_NOTICE);<br />
// this function will handle all reported errors<br />
function my_error_handler ($errno, $errstr, $errfile, $errline) {<br />
 &nbsp;echo &quot;In $errfile, line: $errlinen&lt;br&gt;$errstr&quot;;<br />
}<br />
set_error_handler ('my_error_handler');<br />
$db = DB::connect('pgsql://postgres@localhost/no_db');<br />
...<br />
?&gt;</code></div>
<p><strong>Exécuter autmatiquement des actions en cas d&#8217;erreur</strong></p>

<p>Comme vous pouvez le voir, PEAR DB fait d&#8217;intenses vérifications et rapports d&#8217;erreurs, fonctionnalité qui oblige le développeur à toujours vérifier si le résultat de son action est ou non une erreur. PEAR DB prend aussi en charge cette tâche pénible, et propose un système très flexible pour automatiquement exécuter des actions en czas d&#8217;erreurs.</p>

<p>Les actions possibles sont&nbsp;:</p>

<ul class="spip"><li> Retourne l&#8217;objet erreur (PEAR_ERROR_RETURN). C&#8217;est l&#8217;action par défaut. </li><li> Imprime le message d&#8217;erreur (PEAR_ERROR_PRINT) </li><li> Imprime le message d&#8217;erreur et arrête l&#8217;exécution (PEAR_ERROR_DIE) </li><li> Utilise la fonction PHP <i>trigger_error()</i> pour lever une erreur PHP (PEAR_ERROR_TRIGGER) </li><li> Passe l&#8217;objet erreur à une fonction ou à une méthode d&#8217;objet (PEAR_ERROR_CALLBACK) </li></ul>
<p>Un exemple simple&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
require_once 'DB.php';<br />
// Set the default action to take on error<br />
PEAR::setErrorHandling(PEAR_ERROR_DIE);<br />
// From here you don't need to check errors any more<br />
$db = DB::connect('pgsql://postgres@localhost/my_database');<br />
$res = $db-&gt;query('select id from no_table');<br />
// at this point the execution is aborted and the error message is raisen<br />
...<br />
?&gt;</code></div>
<p>Un exemple plus complet&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Define the app evironment (this is: what errors you want to output)<br />
define ('DEBUG_ENV', true);<br />
// This function will handle all errors<br />
function handle_pear_error ($error_obj) {<br />
 &nbsp;// Be verbose while developing the application<br />
 &nbsp;if (DEBUG_ENV) {<br />
 &nbsp; &nbsp;die ($error_obj-&gt;getMessage().&quot;n&quot;.$error_obj-&gt;getDebugInfo());<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Dump a silly message if the site is in production<br />
 &nbsp;} else {<br />
 &nbsp; &nbsp;die ('Sorry you request can not be processed now. Try again later');<br />
 &nbsp;}<br />
}<br />
require_once 'DB.php';<br />
// On error, call the &quot;handle_pear_error&quot; function back<br />
// You can also use an object as pear error handler so:<br />
// setErrorHandling(PEAR_ERROR_CALLBACK, array($object,'method_name');<br />
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handle_pear_error');<br />
$db = DB::connect('pgsql://postgres@localhost/site_db');<br />
$res = $db-&gt;query('select id from no_table');<br />
// at this point the execution is aborted and the &quot;handle_pear_error&quot;<br />
// function is called with the error object as its first argument<br />
while ($row = $res-&gt;fetchRow()) {<br />
 &nbsp;...<br />
}<br />
...<br />
?&gt;</code></div>
<p>Référez-vous au <a href="http://www.php.net/manual/en/pear.reference.php" class="spip_out">manuel de référence de PEAR</a> pour obtenir la description détaillée des différentes actions possibles.</p>

<p>Voici une idée pour créer un système étendu de gestion d&#8217;erreurs&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
error_reporting (E_ALL ^ E_NOTICE);<br />
// this function will handle all errors reported by PHP<br />
function php_error_handler ($errno, $errstr, $errfile, $errline) {<br />
 &nbsp;die (&quot;In $errfile, line: $errlinen&lt;br&gt;$errstr&quot;);<br />
}<br />
set_error_handler ('php_error_handler');<br />
// this function will catch errors generated by Pear,<br />
// transform it to PHP errors and trigger them to the php_error_handler<br />
function pear_error_handler ($err_obj) {<br />
 &nbsp;$error_string = $err_obj-&gt;getMessage() . '&lt;br&gt;' . $error_obj-&gt;getDebugInfo();<br />
 &nbsp;trigger_error ($error_string, E_USER_ERROR);<br />
}<br />
require 'DB.php';<br />
PEAR::setErrorHandling (PEAR_ERROR_CALLBACK, 'pear_error_handler');<br />
// force an error<br />
$db = DB::connect('pgsql://postgres@localhost/no_db');<br />
...<br />
?&gt;</code></div>
<h3 class="spip">Remerciements</h3>
<p>Remerciements particuliers à Stig pour avoir créé le merveilleux monde de PEAR, aux personnes qui m&#8217;aident à maintenir ce document et bien sûr aussi à l&#8217;ensemble de l&#8217;équipe PEAR pour son travail permanent dessus.</p></div>
        	
        	
        </div>
        ]]></description>
			<pubDate>Fri, 12 Oct 2001 18:58:00 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>PEAR</category>
			
			<guid isPermaLink="true">blog/blog/guide-du-debutant-pour-pear-db.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/blog/blog/guide-du-debutant-pour-pear-db.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/guide-du-da-c-butant-pour-pear-db-533.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Une introduction &#224; PEAR</title>
			<link>http://www.gasteroprod.com/blog/blog/une-introduction-a-pear.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>Traduction de l&#8217;article de <a href="http://www.onlamp.com/pub/au/98" class="spip_out">Joao Prado Maia</a> publié initialement le 24 mai 2001 sur <a href="http://www.onlamp.com/pub/a/php/2001/05/24/pear.html" class="spip_out">ONLamp.com</a>, de O&#8217;Reilly.</p></div>
        	<div><h3 class="spip">Qu&#8217;est-ce que PEAR&nbsp;? Et pourquoi devrais-je m&#8217;en préoccuper ?</h3>
<p>Le projet PEAR (NDT&nbsp;: PHP Extension and Application Repository) a été lancé par Stig S. Bakken pour créer un outil similaire au CPAN de Perl. Son but principal est de devenir un entrepôt pour des extensions et scripts PHP. Le but le plus ambitieux du projet est de tenter de définir des standards qui puisse aider les développeurs à écrire du code portable et réutilisable.</p>

<p>De la documentation sur le projet commence à apparaître sur Internet, en concéquence certainement de sa popularité grandissante. Une documentation de départ peut déjà être trouvée dans le <a href="http://www.php.net/manual/fr/pear.php" class="spip_out">manuel officiel de PHP</a> et sera augmentée.</p>

<p>PEAR est encore particulièrement en travaux, notamment le "PEAR installer" et le <a href="http://pear.php.net/" class="spip_out">site dédié</a>, et il devrait beaucoup croître dans les mois à venir. Il y a de nombreuses discussions sur la mailing-list des développeurs de PHP à propos de l&#8217;usage de PEAR dans les versions futures pour gérer le nombre croissant d&#8217;extensions C et aussi de l&#8217;usage du "PEAR installer" comme interface pour que les utilisateurs téléchargent et installent des extensions PHP.</p>

<p>Tout cela sans mentionner la librairie de scripts PHP de PEAR, qui est souvent considéré comme une des plus propre et bien conçues disponible actuellement pour PHP. L&#8217;un de ses composants les plus populaires est PEAR&nbsp;::DB, la librairie d&#8217;abstraction de base de données créée pour ce projet. Bakken travaille même au portage des classes et fonctions principales en une extension C pour rendre le composant aussi rapide que possible.</p>

<p>Ce nouveau projet deviendra sûrement l&#8217;un des aspects les plus importants de PHP dans le futur, autorisant les développeurs à partager du code en utilisant le site de PEAR et en donnant aux utilisateurs l&#8217;opportunité de télécharger et installer des extensions et scripts PHP.</p>

<h3 class="spip">Comment puis-je débuter avec PEAR ?</h3>
<p>Comme mentionner précédemment, PEAR continue à évoluer et à s&#8217;améliorer. Cependant, un certain nombre de composants sont maintenant utilisables. Le plus populaire est PEAR&nbsp;::DB, qui permet au développeur d&#8217;écrire du code qui puisse être utilisé avec différents gestionnaires de bases de données. Par exemple, un développeur pourrait écrire un script qui insèrerait un enregistrement dans une table, et il fonctionnerait avec MySQL, PostgreSQL et Oracle.</p>

<p>Ainsi, l&#8217;exemple ci-dessous pourrait être utiliser avec tous les types de gestionnaires de bases de données (NDT&nbsp;: voir l&#8217;erratum en fin de page)&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Include the appropriate PEAR classes<br />
require_once(&quot;DB.php&quot;);<br />
<br />
$dsn = array(<br />
 'phptype' &nbsp;=&gt; 'mysql',<br />
 'hostspec' =&gt; 'localhost',<br />
 'database' =&gt; 'test_db',<br />
 'username' =&gt; 'test_user',<br />
 'password' =&gt; 'test_password'<br />
);<br />
$dbh = DB::connect($dsn);<br />
<br />
$stmt = &quot;SELECT id, name FROM examples ORDER BY id&quot;;<br />
$result = $dbh-&gt;simpleQuery($stmt, DB_FETCHMODE_ASSOC);<br />
if ($dbh-&gt;numRows($result) &gt; 0) {<br />
 $data = (object) $dbh-&gt;fetchRow($result, DB_FETCHMODE_ASSOC);<br />
 echo &quot;id &nbsp; =&gt; $data-&gt;id&lt;br&gt;n&quot;;<br />
 echo &quot;name =&gt; $data-&gt;name&lt;br&gt;n&quot;;<br />
}<br />
?&gt;</code></div>
<p>C&#8217;était juste un très simple exemple pour montrer à quoi ressemblerait le code avec une librairie d&#8217;abstraction comme PEAR&nbsp;::DB.</p>

<p>Un nouveau chapitre a été récemment ajouté au manuel de PHP, mais il est encore incertain si ce manuel contiendra la documentation complète de tous les composants de PEAR, ou si un nouveau manuel sera créé uniquement pour les composants de PEAR.</p>

<h3 class="spip">Procédures d&#8217;installation</h3>
<p>Installer PEAR est en fait très simple, et je vais expliquer comment installer la dernière version du CVS de PEAR, qui change si rapidement.</p>

<p>Note&nbsp;: Le mécanisme interne de gestion de l&#8217;entrepôt changera probablement dans le futur. Pour l&#8217;instant, les composants et librairies sont stockés dans le même arbre CVS que PHP, ce qui pose des problèmes pour gérer à la fois les entrepôts et développeurs de PHP et de PEAR. Dans un futur proche, il est prévisible que PEAR sera détaché dans son propre module. Ce module existe, mais la plupart des composants sont encore dans l&#8217;ancien.</p>

<h3 class="spip">Installer PEAR à partir du CVS</h3>
<p>Si vous n&#8217;avez jamais entendu parler de CVS, jetez un oeil à sa <a href="http://www.cvshome.org/" class="spip_out">documentation</a>. Ce n&#8217;est pas une technologie difficile d&#8217;usage, mais s&#8217;y accoutumer prend du temps.</p>

<p>En supposant que vous avez le client CVS standard installé sur votre machine, vous devrez suivre ces étapes&nbsp;:</p>

<p>1. Ouvrez une fenêtre de terminal (rxvt, xterm, ou autre)</p>

<p>2. Tapez les commandes suivantes&nbsp;:</p>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>cvs -z3 -d :pserver:cvsread@cvs.php.net:/repository login<br />
Password: [Entrez 'phpfi' comme mot de passe ici]<br />
cvs -z3 -d :pserver:cvsread@cvs.php.net:/repository co php4<br />
[Cela va créer un nouveau répertoire 'php4']<br />
cd php4<br />
cvs -z3 -d :pserver:cvsread@cvs.zend.com:/repository login<br />
Password: [Entrez 'zend' comme mot de passe ici]<br />
cvs -z3 -d :pserver:cvsread@cvs.zend.com:/repository co Zend TSRM<br />
[Cela va créer deux nouveaux répertoire dans 'php4', 'Zend' et 'TSRM']<br />
./buildconf</code></div>
<p>Voilà. Lancer buildconf devrait créer le script configure standard qui peut être utilisé pour définir vos paramètres pour PHP. Pour une installation normale, PEAR devrait être automatiquement installé dans /usr/local/lib/php, mais vous pouvez installer les fichiers manuellement en allant dans &#8217;php4/pear&#8217; et en lançant make install-su en tant que superuser.</p>

<p>Ensuite, vous devriez ajouter le répertoire racine de PEAR à l&#8217;include_path de votre fichier php.ini. Le chemin par défaut devrait être /usr/local/lib/php, mais cela peut être ailleurs si vous avez effectué des modification manuelles de vos paramètres de configuration.</p>

<h3 class="spip">Débuter avec PEAR</h3>
<p>Les composants de PEAR vont de l&#8217;abstraction de base de données à la gestion de cache, ce qui fait de PEAR plus qu&#8217;une simple librairie, c&#8217;est un nouveau standard pour écrire du code PHP portable et propre. L&#8217;une des plus importantes choses à faire pour un débutant avec PEAR est de lire les <a href="http://www.php.net/manual/fr/pear.standards.php" class="spip_out">styles de codage PEAR</a> qui sont publiés dans le manuel de PHP.</p>

<p>Je donnerais quelques conseil pour commencer à travailler avec PEAR&nbsp;::DB, car c&#8217;est un des composant de PEAR les plus populaires. Vous pouvez trouver des exemples et de l&#8217;aide pour utiliser PEAR&nbsp;::DB en suivant ces étapes&nbsp;:</p>

<ul class="spip"><li> Cherchez des réponses à vos question sur <a href="http://marc.theaimsgroup.com/" class="spip_out">MARC</a>, dans <a href="http://marc.theaimsgroup.com/?l=pear-dev" class="spip_out">pear-dev</a> ou <a href="http://marc.theaimsgroup.com/?l=pear-general" class="spip_out">pear-general</a>. </li><li> Lisez les scripts de tests unitaires fournis avec le code source de PEAR. L&#8217;emplacement de ces scripts peut être trouvé dans le répertoire où se trouve votre image CVS de PHP. Dans mon cas, c&#8217;est /home/jpm/php4/pear/DB/tests/. </li><li> Parcourez l&#8217;excellent <a href="http://vulcanonet.com/soft/?pack=pear_tut" class="spip_out">tutoriel PEAR&nbsp;::DB</a> de Tomas V. V. Cox. 
J&#8217;espère que cet article a jeté un peu de lumière sur le mystérieux PEAR, et qu&#8217;il vous a fourni des informations utiles sur l&#8217;un des développements les plus prometteurs de la communauté PHP. </li></ul>
<p>Amusez-vous&nbsp;!</p>

<p><i><a href="http://www.onlamp.com/pub/au/98" class="spip_out">Joao Prado Maia</a> est développeur Web à San Francisco. Il a plus de quatre ans d&#8217;expérience en développement d&#8217;applications web et aime apprendre de nouvelles technologies et de nouveaux langages de développement.</i></p></div>
        	
        	
        </div>
        ]]></description>
			<pubDate>Thu, 24 May 2001 18:56:00 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>PEAR</category>
			
			<guid isPermaLink="true">blog/blog/une-introduction-a-pear.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/blog/blog/une-introduction-a-pear.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/une-introduction-a-pear-532.rss</wfw:commentRss>
		</item>
		
	</channel>
    
</rss>