nyroBlog
Bannière NyroBlog, par deuJeff
Image par deuJeff - ?

Tag : Travail


PHP : utiliser les références

Pour ceux qui ont fait du C++ ou qui savent faire la différence entre référence et valeur, vous pouvez passer au dernier paragraphe pour directement trouver le lien.

Lorsqu'on utilise des variables, celle-ci a besoin d'espace mémoire. L'espace mémoire est adressée, c'est à dire que la valeur de la variable se trouve à telle adresse (ou référence). Autrement dit, une variable pointe sur une ADRESSE, où est stockée véritablement la VALEUR de la variable. En PHP, tous les passages de variable (pour les fonctions, classes ou copie) se font par VALEUR. Etudions

$var = 'abc';
$var2 = $var;

La Première ligne : Lorsqu'on fait ceci, $var est associée à 1 référence mémoire (adresse), dans laquelle on met la valeur 'abc'. La seconde ligne : comme je vous l'ai dit, la copie se fait par valeur. Donc, en faisant ça, $var2 est associée à 1 nouvelle référence, dans laquelle on stocke la valeur de $var, 'abc'. Jusque là, rien de bien compliqué, c'est juste pour être plus clair et que vous compreniez mieux la suite.

Maintenant, si nous faisons ceci :

$var = 'abc';
$var2 = &$var;

(La seule différence est le &, marqueur de la référence) Pour la première ligne, rien ne change évidemment. Pour la seconde, qu'est-ce qu'on fait ? Une nouvelle référence est crée pour $var2, mais au lieu d'y stockée une valeur (celle de $var), on y stocke la référence de $var. Pour le dire différemment, $var2 est un alias de $var, qui pointe tous les 2 vers la même valeur dans l'espace mémoire. Vous suivez ?

Je voulais juste faire ce petit rappel, avant de vous donner l'adresse d'un très bon article de JDNet, qui montre plusieurs exemples qui vous seront très pratique. Peut-être que vous n'en voyez pas l'utilité tout de suite, mais cela pourra vous permettre de vous sortir de mauvaises passes dans certains cas.

Ca m'est arrivé il y a pas très longtemps, et je ne sais pas comment j'aurai fait sans ça.

SRC, infos et projets

SRC [*] M?diaSamedi dernier avait lieu à l'IUT de Montbéliard la journée des anciens, rassemblement des diplômés du DUT SRC Montbéliard (Services et Réseaux de communication) pour parler de leurs expériences avec les prochains diplômés.

Et puis cela nous a permis de nous revoir et de bien fêter nos retrouvailles le soir.

Mais ce fut aussi l'occasion pour un groupe de projet collectif de parler de la nouvelle communication du département, qui a été renommé SRC [*] Média. Si vous ne connaissez pas ce DUT, je vous conseille cette animation, qui résume rapidement ce qu'on y fait.

Et encore, la distribution du numéro 2 du [Frigo], journal édité par le département, rédigé par des él?êves sous la houlette d'un professeur de communication, Jean-Claude Domenget. Et j'ai eu droit à un interview en double page (page 28/29), où je parle de mes études et de mon activité professionnelle. Un beau projet qui, je l'espère, continuera même avec le départ des étudiants qui s'en occupent pour le moment.

Et ce fut aussi l'occasion pour M. Viezzi, le chef de département actuel, de me demander de référencer au mieux son nouveau nom de domaine, srcmontbeliard.com. Mais comme c'est une redirection, je ne sais pas si un référencement là dessus peut être aussi efficace qu'un véritable nom de domaine. Vous avez une expérience là-dessus ?

Grosse requête MySQL, comment faire

Il arrive parfois qu'on est besoin de transférer énormément de données d'une base de donnée MySQL vers une autre (passage en production, changement de serveur...)

Or, ce qui arrive quelques fois dans ces cas-là, c'est que le fichier sql soit tellement gros qu'on ne peut pas l'envoyer via phpMyAdmin ou bien que le php mette trop de temps et arrive au timeout de la page... Bref, on n'y arrive pas. La solution utilisé quelques fois et le tranchage en parties du fichier sql et l'envoi par petits morceux : très laborieux.

La solution que je vous propose marche du tonnerre, mais uniquement si vous avez un accès SSH au serveur. Le principe est simple : vous allez envoyer votre fichier sql sur le serveur par FTP, puis l'exécuter directement avec la commande mysql. Et donc, voici ce que vous attendez tous, la commande à utiliser :

