The Caribbean Weblog

"This blog is continuing @ http://christophemaximin.com "

Aller au contenu | Aller au menu | Aller à la recherche

lundi 20 février 2006

"Using prototype"

Vous l'avez cherché, vous en avez rêvé (moi si en tous cas), la voici la voilà : Using prototype.js vx

C'est à vue de nez, la meilleure ressource online sur le sujet.

EDIT: Comme je le pensais, mon maitre l'avais déjà posté ici, la semi-traduction française en tous cas : http://www.electrolinux.com/traductions/prototype.js.html

lundi 13 février 2006

Ajax, Prototype, PHP, GET/POST et HTTP

Parce qu'a force d'avoir des tests à effectuer en live sur vos pages avec prototype, vous avez surement créé un "RequestHandler(.php)", je veux dire par là : un fichier spécialement fait pour traiter les requetes Ajax.

La situation

Sur ce fichier donc, vous envoyez les tests avec Ajax.Request par exemple, vous obtennez le résultat, vous avisez en fonction du résultat retourné de votre fonction onSuccess:

Le problème

Le mieux serait de donner un exemple : Vous avez un formulaire, qui vérifie onBlur sur le champ pseudo que le pseudo tapé n'existe pas dans la base de donnée. On appelle donc Ajax.Request('/RequestHandler.php', method: 'post', postBody: action=verifPseudo&pseudo=pseudo.value); plus un callback onSuccess: par exemple, qui avertira l'internaute par innerHTML qu'il y a un soucis.
Jusqu'ici pas de soucis, l'user peut ignorer le message, notre bon PHP vérifiera encore à la validation. Et c'est bien là que ça commence à devenir ennuyeux :

pourquoi retaper le code PHP qui vérifie l'existence du pseudo dans la bdd ?

Dans notre cas, ça n'est pas important vu que le code tiens tranquillement sur une ligne, mais dans d'autres cas, serait-ce vraiment justifié de faire ainsi ?

La solution (j'ai pas trouvé mieux en tous cas)

L'idée serait donc de faire comme Ajax.Request (et Ajax.Updater), et d'envoyer la requete en post (ou get) à notre RequestHandler. Évidemment on en fera une fonction, vu que le code correspondant en php est (un peu) long :

<?php
function sendData($url, $method, $data){

	$pUrl = parse_url($url);
	$port = ($pUrl['port']) ? $pUrl['port'] : 80;
	
	
	$sock = fsockopen($pUrl['scheme'].$pUrl['host'], $port, $errno, $errstr, 10); 
	if(!$sock)
		die("$errstr ($errno)\n");
	
	fwrite($sock, strtoupper($method)." ".$pUrl['path']." HTTP/1.0\r\n");
	fwrite($sock, "Host: ".$pUrl['host']."\r\n");
	fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
	fwrite($sock, "Content-length: ".strlen($data)."\r\n");
	fwrite($sock, "Accept: */*\r\n");
	fwrite($sock, "\r\n");
	fwrite($sock, $data."\r\n");
	fwrite($sock, "\r\n");
	
	while ($str = trim(fgets($sock, 4096)))
	$headers .= "$str\n";
	
	while (!feof($sock))
	$body .= fgets($sock, 4096);
	
	fclose($sock);
	
	return $body;
} 
?>
  • $url devrait être exprimé comme ceci : unmei.domtomconnection.com/headers/RequestHandler.php
  • Le format de $data est le suivant 'variable1='.urlencode($_POST['variable1']).'&var2='.urlencode($_GET['var2'])
  • N'oubliez pas que si vous faites une requête sur un serveur sécurisé, le port n'est plus 80 mais 443
  • Dans ce cas, on utilise un timeout de 10s pour la connexion
  • Le mieux serait de faire disparaitre le paramètre $url et le rendre interne à la fonction (ou utiliser une var globale valable pour cette fonction et les requests Ajax)

Donc vous faites une requete sur votre RequestHandler.php comme vous l'avez fait avec Ajax, et vous faites ce qu'il y a à faire en fonction du résultat.

(comment ça "inutile" ??)

mardi 7 février 2006

PHP et les calculs

Pour le fun, je voulais mettre un plugin de calcul mathématique à mihiro (mon bot IRC, basé sur Botan), et j'étais naturellement confronté au souci de sécurité, étant donné que le calcul se fait par simple eval("\$resultat = ($calc);");... et pouf :

$calcul_presque_propre = preg_replace("/[^0-9+-\/*]/","",$texte);

Ceci supprime donc tout ce qui n'est pas chiffre, +, -, * ou /.

Mais quelle ne fut pas ma surprise de tenir une telle conversation (alors que tout le monde sait bien que 0318894273>0312547955) :

< Christophe971> !>0318894273-0312547955
< mihiro> 0318894273-0312547955 => -103758

...avant de découvrir que :

< Christophe971> !>42
< mihiro> 42 => 42
< Christophe971> !>042
< mihiro> 042 => 34

... et me voilà confronté à la terrible vérité : PHP traite tous les nombres commençant par zéro en base octale.

Et plutôt que de s'amuser à preg_match_all et à base_converter tout ce qu'il nous plait pas, un simple preg_replace répare ce terrible mal :

$calc = preg_replace("/([+-\/*]*)([0]+)([0-9]+)/","\\1\\3",$calcul_presque_propre);

Et voilà.

Pages: