Livre retardé

Dans mon article sur « Règles pour de meilleurs performances », je vous parlait du livre High Performance Web Sites, il devait sorti fin septembre et je viens de recevoir un email d’Amazo, qui m’annonce une sortie pour fin novembre…il va falloir patienter un peu…

En attendant, j’ai choisi de lire Building Scalable Web Sites

Un retour sur ce livre prochainement sur ce blog.

Subselect en MySQL attention !

Je suis un utilisateur de MySQL depuis quelques années déjà… et donc j’ai pris l’habitude de feinter certaines fonctionnalités. Par exemple, le Subselect apparu dans la version 4.1. Je profite donc de cet article pour vous dire de faire attention car un subselect c’est peut être plus facile a développer mais on peut faire mieux en terme de performance.

Sur Wanarun (je préfère prendre des exemples que je connais), je veux voir le nombre de personnes qui utilise la gestion des départs.

La version avec subselect :

select pseudo from fr_users where userID in (select userID from mes_departs);

temps : 0.08 sec

la version avec juste une jointure

select distinct(pseudo) from mes_departs m,fr_users u where u.userID=m.userID;

temps : 0.00 sec

Donc faites bien attention ! De plus, la version avec sub select risque d’etre de plus en plus lente si la taille de votre base augmente.

Modification javascript pour les tables

