<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JBJ's Blog &#187; PHP</title>
	<atom:link href="http://www.lyxia.org/blog/category/developpement/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lyxia.org/blog</link>
	<description>Lyxia.org</description>
	<lastBuildDate>Sat, 27 Feb 2010 10:24:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>script php de sauvegarde mysql</title>
		<link>http://www.lyxia.org/blog/developpement/script-php-de-sauvegarde-mysql-571</link>
		<comments>http://www.lyxia.org/blog/developpement/script-php-de-sauvegarde-mysql-571#comments</comments>
		<pubDate>Tue, 18 Aug 2009 14:49:22 +0000</pubDate>
		<dc:creator>jbl</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/?p=571</guid>
		<description><![CDATA[Cet article fait suite à cet autre article Sauvegarder/Exporter une base de données avec PHP. J'en ai eu besoin ce matin pour faire une sauvegarde d'une base de données mysql d'un site. Seul moyen d'accès que j'avais : l'accès par ftp et le site en safe mode. Pas la peine de préciser que ce script [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article fait suite à cet autre article <a href="http://www.lyxia.org/blog/developpement/php/sauvegarderexporter-une-base-de-donnees-avec-php-44">Sauvegarder/Exporter une base de données avec PHP</a>. J'en ai eu besoin ce matin pour faire une sauvegarde d'une base de données mysql d'un site. Seul moyen d'accès que j'avais : l'accès par ftp et le site en safe mode. Pas la peine de préciser que ce script m'a été bien utile !</p>
<p>J'ai fais quelques modifications dans le script, pour éviter de me heurter au timeout (non modifiable en safe mode) :</p>
<p>- un fichier par table, dans un répertoire accessible en écriture. Dans ce cas précis il s'agit du répertoire temp</p>
<p>- enregistrement immédiat de chaque ligne, qui est compressée à la volée par gz </p>
<p>- procédure de reprise en cas de problème, on relance le script après avoir modifié l'appel, <i>$dump = dump(5);</i> pour sauter les 5 premières tables par exemple.</p>
<p>- le $tables = mysql_list_tables($database, $db); m'ayant parfois causé des soucis, je l'ai remplacé par  $sql = "SHOW TABLES FROM $database";</p>
<pre>function dump($ignore)
{
 $server = '*********';
 $database = '*********';
 $user = '*********';
 $password = '*********';

 //Connexion à la base
 $db = mysql_connect($server, $user, $password) or die(mysql_error());
 mysql_select_db($database, $db) or die(mysql_error());

 //on récupère la liste des tables de la base de données
 //$tables = mysql_list_tables($database, $db) or die(mysql_error());
 $sql = 'SHOW TABLES FROM '.$database;
 $tables = mysql_query($sql) or die(mysql_error());

 // si on ne veut pas récupérer les $ignore premières tables
 for ($i=0; $i<$ignore; $i++) ($donnees = mysql_fetch_array($tables));

 // aller on boucle sur toutes les tables
 while ($donnees = mysql_fetch_array($tables))
 {
  // on récupère le create table (structure de la table)
  $table = $donnees[0];
  $sql = 'SHOW CREATE TABLE '.$table;
  $res = mysql_query($sql) or die(mysql_error().$sql);
  if ($res)
  {
   $backup_file = '../temp/backup_' . $table . '.sql.gz';
   $fp = gzopen($backup_file, 'w');

   $tableau = mysql_fetch_array($res);
   $tableau[1] .= ";\n";
   $insertions = $tableau[1];
   gzwrite($fp, $insertions);

   $req_table = mysql_query('SELECT * FROM '.$table) or die(mysql_error());
   $nbr_champs = mysql_num_fields($req_table);
   while ($ligne = mysql_fetch_array($req_table))
   {
    $insertions = 'INSERT INTO '.$table.' VALUES (';
    for ($i=0; $i<$nbr_champs; $i++)
    {
     $insertions .= '\'' . mysql_real_escape_string($ligne[$i]) . '\', ';
    }
    $insertions = substr($insertions, 0, -2);
    $insertions .= ");\n";
    gzwrite($fp, $insertions);
   }
  } // fin if ($res)
  mysql_free_result($res);
  gzclose($fp);
 }
 return true;
}

//appel de la fonction
$dump = dump(0);
</pre>
<p>Et voilà un script de sauvegarde très rapide. Il suffit d'aller récupérer les fichiers.</p>
<p>Pour ceux qui veulent sauvegarder qu'une seule table dont le nom est connu :</p>
<pre>function dump($table)
{
 $server = '******';
 $database = '******';
 $user = '******';
 $password = '******';
 //Connexion à la base
 $db = mysql_connect($server, $user, $password) or die(mysql_error());
 mysql_select_db($database, $db) or die(mysql_error());

 $sql = 'SHOW CREATE TABLE '.$table;
 $res = mysql_query($sql) or die(mysql_error().$sql);
 if ($res)
 {
   $backup_file = '../temp/backup_' . $table . '.sql.gz';
   $fp = gzopen($backup_file, 'w');

   $tableau = mysql_fetch_array($res);
   $tableau[1] .= ";\n";
   $insertions = $tableau[1];
   gzwrite($fp, $insertions);

   $req_table = mysql_query('SELECT * FROM '.$table) or die(mysql_error());
   $nbr_champs = mysql_num_fields($req_table);
   while ($ligne = mysql_fetch_array($req_table))
   {
    $insertions = 'INSERT INTO '.$table.' VALUES (';
    for ($i=0; $i<$nbr_champs; $i++)
    {
     $insertions .= '\'' . mysql_real_escape_string($ligne[$i]) . '\', ';
    }
    $insertions = substr($insertions, 0, -2);
    $insertions .= ");\n";
    gzwrite($fp, $insertions);
   }
 } // fin if ($res)
 mysql_free_result($res);
 gzclose($fp);
 return true;
}

//appel de la fonction
$dump = dump('nomdelatable');
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/script-php-de-sauvegarde-mysql-571/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Monitoring de site avec alerte mail et SMS</title>
		<link>http://www.lyxia.org/blog/developpement/php/monitoring-de-site-avec-alerte-mail-et-sms-456</link>
		<comments>http://www.lyxia.org/blog/developpement/php/monitoring-de-site-avec-alerte-mail-et-sms-456#comments</comments>
		<pubDate>Sun, 31 May 2009 09:48:49 +0000</pubDate>
		<dc:creator>jbl</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/?p=456</guid>
		<description><![CDATA[Dans la série bout de code PHP sympathique, voici un monitoring de site (surveillance) avec alerte mail et SMS.]]></description>
			<content:encoded><![CDATA[<p>En cette période de longs week-end il est toujours intéressant d'être alerté automatiquement en cas de soucis sur son ou ses sites. </p>
<p>Voici un code PHP pour surveiller que son site web répond (monitoring de site).</p>
<p>Il pourra ainsi détecter si le site ne répond pas ou si la page d'accueil contient bien le mot clé indiqué. C'est toujours utile de vérifier le contenu, dans le cas par exemple où on se fait hacker et que le hacker met juste sa signature en page d'accueil, ou plus classique le site web répond mais affiche juste un message d'erreur.</p>
<p>Ce programme de monitoring de site doit être placé sur un autre serveur que le site à surveiller afin justement de ne pas risquer d'être down en même temps. <strong>Un hébergement php gratuit</strong> fera très bien l'affaire.</p>
<p>En cas de problème ce monitoring de site envoie un mail ou une alerte SMS.</p>
<p>On crée une page PHP et on y met son include de connexion à la base de données.</p>
<p>La première chose à écrire est la fonction de monitoring de site (surveillance).</p>
<p>On regarde si le site (host) répond et si on a bien la chaine de caractères désirée (find).<br />
Retourne True si tout est ok, sinon retourne False.</p>
<pre>function check($host, $find) {
 $fp = fsockopen($host, 80, $errno, $errstr, 10);
 if (!$fp) {
  echo "$errstr ($errno)\n";
 } else {
  $header = "GET / HTTP/1.1\r\n";
  $header .= "Host: $host\r\n";
  $header .= "Connection: close\r\n\r\n";
  fputs($fp, $header);
  while (!feof($fp)) {
   $str .= fgets($fp, 1024);
  }
  fclose($fp);
  return (strpos($str, $find) !== false);
 }
}
</pre>
<p>On va maintenant écrire la fonction qui envoie le mail d'alerte et le SMS.<br />
On utilise ici le service d'envoi de sms : smsbox.fr.</p>
<pre>function alert($host) {
 global $ConnString2;
 $conn = mysql_connect($ConnString2['ip'],$ConnString2['uid'],$ConnString2['pwd']) or die('impossible de se connecter');
 mysql_select_db($ConnString2['db'], $conn) or die('erreur bdd'); 

 // on purge la table des vieux enregistrements
 $sql = 'delete from monitoring where date_add(date, interval 12 hour) < NOW()';
 mysql_query($sql) or erreurbdd (mysql_error(),$sql);

 // on historise l'alerte
 $sql = 'insert into monitoring (host, date) values (\''.$host.'\', now())';
 mysql_query($sql) or erreurbdd (mysql_error(),$sql);

 // on compte le nombre d'échecs
 $sql = 'select count(*) as tot from monitoring where host=\''.$host.'\'';
 $rs = mysql_query($sql) or erreurbdd (mysql_error(),$sql);
 $row = mysql_fetch_array($rs);

 // on envoi le sms au deuxième échec
 if ($row['tot'] == 2) {
  mail('monmail@gmail.com', 'Monitoring', $host.' down');
  mail('sms@smsbox.fr', 'login=****&#038;pass=****&#038;dest=**********&#038;mode=Expert&#038;notif=1', $host.' down');
 }
 mysql_close();
}
</pre>
<p>C'est presque terminé il faut juste écrire les appels du monitoring :</p>
<pre>$host = 'www.lyxia.org';
$find = 'Theme par JBJ';
if (!check($host, $find)) alert($host);
</pre>
<p>Et dans la base de données on crée la table monitoring</p>
<pre>CREATE TABLE `monitoring` (
  `host` varchar(25) NOT NULL,
  `date` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
</pre>
<p>Voilà on peut partir en week-end rassuré, on sera alerté en cas de soucis, et il suffira d'agir en conséquence : appel à l'hébergeur, reboot du serveur etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/monitoring-de-site-avec-alerte-mail-et-sms-456/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Communiquer entre serveurs par requêtes xml</title>
		<link>http://www.lyxia.org/blog/developpement/php/communiquer-entre-serveurs-par-requetes-xml-422</link>
		<comments>http://www.lyxia.org/blog/developpement/php/communiquer-entre-serveurs-par-requetes-xml-422#comments</comments>
		<pubDate>Sat, 28 Mar 2009 11:02:02 +0000</pubDate>
		<dc:creator>jbl</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/?p=422</guid>
		<description><![CDATA[J'ai eu comme problématique de convertir en php une fonctionnalité écrite en asp. Un serveur communique avec un autre par le biais de requêtes xml.]]></description>
			<content:encoded><![CDATA[<p>J'ai eu comme problématique de convertir en php une fonctionnalité écrite en asp. Un serveur communique avec un autre par le biais de requêtes xml.</p>
<p>Le serveur A envoie une requête XML au serveur B. Dans cette requête xml il indique les informations désirées.</p>
<p>Le serveur B lui retourne en xml les informations demandées. Le serveur A avec apache et php doit donc <strong>récupérer et traiter des données xml</strong>. C'est ici que j'interviens.</p>
<p>En ASP on se sert de :</p>
<pre>
// envoyer et récupérer le xml
set objSrvHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
// pour traiter le xml
set objXMLReceive = Server.CreateObject("MSXML2.DOMDocument")
</pre>
<p>En php sans installer rien de plus on a la solution basique du fsockopen</p>
<pre>
$page = '/GetProduct.aspx';
$host = 'www.urldusite.com';
//requête xml afin de demander la catégorie produit 250
$req = '&lt;?xml version="1.0"?>&lt;Request>'.
'&lt;Category>250&lt;/Category>'.
'&lt;/Request>';

$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)\n";
} else {
    $header = "GET $page HTTP/1.1\r\n";
    $header .= "Host: $host\r\n";
    $header .= "Content-Type: text/xml\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n";
    $header .= "Connection: close\r\n\r\n";

    fwrite($fp, $header.$req);
    while (!feof($fp)) {
        $items .= fgets($fp, 1024);
    }
    fclose($fp);
}
// la réponse du serveur est stockée dans $items
</pre>
<p>Avec cette méthode on récupère ce qu'on veut à savoir les données xml mais aussi des choses moins intéressantes qu'on appelle entête. Selon comment on va traiter ces informations il est important d'en tenir compte.</p>
<pre>
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Sat, 28 Mar 2009 10:42:26 GMT
Connection: close
Content-Type: text/xml
Expires: Fri, 27 Mar 2009 10:42:24 GMT
Set-Cookie: ShopperManager%2F=SHOPPERMANAGER%2F=0LX925TK2PT92GW500AL08MS25MSEBE2; expires=Thu, 31-Dec-2009 23:00:00 GMT; path=/
Set-Cookie: ASPSESSIONIDGQQQGRQQ=HIJLBCCAKCINKHKNLBGGNDGL; path=/
Cache-control: no-cache
Transfer-Encoding: chunked

11a6
&lt;?xml version="1.0" encoding="ISO-8859-1"?>&lt;Response>
&lt;Product>&lt;Reference>A55222&lt;/Reference>&lt;Description>En stock&lt;/Description>&lt;/Product>
&lt;Product>&lt;Reference>A65892&lt;/Reference>&lt;Description>En stock&lt;/Description>&lt;/Product>
&lt;/Response>
0
</pre>
<p>SimpleXML n'est pas installé sur le serveur j'ai donc utilisé l'expression rationnelle eregi pour récupérer les informations désirées. L'entête comprise dans la réponse ne me gène donc pas.</p>
<pre>
// on vérifie que la syntaxe xml corresponde à ce qu'on attend
if( !eregi('&lt;Response>(.*)&lt;/Response>', $items) ) {

 die("erreur");

} else {

 // on crée un tableau avec l'ensemble des informations produit
 $items = explode('&lt;Product>', $items);
 $countitems = count($items)-1;

 for( $i = 0; $i < $countitems; $i++ ) {
  // produit par produit on va chercher l'info
  eregi('&lt;Reference>(.*)&lt;/Reference>', $items[$i+1], $name);
  eregi('&lt;Description>(.*)&lt;/Description>', $items[$i+1], $desc);
  echo $name[1].'&lt;br/>'.$desc[1].'&lt;br/>&lt;br/>';
 }

}
</pre>
<p>Pour plus d'informations sur le fsockopen et en particulier <a href="http://us2.php.net/manual/en/function.fsockopen.php#36703" rel="nofollow" target="_blank">cet exemple de code</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/communiquer-entre-serveurs-par-requetes-xml-422/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Une classe php complète pour la détection du navigateur</title>
		<link>http://www.lyxia.org/blog/developpement/php/une-classe-php-complete-pour-la-detection-du-navigateur-249</link>
		<comments>http://www.lyxia.org/blog/developpement/php/une-classe-php-complete-pour-la-detection-du-navigateur-249#comments</comments>
		<pubDate>Fri, 21 Mar 2008 22:30:54 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[classe]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/design/une-classe-php-complete-pour-la-detection-du-navigateur-249</guid>
		<description><![CDATA[En développement web, détecter le navigateur et le système d'exploitation utilisé par le client est une opération courante, à tel point que l'on trouve sur le net un nombre impressionnant de fonctions écrites en divers langages pour faciliter cette opération. Seulement, le problème de ces fonctions est qu'elles se contentent la plupart du temps de ne détecter les deux navigateurs les plus répandus, Internet explorer et Mozilla.]]></description>
			<content:encoded><![CDATA[<p>En développement web, détecter le navigateur et le système d&#8217;exploitation utilisé par le client est une opération courante, à tel point que l&#8217;on trouve sur le net un nombre impressionnant de fonctions écrites en divers langages pour faciliter cette opération. Seulement, le problème de ces fonctions est qu&#8217;elles se contentent la plupart du temps de ne détecter les deux navigateurs les plus répandus, Internet explorer et Mozilla.<br />
Grâce  à <em>browser.php</em>,  une classe écrite par <em>Gary White</em>, il est possible de détecter la quasi totalité des navigateurs  disponibles à l&#8217;heure actuelle.</p>
<h2>Fonctionnalités</h2>
<p>Browser.php est capable de détecter:<br />
<strong> Systèmes d&#8217;exploitation:</strong></p>
<ul>
<li>Windows</li>
<li>Mac</li>
<li>Linux</li>
</ul>
<p><strong>Navigateurs:</strong></p>
<ul>
<li> Amaya</li>
<li>Firefox</li>
<li> Galeon</li>
<li> iCab</li>
<li> Internet Explorer</li>
<li> Konqueror</li>
<li> Lynx</li>
<li> Mozilla</li>
<li> Netscape Navigator/Communicator</li>
<li> OmniWeb</li>
<li> Opera</li>
<li> Pocket Internet Explorer for handhelds</li>
<li> Safari</li>
<li> WebTV</li>
</ul>
<h2>Utilisation</h2>
<p>L&#8217;utilisation de browser.php ne pose aucune difficulté particulière. Voici un exemple d&#8217;utilisation:</p>
<pre>
require_once('browser.php'); //Inclus le fichier source de la classe
$browser = new Browser;  //Création d'une instance de la classe
$platform = $browser-&gt;Platform; //Récupération des informations
$name = $browser-&gt;Name;
$version = $browser-&gt;Version;
echo "OS: ".$platform;  //Affichage des variables contenant les informations à l'écran
echo "Navigateur: ".$name;
echo "Version: ".$version;</pre>
<p>Ce qui donnera à l&#8217;écran, par exemple:</p>
<pre>
OS: MacIntosh
Navigateur: Firefox
Version: 2.0.0.12</pre>
<h2>Visualisation et téléchargement</h2>
<p>Vous pouvez voir le code source de <em>browser.php</em> sur <a href="http://apptools.com/phptools/browser/source.php">cette page</a>, qui comporte également le lien pour télécharger le fichier.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/une-classe-php-complete-pour-la-detection-du-navigateur-249/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>6 fonctions PHP indispensables</title>
		<link>http://www.lyxia.org/blog/developpement/php/5-fonctions-php-indispensables-99</link>
		<comments>http://www.lyxia.org/blog/developpement/php/5-fonctions-php-indispensables-99#comments</comments>
		<pubDate>Tue, 06 Nov 2007 08:01:10 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bbcode]]></category>
		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/non-classe/5-fonctions-php-indispensables-99</guid>
		<description><![CDATA[Bien que PHP soit un langage particulièrement riche en fonctions, on à toujours besoin d'avoir recours à des fonctions maison pour des taches récurentes. Voici un petit condensé de fonctions qui m'ont été fort utiles lors de mes développement en PHP.]]></description>
			<content:encoded><![CDATA[<p>Bien que PHP soit un langage particulièrement riche en fonctions, on à toujours besoin d'avoir recours à des fonctions maison pour des taches récurentes. Voici un petit condensé de fonctions qui m'ont été fort utile lors de mes développement en PHP.</p>
<h2>Créer des liens de matière automatique</h2>
<p>Cette fonction permet de reperer les balises http, https et ftp et de créer automatiquement les liens hypertextes corresondants.</p>
<pre>
function AutoLink($input)
{
   $output = eregi_replace("(http|https|ftp)://([a-z0-9\-\./]+))","&lt;a href=\"\\0\"&gt;\\0&lt;/a&gt;",$input);
   $output = eregi_replace("(([a-z0-9\-\.]+)@([a-z0-9\-\.]+)\.([a-z0-9]+))","&lt;a href=\"mailto:\\0\"&gt;\\0&lt;/a&gt;",$output);
   return $output;
}</pre>
<h2>Implémenter le BBCode</h2>
<p>Cette fonction parse un texte à la recherche de balise BBCode et les remplace par les balises HTML correspondantes.</p>
<pre>
function BBCode($post){
    $post = preg_replace("/\[img\](.+?)\[\/img\]/","&lt;img src=\"$1\" /&gt;",$post);
    $post = preg_replace("/\[url\=(.+?)\](.+?)\[\/url\]/","&lt;a href=\"$1\"&gt;$2",$post);
    $post = preg_replace("/\[b\](.+?)\[\/b\]/","&lt;strong&gt;$1&lt;/strong&gt;",$post);
    $post = preg_replace("/\[i\](.+?)\[\/i\]/","&lt;em&gt;$1&lt;/em&gt;",$post);
    return $post;
}</pre>
<h2>Afficher la date en Français</h2>
<p>L'affichage d'une date au format Français est un problème récurent en PHP. Le web regorge d'une multitude de fonctions différentes réglant ce problème. Bien que très simple à coder soi-même, avoir cette fonction sous la main permet de gagne un peu de temps et surtout de ne pas réinventer la roue.</p>
<pre>
function get_date()
{
    $eng_words = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday',
                                     'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

    $french_words = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche',
                                     'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    $date_str = 'le '.date('l').' '.date('d').' '.date('F').' '.date('Y').' à '.date('G').':'.date('i').':'.date('s');
    $date_str = str_replace($eng_words, $french_words, $date_str);
    return $date_str;
}</pre>
<h2>Déterminer si une chaine commence par tel motif</h2>
<p>En Java, il existe la fonction <em>startsWith</em>, qui est bien pratique pour le traitement de chaines de caractères. Malheureusement, cette fonction est absente en PHP.</p>
<pre>
function startswith($texte, $recherche)
{
    return $recherche === '' or $recherche === $texte or strpos($texte, $recherche) === 0;
}</pre>
<h2>Déterminer si une chaine se termine par tel motif</h2>
<pre>
function endswith($texte, $recherche)
{
    return $recherche === '' or $recherche === $texte or strpos(strrev($texte), strrev($recherche)) === 0;
}</pre>
<h2>Convertir plusieurs espaces en un seul</h2>
<pre>$maChaine= preg_replace('/\s+/', ' ', $maChaine);</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/5-fonctions-php-indispensables-99/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Une classe &#171;&#160;captcha&#160;&#187; en PHP</title>
		<link>http://www.lyxia.org/blog/developpement/php/une-classe-captcha-en-php-79</link>
		<comments>http://www.lyxia.org/blog/developpement/php/une-classe-captcha-en-php-79#comments</comments>
		<pubDate>Fri, 12 Oct 2007 07:02:46 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[captcha]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/developpement/une-classe-captcha-en-php-79</guid>
		<description><![CDATA[captcha.php 2.0 est une classe PHP open-source qui rendra bien des services au développeur: elle permet en effet de générer des captcha, ces caractères à taper dans un champ texte pour éviter le spam lors de l'envoi d'un formulaire.]]></description>
			<content:encoded><![CDATA[<p>captcha.php 2.0 est une classe PHP open-source qui rendra bien des services au développeur: elle permet en effet de générer des captcha.<br />
Qui, aujourd'hui, n'a jamais été obligé de recopier les caractères déformés d'une image dans un champ texte en voulant simplement remplir un formulaire trouvé sur le web?<br />
Ce système, nommé captcha, est actuellement la meilleure protection disponible contre le spam, mais  son inconvénient est que bien souvent les caractères générés sont difficiles à lire -afin d'empêcher des bots de déchiffrer les caractères dans l'image- et l'utilisateur échoue bien souvent à envoyer son formulaire au serveur sans erreur.<br />
Le créateur de captcha.php 2.0 (Qu'il me pardonne, j'ai oublié son nom...) à pensé à tout: sa classe permet d'accepter quelques caractères erronés. De plus, elle n'utilise ni cookies ni base de données.</p>
<p>Pour l'intégrer, rien plus simple:</p>
<pre>
&lt;form action="...
   &lt;textarea&gt;...
   ...       print captcha::form();
?&gt;
   ...
   &lt;input type="submit"...
 &lt;/form&gt;</pre>
<p>Ensuite, dans la page qui reçoit les informations du formulaire:</p>
<pre>if ($_POST &amp;&amp; captcha::solved()) {
          // ok, proceed
} else {
         // error, or redisplay the CAPTCHA
}</pre>
<p>Le tout est entièrement configurable et offre pas mal d'options. La doc est également bien étoffée, ce qui est assez rare et mérite d'être souligné.</p>
<p><a href="http://milki.erphesfurt.de/captcha/captcha-2.0.tgz">Télécharger captcha.php 2.0</a><br />
<a href="http://milki.erphesfurt.de/captcha/">Voir le site du projet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/une-classe-captcha-en-php-79/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nuage de tags en PHP</title>
		<link>http://www.lyxia.org/blog/developpement/php/nuage-de-tags-en-php-77</link>
		<comments>http://www.lyxia.org/blog/developpement/php/nuage-de-tags-en-php-77#comments</comments>
		<pubDate>Tue, 09 Oct 2007 22:50:54 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[tags]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/tutoriaux/nuage-de-tags-en-php-77</guid>
		<description><![CDATA[Popularisé par la mode web 2.0, les nuages de tags, ou <em>tagclouds</em> sont désormais légions sur les blogs et les sites communautaires.
Voyons ensemble la création d’un nuage de tags basique avec PHP et MySQL.]]></description>
			<content:encoded><![CDATA[<p>Popularisé par la mode web 2.0, les nuages de tags, ou <em>tagclouds</em> sont désormais légions sur les blogs et les sites communautaires.<br />
Voyons ensemble la création d'un nuage de tags basique avec PHP et MySQL.</p>
<h2>Création des tables</h2>
<p>La première chose à faire est de créer les tables de notre application. Nous en avons besoin de 3: Une pour les articles, une pour les tags, et une qui fera la relation entre articles et tags.</p>
<p><strong>Table tags:</strong></p>
<pre>CREATE TABLE `tags` (
`id` int(11) NOT NULL auto_increment,
`label` varchar(100) NOT NULL default '',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;</pre>
<p><strong>Table articles</strong></p>
<pre>CREATE TABLE `articles` (
`id` int(11) NOT NULL auto_increment,
`label` text NOT NULL,
`url` text NOT NULL,
PRIMARY KEY  (`id`)</pre>
<p><strong>Table relation:</strong></p>
<pre>CREATE TABLE `relation` (
`article_id` int(11) NOT NULL default '0',
`tag_id` int(11) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;</pre>
<p>Nous allons également rajouter un peu de contenu dans ces trois tables. Tout d'abord, quelques articles:</p>
<pre>INSERT INTO `articles` VALUES (1, 'Créer des executables Python avec pyInstaller', 'http://www.jbjweb.com/python/index.php?2007/02/15/13-pyinstaller');
INSERT INTO `articles` VALUES (2, 'A Beginner''s Python Tutorial', 'http://www.sthurlow.com/python/');
INSERT INTO `articles` VALUES (3, 'Texte façon Web 2.0', 'http://www.webinventif.fr/wiki/tutoriels/design/texte_facon_web_2.0', '2007-06-14 22:19:50');</pre>
<p>Ensuite, quelques tags...</p>
<pre>INSERT INTO `tags` VALUES (1, 'python');
INSERT INTO `tags` VALUES (2, 'design');
INSERT INTO `tags` VALUES (3, 'open-source');</pre>
<p>Et pour finir, nous allons joindre les tags aux articles qui leur correspondent:</p>
<pre>INSERT INTO `relation` VALUES (1, 1);
INSERT INTO `relation` VALUES (2, 1);
INSERT INTO `relation` VALUES (1, 3);
INSERT INTO `relation` VALUES (3, 2);</pre>
<h2>Les fonctions PHP:</h2>
<p>Cette première fonction sert à récupérer tous les articles en rapport avec un tag donné en paramètre. Notez que dans le cas d'une appli réelle, il serait préférable et surtout plus propre de retourner les résultats dans un array plutot que de les écrires directement via echo...</p>
<pre>function getLinksByTag($tag)
{
	//Je suppose ici que vous disposez d'une connection valide à MySQL
	addslashes($tag);
	$sql = "SELECT articles.* FROM articles articles, tags tags, relation relation WHERE tags.label = '$tag'  and tags.id = relation.tag_id and relation.article_id = articles.id";
	$req = mysql_query($sql);
	while ($data = mysql_fetch_array($req))
	{
		echo '&lt;a href="'.$data['url'].'"&gt;'.$data['label'].'&lt;/a&gt;';
	}
}</pre>
<p>Cette seconde fonction est l'inverse de la première: On lui passe l'id d'un article en paramètre et elle ira chercher dans la base de données tous les tags en relation avec cet article.</p>
<pre>function getTagsById($article_id){
	//Je suppose ici que vous disposez d'une connection valide à MySQL
	$req = mysql_query("SELECT tags.label FROM articles, tags, relation WHERE articles.id = $article_id AND articles.id = relation.article_id AND tags.id = relation.tag_id") or die();
	while ($data = mysql_fetch_array($req))
	{
		echo '&lt;a href="'.$data['url'].'"&gt;'.$data['label'].'&lt;/a&gt; ';
	}
}</pre>
<p>La dernière fonction, <em>getTagCloud</em>, prends comme paramètre le nombre maximum de tags que vous souhaitez afficher dans le nuage de tags. Dans le cas de cet exemple, cliquer sur un lien du nuage de tags renvoie vers une page qui appliquera la fonction  <em>getLinksByTag</em> à la variable <strong>tag</strong> passée en <em>GET</em>.</p>
<pre>function getTagCloud($nb_tags)
{
	//Je suppose ici que vous disposez d'une connection valide à MySQL
	$req = mysql_query("SELECT * FROM tags LIMIT ".$nb_tags);
	while ($data = mysql_fetch_array($req))
	{
		echo '&lt;a href="showarticles.php?tag='.$data['label'].'"&gt;'.$data['label'].'&lt;/a&gt; ';
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/nuage-de-tags-en-php-77/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Sauvegarder/Exporter une base de données avec PHP</title>
		<link>http://www.lyxia.org/blog/developpement/php/sauvegarderexporter-une-base-de-donnees-avec-php-44</link>
		<comments>http://www.lyxia.org/blog/developpement/php/sauvegarderexporter-une-base-de-donnees-avec-php-44#comments</comments>
		<pubDate>Tue, 04 Sep 2007 08:19:47 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[backup]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/developpement/sauvegarderexporter-une-base-de-donnees-avec-php-44</guid>
		<description><![CDATA[Même si vous avez installé PhpMyAdmin sur votre serveur, il peut être utile de créer une fonction automatisant la sauvegarde de votre base de données.
Cette fonction retournera une variable contenant un dump de votre base, libre à vous de l'enregistrer sur un fichier, de l'enregistrer dans un répertoire protégé ou encore de vous l'envoyer par mail...]]></description>
			<content:encoded><![CDATA[<p>Même si vous avez installé <em>PhpMyAdmin</em> sur votre serveur, il peut être utile de créer une fonction automatisant la sauvegarde de votre base de données.<br />
Cette fonction retournera une variable contenant un <em>dump</em> de votre base, libre à vous de l'enregistrer sur un fichier, de l'enregistrer dans un répertoire protégé ou encore de vous l'envoyer par mail...<br />
<strong>Note essentiellement destinée aux débutants: </strong><br />
Prenez garde au fait qu'une sauvegarde d'une base de données est une donnée <em>extrêmement </em>sensible, même si les mot de passes sont cryptés. Par conséquent, il ne faut jamais enregistrer ce fichier hors d'un répertoire protégé par mot de passe.</p>
<pre>function dump()
{
 //Connexion à la base
 $db = mysql_connect('localhost', 'login', 'mdp');
 mysql_select_db('nom_de_la_base',$db);

 $tables = mysql_list_tables('nom_de_la_base', $db);
 while ($donnees = mysql_fetch_array($tables))
 {
  $table = $donnees[0];
  $res = mysql_query('SHOW CREATE TABLE '.$table);
  if ($res)
  {
   $insertions = '';
   $tableau = mysql_fetch_array($res);
   $tableau[1] .= ';';
   $dumpsql[] = str_replace("\n", '', $tableau[1]);
   $req_table = mysql_query('SELECT * FROM '.$table);
   $nbr_champs = mysql_num_fields($req_table);
   while ($ligne = mysql_fetch_array($req_table))
   {
    $insertions .= 'INSERT INTO '.$table.' VALUES (';
    for ($i=0; $i<$nbr_champs; $i++)
    {
     $insertions .= '\'' . mysql_real_escape_string($ligne[$i]) . '\', ';
    }

    $insertions = substr($insertions, 0, -2);
    $insertions .= ");\n";
   }

   if ($insertions != '') $dumpsql[] = $insertions;
  }
 }
 return implode("\n", $dumpsql);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/php/sauvegarderexporter-une-base-de-donnees-avec-php-44/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
