Un article de Mmmm!!!

La petite histoire ...

Pendant une sieste hebdomadaire ( le lundi au sol... heu au travail ) une pensée parcours mon esprit , "Est-ce que l'on peut passer à une URL un tableau php ?".
Cela me reveille , j'ouvre un oeil , puis l'autre, retire mes pieds de mon bureau, et me met en quete , non pas du saint Graal, ni d'une Genievre, mais de la reponse a ma question technique qui m'apportera calme et serenite me permettant de finir ma sieste.

La délivrance

He bien , zOui, on peut passer en valeur par la methode GET d'un formulaire un tableau PHP.
En fait de calme et de plenitude , ma curiosite est plutot existe comme une adolescente dans un regiment de beau legionnaire. Bon, je precise , on peut passer un tableau plat c'est à dire sans tableau contenu dans un élement du tableau.
Le resultat de ce script PHP , est ce meme script et ainsi je peux ajouter dynamiquement un nombre n d'element a mon tableau en me basant sur les donnees contenues dans l'URL.
Ainsi j'avait une URL gardant en memoire l'ensemble des ajouts, j'etait en face d'un race d'URL assez rare : Une URL a Memoire de FORM

L'elevage d'URL


Je ne tarde pas a en parler a pierre. Il me reponds qu'une maladie decime cette race d'URL.
Je decide de realise un petit elevage de cette espece d'URL dont la taille grandi lineairement. Il m'est apparu qu'un sauvage et sanginaire tueur d4URL etait poste tel un snipper dans le serveur.
Il fait partie du groupe 414 et signe son acte de ce numero. J'ai reperé leur planque, ils se cache secretement dans la rue usr_bin au numero httpd. Ma rage face a cet assassinat collectif m'a contraint d'une maniere compulsive a tuer l'ensemble de ces barbares grace a une arme que l'on peut trouver chez tout les bons "Tout pour plein de pognon du coin" , un bon killall avec double injection chrome.

En moins naratif

Bon, j'arrete ce mode naratif peut etre peu explicatif. L'idée initiale était plutot simple, utiliser les données passées à un scrip php par l'URL pour realiser des pages ayant un contenu dynamique sans utiliser une base de donnée. Car il est vrai que les bases de donnée, c'est bien ( mais chiant , avis personnelle et je ne souhaite nullement en m'exprimant ainsi faire de la diffamation :) , mais quand on en a pas c'est un probleme, et si l'on pouvait s'en passer cela simplifirait les choses ( enfin je me complique un peu la vie peut etre ... ).

Introspection


Ceci car on peut passer le contenu d'un tableau via l'url et que l'on peux faire une introspection sur le contenu d'un tableau. Dans le mot introspection, ne voyait pas le fait que je veuille placer ce terme d'un vocabulaire soutenu, mais plutot le fait que je resume aisni l'action de pouvoir examiner le contenu d'un tableau alors que je n'ai aucune idee de son contenu. Remarquez, j'aime bien utiliser ce terme car il fait psy d'un autre age cherchant a exprimer une recherche interieur , une mediatation . L'interet est de pouvoir se passer de base de donnée en offrant une simplicité de programmation extreme (bon en fait on stocke tout dans une hash table qui fait office de base de donnee, je sais que cela peut etre consideré comme limite , bon disons que c'est un exercice de style).

Le tueur du groupe 414 de mon elevage d'URL