Comme plusieurs d’entre vous veulent connaitre les modifications que j’ai fait pour les tableaux javascript (suite des commentaires sur l’article « Economisez votre serveur : Triez en javascript »

Pour rappel, la page d’exemple se trouve ici : la page des entrainements de MARC78 sur Wanarun

Les modifications de la librairies sortable.js
Ajout d’une variable pour la taille des pages

var maxRows=20;

Ajout de la fonction showPageTable()

function showPageTable(table,number)
{
  for (j=1;j<table>{
    if (j=(maxRows*(number)+1))
    {
      table.rows[j].style.display='none';
    }
    else
    {
      table.rows[j].style.display='';
    }
  }
}

Modification de sortables_init()

//après la ligne
ts_makeSortable(thisTbl);
//j'initiliase mon tableau sur la premiere page
showPageTable(thisTbl,'1');

Dans le php

//il faut définir une variable commune avec le javascript
define("NB_LIGNE_TABLEAU",20);
 
$list=$data["performance"];
$page_str="";
$separator=" | ";
$nb_page=floor(sizeof($list)/NB_LIGNE_TABLEAU)+1;
if ($nb_page&gt;1)
{
        for($i=1;$i&lt;=$nb_page;$i++)
        {
                $page_str.="<a href="#">".$i."</a>";
                $page_str.=$separator;
        }
        echo substr($page_str,0,-strlen($separator));
}

Sécurité des includes

Un petit truc que j’ai trouvé sur le net, il y a quelques temps sur le net. Si comme moi, vous avez l’habitude de faire des includes un peu partout. Personnelement je les nomme *.inc.php et parfois ils peuvent être accessible via le web mais sans lien…C’est pas bien grave de voir une header ou un bloc tout seul mais bon pour eviter des erreurs….

if ($_SERVER['REQUEST_URI'] == $_SERVER['PHP_SELF'])
exit();
//Code PHP
?&gt;

Firebug

C’est sans aucun doute la meilleure extension firefox que j’ai vu ! Elle m’a même reconcilier avec le CSS et le Javascript !

Console pour la gestion des erreurs : Javascript, CSS,..

Exploration HTML :

Exploration CSS :

Mesure des temps de chargements :

Télécharger Firebug

Astuces pour les scripts Shell

Vous êtes peut être comme moi, vous utilisez PHP pour faire des scripts shell. J’utilise une petite astuce pour mettre en place des variables dans mes scripts en reprennant la syntaxe qu’on utilise sous linux avec « –var value »

un petit include que vous pouvez transformez en fonction comme bon vous semble.

for($i=1;$i&lt;sizeof($argv);$i++)
{
 if (substr($argv[$i],0,2)==&quot;--&quot;)
 {
 		$_REQUEST[substr($argv[$i],2)]=$argv[$i+1];
 		$i++;
 }
}
 
extract($_REQUEST);

Comme ca quand je lance « mon_script.php –code TE –mode debug »

c’est comme si je faisais :

$code="TE";
$mode="debug";

Ca n’interessera peut être pas tout le monde mais c’est bien pratique !

Créer une table temporaire

Parfois, il est préférable ou nécessaire de passer par une table temporaire pour insérer / mettre a jour des données.
Ca vous permet d’insérer les données et eventuellement de vérifier la table temporaire avant de permutter les 2 tables.
Par exemple, vérifier que votre table comporte au moins 10 éléments ou n’est pas vide.

//j'efface la table temporaire si elle existe :
$res=mysql_query("drop table if exists my_table_tmp");
if ($res==false) die("Erreur mysql ".mysql_error());
 
//je récupére la structure de la table maitre
$res=mysql_query("show create table my_table");
if ($res==false) die("Erreur mysql ".mysql_error());
$row=mysql_fetch_row($res);
$create=$row[1];
 
//je substitue le nom de ma table maitre pour créer ma table temporaire
$create=str_replace("my_table","my_table_tmp",$create);
//je crée ma table temporaire.
$res=mysql_query($create);
if (!$res) die("Erreur mysql ".mysql_error());

La requete utilisant RENAME TABLE est pratique pour ce cas :

RENAME TABLE my_table TO my_table_backup, my_table_tmp TO my_table;

en PHP ca donne :

//Je permutte les tables 
$res=mysql_query("RENAME TABLE my_table TO my_table_backup, my_table_tmp TO my_table");
if (!$res) die("Erreur mysql ".mysql_error());

MySQL : testez le retour de mysql_connect, ou de mysqli->connect

Je reviens sur un problème qui m’a sauté aux yeux la semaine dernière, en effet en interrogeant Google on remarque que 797 000 pages (734 000 la semaine dernière) contiennent une erreur PHP car tout le monde pense que le serveur MySQL tourne toujours.. La preuve que non…

Je lance une grand campagne auprès de tous les webmasters PHP pour réduire ce nombre

Les news sur ce point seront disponible dans la catégorie MySQL Error Stop

Unissons nous pour faire reculer le fléau.

Code source dans WordPress

Comment vous avez pu le constater, j’inclus dans mes articles des morceaux de sources PHP, SQL, Javascript….

Tout cela est trés simple grâce a 2 choses :

  1. Geshi (Generic Syntax Highlighter) qui permet avec une fonction php d’afficher en HTML le code source de dizaines de language
  2. Un plugin WordPress / Geshi de Arno

après c’est très simple a utiliser

<pre lang="[Language]">[Code Source]

La liste des languages supportés :
Actionscript, ADA, Apache Log, AppleScript, ASM, ASP, AutoIT, Backus-Naur form, Bash, BlitzBasic, C, C for Macs, C#, C++, CAD DCL, CadLisp, CFDG, CFDG, ColdFusion, CSS, Delphi, DIV, DOS, Eiffel, Fortran, Fortran, FreeBasic, GML, Groovy, HTML, Inno, IO, Java, Java 5, Javascript, LaTeX, Lisp, Lua, Microprocessor ASM, mIRC, MySQL, NSIS, Objective C, OCaml, OpenOffice BASIC, Oracle 8 SQL, Pascal, Perl, PHP, PL/SQL, Python, Q(uick)BASIC, robots.txt, Ruby, SAS, Scheme, SDLBasic, Smalltalk, Smarty, SQL, T-SQL, TCL, thinBasic, Uno IDL, VB.NET, Visual BASIC, Visual Fox Pro, Winbatch, X++, XML, Z80 ASM

Filtrons les entrées

Afin de sécuriser au maximum vos sites, la première règle est de bien faire attention aux entrées utilisateurs. Cette partie peut être un peu fastidieuse mais c’est une des règles à respecter.

Les 3 règles les plus importantes :

  1. Initialiser vos variables utilisées dans la page.
  2. Vérifiez les variables rentrées par l’utilisateur.
  3. Vérifiez l’entrée des fonctions include / require fichiers.

La question c’est donc comment verifier vos variables simplement et efficacement.

Avant PHP 5.2, chacun avait sa propre recette de cuisine car il n’y avait aucune veritable solution dans PHP alors que tout le monde disait que c’était très important surtout suite aux nombreuses alertes qu’on voyait fleurir sur des logiciels Open Source.

Depuis PHP 5.2, l’extension filter (disponible jusqu’alors via PECL) a été inclus dans la distribution standard.

Cette extension est très pratique, elle permet par exemple de valider une adresse email sans se prendre la tête avec les dizaines d’expressions regulières que vous verez ici ou là sur Internet.

$email='nimportequoiyahoo.fr';
  $email=filter_var($email, FILTER_VALIDATE_EMAIL);
//$email est à null car l'adresse est incorrecte
$email='bonneadresse@bondomaine.com';
$email=filter_var($email, FILTER_VALIDATE_EMAIL);
//$email vaut "bonneadresse@bondomaine.com"

A retenir, on met la variable en premier argument et le filtre qu’on veut appliquer en deuxième.
Si cela retourne « null », la variable n’est pas correcte sinon elle est correcte.

Aprés on peut faire des choses plus complexe, l’utilisateur doit rentrer un entier entre 1 et 10

$categorie=filter_var($_GET['categorie'],
  array(
            //je veux uniquement un entier
            'filter'    =&gt; FILTER_VALIDATE_INT,
            //il doit etre compris dans un tableau
            'flags'     =&gt; FILTER_REQUIRE_ARRAY,
            //entre 1 et 10
            'options'   =&gt; array(
						   'min_range' =&gt; 1,
							 'max_range' =&gt; 10
							 )
           ));

Aprés dans la vie de tous les jours, vous aimeriez filtrer l’ensemble de votre formulaire en une seule fois :

// je decris mon formulaire sous forme de tableau
// avec les format attendu
$config_form = array(
    'produit'   =&gt; FILTER_VALIDATE_INT,
    'categorie'    =&gt; array('filter'    =&gt; FILTER_VALIDATE_INT,
                            'flags'     =&gt;FILTER_REQUIRE_ARRAY,
                            'options'   =&gt; array('min_range' =&gt; 1, 'max_range' =&gt; 10)
                           )
);
 
$_POST_CLEAN = filter_input_array(INPUT_POST, $config_form);
//je recupére ainsi dans $_POST_CLEAN tout ce qui était
//dans $_POST mais maintenant les données sont
//filtrées.

A vous de jouer !



Check out our best movie collection. Latest CD, DVD, HQ DVD movie downloads. Buy and download movies instantly.