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<sizeof($argv);$i++)
{
if (substr($argv[$i],
0,
2)==
"--")
{
$_REQUEST[substr($argv[$i],
2)]=
$argv[$i+1];
$i++;
}
}
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 !
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 :
//je récupére la structure de la table maitre
$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.
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");
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.
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 :
- Geshi (Generic Syntax Highlighter) qui permet avec une fonction php d’afficher en HTML le code source de dizaines de language
- 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
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 :
- Initialiser vos variables utilisées dans la page.
- Vérifiez les variables rentrées par l’utilisateur.
- 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'],
//je veux uniquement un entier
'filter' => FILTER_VALIDATE_INT,
//il doit etre compris dans un tableau
'flags' => FILTER_REQUIRE_ARRAY,
//entre 1 et 10
'min_range' => 1,
'max_range' => 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
'produit' => FILTER_VALIDATE_INT,
'categorie' =>
array('filter' => FILTER_VALIDATE_INT,
'flags' =>FILTER_REQUIRE_ARRAY,
'options' =>
array('min_range' =>
1,
'max_range' =>
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 !
Une notion que certains développeurs oublient parfois et une erreur de débutant que je vois régulièrement dans des scripts open source. Je vais prendre l’exemple (simplié a l’extrème) d’un blog avec des articles et des categories. J’ai une table avec un champ texte qui contient le texte de mon article, un identifiant (clé primaire) de l’article et une catégorie pour classer l’article (sous forme d’entier).
La création de la table donne ca :
CREATE TABLE `test_index` (`id` INT NOT NULL ,`texte` TEXT NOT NULL ,`categorie` INT NOT NULL ,PRIMARY KEY ( `id` )) ENGINE = MYISAM ;
Tout va bien la plupart du temps mais quand la base commence a prendre du volume, certaines pages deviennent lentes. Dans notre cas, il s’agit de la page par categorie, c’est à dire la page qui regroupe tous les articles d’une même categorie.
La raison de cette lenteur est simple, MySQL est obligé de parcourir toute la table pour extraire les articles de la catégorie désirée.
Il faut donc ajouter un index sur le champ categorie pour accélérer les requetes du type
SELECT * FROM test_index WHERE categorie='1';
Comment ajouter un index avec une commande MySQL :
ALTER TABLE `test_index` ADD INDEX ( `categorie` )
Comment ajouter un index avec PHPMyAdmin :
1. Je choisis ma table
2. je vais dans le menu Structure

3. Je clique sur créer 1 index :

4. Je choisis “categorie” comme champ sur lequel je crée l’index.

5. Je clique sur Save pour enregistrer

6. Je vois la requete de création de l’index

7. mon index est affiché parmis la liste des index

Toutes mes requètes possibles sont optimisés :
SELECT * FROM test_index WHERE id='2';
SELECT * FROM test_index WHERE categorie='6';
Dernière remarque : il n’est jamais trop tard pour créer un index ! la création sera peut-être un peu plus longue que sur une table vide mais ce n’est pas interdit
“Il n’est jamais trop tard pour bien faire”
Une chose assez importante auquel les développeurs ne pensent pas tout le temps : Avez vous verifié si votre serveur MySQL fonctionne correctement ? Est-ce que la fonction mysql_connect / mysqli_connect ne renvoit pas false ?
Je pense que beaucoup oublie cet étape, c’est comprehensible dans l’euphorie du développement. J’ai fait une petite requète sur Google et je vois tout simplement 734000 pages avec une erreur qui découle de ce problème…
C’est pas bien compliqué, il faut juste y penser !
if ($my===false)
{
header("location: /mysql_out.php");
// a la rigueur on envoie un petit mail au webmaster pour le mettre au courant
}
Allez je referai un petit point de temps en temps pour voir si ce nombre (734 000 pages sur Google) baisse un peu !
La performance est un de mes chevaux de bataille, chaque développeur devrait lire les 13 règles pour une meilleure performancede Yahoo
Voici la conférence de Steve Souders (Chief Perfomance chez Yahoo!)
Steve Souders a aussi écrit un livre “High performance Web site”, le livre sort le 21/09 et j’ai fait la précommande. je parlerai donc de ce livre ici.
Vous avez surement remarqué depuis l’apparition des sites web 2.0 avec l’apparition d’Ajax, le code Javascript des sites a pris de l’embonpoint. Raison à cela : la multiplication des librairies javascript (prototype, script.aculo.us, dojo et autres librairies).
On se retrouve avec 5 / 6 voire 10 includes javascript au début de la page (sans compter les tags google analytics et autres).
Donc parfois la première page est souvent laborieuse à venir . Après je vous accorde que le navigateur fait son boulot et gère correctement le cache mais le chargement de la première page c’est aussi la première impression de l’internaute.
En fait le probleme est très simple, un navigateur ne parallelise pas le chargement des includes javascript, il les lit dans l’ordre car il interprete le code. On se retrouve donc avec une suite de requetes de chargements / interpretations de fichier javascript.
La solution est simple, vous pouvez développer avec une liste de fichiers javascript mais lors de la mise en production, concatenner tous vos fichiers javascript en 1 seul (plus gros mais unique donc un peu moins rapide à charger mais une seule requete et pas d’attente)
Avec un peu de javascript, on peut assez facilement dimunuer le nombre de requetes vers le serveur et ainsi le soulager de travail inutil. En effet, il est toujours mieux de faire le travail sur le poste du client que sur le serveur !
Un exemple très simple est “les tris sur les tables HTML“, vous avez un tableau triable avec la possibilité de trier selon plusieurs colonnes. En php, c’est un peu long a mettre en place il faut gérer le “ORDER BY“, les différentes clés… pour la plupart du temps une petite liste.
Bien sûr, quand la requete renvoit 10000 élements c’est plus difficile de faire autrement mais est-ce vraiment le cas ?
Personnelement j’utilise une petite libriairies Javascript sortable, qui permet de rendre une table HTML toute simple en veritable petite tableau Excel.
Voici un exemple sur mon site Wanarun. Vous y verrez aussi une petite surprise pour la gestion des pages…