Il y a quand meme un avantage important c'est que les donnees sont dans l'URL et non pas sur le serveur , le serveur etant uniquement un moteur ou les donnee dans l'url est le gazoil pour celui-ci. Malgres tout , cette technique est limite par les specifications HTTP ( rfc 2616 ), lorsque l'url est trop longue cela provoque une erreur 414. Voici la longeur testée avec une serveur Apache sous Linux :
Browserlongeur maximun
Lynx sous Linux 8151 le serveur web renvoit une erreur
Opera sous Linux 8151 le serveur web renvoit une erreur
Netscape sous Linux 8151 le serveur web renvoit une erreur
Netscape sous window 2000 8151 le serveur web renvoit une erreur.
IE sous 2000 2041, et IE n'execute pas le script si trop long, il ne dit rien le cochon.
En fait apres avoir regardé dans les source d'apache , on trouve #define DEFAULT_LIMIT_REQUEST_LINE 8190 ce qui montre que la limite autorisé par le serveur est de 8190. LA difference entre 8151 et 8190 est en fait la taille de l'URI sans les donnees a peu pres car en fait c'est lorsque la taille des donnee est de 8161 que la requete a echoue. Cependant on peut modifier la config du serveur pour qu'il accepte des tailles plus grande ou plsu petite, voici le mot cle magique qui vous permettra de modifier cette fonctionnalite: LimitRequestLine Pour connaitre la longeur maximal accepte par votre browser ou par le serveur web.Voici ce script. Ce script affiche la longeur de l'URL et ajoute toutes les secondes dix caracteres.Lorsque le raffraichissement s'arretera alors appuyez sur back et vous verez la longueur maximun.

Passage d'un tableau dans une FORM


En fait, rien ne s'y opposait , on peut tout a fait mettre comme nom d'un input d'une form un nom avec crochet.
input type=text name="tableau[0]" value...
Bon quel est l'interet mis a part nomme d'une maniere un peu bizarre les variables d'une FORM. Ben,non je ne voit pas , attendez que je reflechisse .... reflexion intense .... goutte de sueur perle sur ce crane pensant refletant l'intense bouillenement synaptique ( les zones coloriées montrent l'échaufement des parties cerebrales , impliquant ainsi les zones neuronales Phpiesques ) ... Après une introspection dans mes connaissances, je dirais qu'il s'agit de la facilité interne au langage Php pour faire une introspection dans le contenu des tableaux ( introspection que l'on retrouve dans les autres langage scriptics telque le fameux langage Perl, tcl , et certainement python ). Voila l'interet de passer en nom de variable d'un element de tableau dans une form. Bon, groso-modo ce tableau servira de mini base de donnee passe au script php.

J'essais d'en faire quelque chose de mon idée


Bon c'est bien joli tout cela, bien que moin joli qu'une fleur de carotte sous le soleil des caraibes, mais il faut bien l'employer pour faire quelques choses de plus joli qu'une fleur de carotte sous la grisaille parisienne.
En avant de continuer plus avant, il y a un point technique qu'il faut evoquer: Php elimine les elements d'un tableau lorsqu'ils sont vides. J'ai remarquez aussi que les caracteres guillements et double cote passe mal :(. Enfin bref, grace a ma petite astuce je peux faire un formulaire dynamique.

Realisation d'un mini editeur html


Voici un petit test : Cette article mais en dynamique
On peut aussi passer le tableau via la methode POST:

\n";
\n";

A la base de l'introspection des données


Ou plutot l'introspection de la base de données.
Toujours dans la mouvence de l'introspection a la recherche d'un espoir utopique d'une revelation sur mon moi profond dans le langage Php ( peut etre parce ce que cela commence par P comme sPychologie ... mais pas comme perl qui commence par P comme Pas comPris. :), je m'attele a un introspection de la base de donnée trève de plaisanterie.
Treve de blabla, je souhaite savoir si on peux repere quelques chose de la base sans un connaissance d'une table presice.
J'ai une piste car PhpMyAdmin y arrive , alors pourquoi pas Moi.L'idée première est d'essayer de faire une requete MySQL show tables . On modifié un peu class_bd pour qu'il retourne le bon nombre de resultat trouvé et on essait, et cela marche sans probleme. Voici le code d'une classe Php vous permettant de scanner l'ensemble des tables et de ces elements d'un base de donnees precises. J'imagine que cela devrais marcher aussi avec une requete du style show databases .
include "class_bd.php3";

//
// Element of table  for mysql
//
class elmtable { 
	var $name;
	var $type;
	var $defaultvalue;
	var $key;
	var $extra;
	function elmtable($tmp) {
			$this->name= $tmp["Field"];
			$this->type= $tmp["Type"];
			$this->defaultvalue= $tmp["Default"];
			$this->key=$tmp["Key"];
			$this->extra= $tmp["Extra"];
		}
	function output() {
		echo "<ul>";
		echo "<li>$this->name";
		echo "<li>$this->type";
		if (!empty($this->defaultvalue)) echo "<li>$this->defaultvalue";
		if (!empty($this->key)) echo "<li>$this->key";
		if (!empty($this->extra)) echo "<li>$this->extra";
		echo "<ul>>";
		}
	function init() {
		$this->name="";
		$this->type= "";
		$this->defaultvalue= "";
		$this->key="";
		$this->extra= "";
		}
	};
$bd=new bd();
$nb=$bd->desc("show tables ");
for ($i=0; $i<$nb; $i++)  {
                    $tmp = $bd->get_next_row();
			echo "<hr><br>\n";
			echo $tmp["Tables in cv"]."<br>";
			$bd2=new bd();
			$nbe=$bd2->desc("desc ".$tmp["Tables in cv"]);
			for ($n=0; $n<$nbe; $n++)  {
                    		$tmp2 = $bd2->get_next_row();
				$elmt=new elmtable($tmp2);
				$elmt->output();
			}
	}
Vous remarquerez le Tables in cv , en effect moi aussi j'ai ete suppris mais la base de données Mysql retourne l'information dans ce format.
Voici un bout du résultat que j'obtiens pour la table URL.

URL

**********

Maintenant pour postgres, c'est plutot different:
class elmtable {
        var $name;
        var $type;
        var $defaultvalue;
        var $key;
        var $extra;
        var $lengthvar;
        var $notnull;
        function elmtable($tmp,$table) {
                        $this->name= $tmp["field"];
                        $this->type= $tmp["type"];
                        if ($tmp["length"]==-1) $this->lengthvar=$tmp["lengthvar"];
                                else $this->lengthvar=$tmp["length"];
                        $this->extra= $tmp["extra"];
                        if ($tmp["notnull"]=="t") $this->notnull=true; else $this->notnull=false;

                      $sql_get_default = "
                                select d.adsrc AS rowdefault
                                FROM pg_attrdef d, pg_class c
                                WHERE
                                 c.relname = '$table' AND
                                 c.oid = d.adrelid AND
                                 d.adnum = $tmp[attnum]
                                ";
                        $bd=new bd();
                        $nbelm=$bd->execute($sql_get_default);
                        for ($n=0; $n<$nbelm; $n++)  {
                                $tmp = $bd->get_next_row();
                                $this->defaultvalue= $tmp["rowdefault"];
                        }

                }
        function output() {
                echo ""<ul>";
                echo ""<li>Name $this->name";
                echo ""<li>TYpe $this->type";
               echo ""<li>Notnull $this->notnull";
                echo ""<li>Lengthvar $this->lengthvar";
                if (!empty($this->defaultvalue)) echo ""<li>Default $this->defaultvalue";
                echo ""</ul>";
                }
	}

 $sql_get_fields = "
        select
                a.attnum,
                a.attname AS field,
                t.typname AS type,
                a.attlen AS length,
                a.atttypmod AS lengthvar,
                a.attnotnull AS notnull
        FROM
                pg_class c,
                pg_attribute a,
                pg_type t
        WHERE
                c.relname = '$name'
                and a.attnum > 0
                and a.attrelid = c.oid
                and a.atttypid = t.oid
        ORDER BY a.attnum ";
	$bd2=new bd();
	$nbe=$bd2->execute($sql_get_fields);
			for ($n=0; $n<$nbe; $n++)  {
                    		$tmp2 = $bd2->get_next_row();
				$elmt=new elmtable($tmp2);
				$elmt->output();
			}

Pour tout commentaire, suggestion, et autre recette de cuisine voir bon resto , ecrivez moi.


L'equipe de Mmmm!!! copyright 2001