# mysql -h HOTE -u LOGIN --password=PASSE BASE < fichier.sql

Bien sûr, à vous de modifier HOTE, LOGIN, PASSE, BASE et fichier.sql selon ce que vous faites, mais ça, vous saurez le faire. J'ai déjà utiliser ce système sur Client Roi dans un script bash qui fait la mise à jour des données journalières. Et puis hier soir, c'était pour transférer la base de données des régions, départements, cantons et villes de France de mon EasyPhp vers le serveur de production.

Et si vous n'avez pas d'accès SSH, vous pouvez toujours créer un script PHP qui vous lira votre fichier.sql et vous exécutera N requêtes pas appel, mais c'est déjà plus contraignant...

Forum PHP Paris 2006

Les 9 et 10 novembre 2006 prochain se tiendra le forum PHP à Paris.

La 1ère journée se destinera à la fonctionnalité de PHP :

  • Tour d'horizon de l'univers de PHP (dont PHP6) par l'inventeur de PHP Rasmus LERDORF
  • Ajax et Web Services en PHP avec les API Google AdWords
  • PHP au sein du Service Public Fédéral Finances de Belgique

La 2nde journée sera quant à elle orientée sur la technique :

  • Unicode : une révolution en marche pour PHP6
  • Design Patterns & PHP
  • Sécurité des applications PHP

JavaScript : Faire une infobulle

Pour un site en construction, j'ai du mettre en place une infobulle sur des images.

J'ai d'abord commencé par chercher à droite à gauche ce qui se faisait, pour voir si je ne pouvais pas trouver un script à réutiliser tout simplement.

Après bien des tests, aucun ne fonctionnait dans mon cas, dans un site tout en Div/CSS.

Donc, j'ai commencé par rechercher comment déplacer une div par rapport à la souris. J'ai trouvé ce dont j'avais besoin sur Tout Javascript. Enfin presque : le seul soucis de ce code, c'est qu'il ne tient pas compte des barres de défilement; autrement dit, si vous descendez dans votre page, votre 'infobulle' changera de place, mais en haut, et donc vous ne la verrez pas. Voici donc le code modifié :

function mouseMove (evt) {
	var x = 0;
	var y = 0;
	var plusX = 0;
	var plusY = 0;
	if (document.layers) {
		x = evt.x;
		y = evt.y;
		plusX = window.pageXOffset;
		plusY = window.pageYOffset;
	} else	if (document.all) {
		x = event.clientX;
		y = event.clientY;
		plusX = document.body.scrollLeft;
		plusY = document.body.scrollTop;
	} else if (document.getElementById) {
		x = evt.clientX;
		y = evt.clientY;
		plusX = window.pageXOffset;
		plusY = window.pageYOffset;
	}
	document.getElementById("popBox").style.left = (x+plusX+15)+"px";
	document.getElementById("popBox").style.top = (y+plusY+5)+"px";
} 
if (document.layers)
	document.captureEvents(Event.MOUSEMOVE); 
if (document.layers || document.all) 
	document.onmousemove = mouseMove; 
if (document.addEventListener) 
	document.addEventListener('mousemove', mouseMove, true);

Vous l'aurez compris, j'ai placé juste derrière mon une div vide avec comme id popBox, qui a comme attribut CSS position: absolute (et d'autres si vous en avez besoin...)

C'est quasiment fini. En effet, j'ai à ma disposition une div qui suit la souris tout le temps. Il ne me reste plus qu'à la cacher par défaut, et à l'afficher au survol des éléments qui doivent avoir une infobulle, et à y insérer le contenu que je veux. Dans mon cas, il s'agissait d'afficher un zoom sur une image au survol de sa vignette. J'ai donc décider d'afficher cette image dans une div invisible; de cette façon, le chargement de l'image commence avant que la personne passe dessus l'image. Et lorsque je dois afficher le contenu, je copie simplement le contenu de la div cachée dans ma div popbox. Le code :

function montre(id) {
 var elt = document.getElementById('popBox');
 elt.style.display = "block";
 elt.innerHTML = document.getElementById(id).innerHTML;
}
function cache() {
 var elt = document.getElementById('popBox');
 elt.style.display = "none";
}

La fonction montre est appellée sur le onMouseOver de l'image, avec en paramètre l'id de la div à recopier. La fonction cache est quant à elle appelée sur le onMouseOut de la même image.

Et voilà, une belle infobulle qui fonctionne super bien avec IE et FireFox.