Archives de catégorie : Code

Des astuces de codage et autres éléments dans ce genre

MySQL – On redécouvre les requêtes imbriquées.

Bonsoir,

Confronté a un petit souci de stats je devais calculer à l’intérieur d’une requete le resultat d’une autre requête.

Grosso modo, je dois compter le nombre de resultats d’une sous requete et utilisé ce resultats comme champ de ma requete principale. Le tout par lignes resultant de ma requetes principale. Je sais je suis pas tres clair. mais je vais m’expliquer.

Nous avons une table clients et une table commande. Je souhaiterai ordonner mes clients par nombre de commande.

Je vais donc dans ma sous requete, compter le nombre de commande par client :

 SELECT count(DISTINCT num_commande) FROM commande WHERE client_id = X # X est mon numéro de client.

Bon jusque là rien de bien difficile. Le but est maintenant de faire ca pour tous les clients et de “stocker” ce résultat comme clé de tri pour la requete principale.

SELECT c.*, (SELECT count(distinct o.num_commande) FROM commande o WHERE o.client_id = c.client_id) as total FROM clients s ORDER BY total DESC

Cette requete nous permet de calculer le nombre de commandes par clients et ainsi d’ordonner par le nombre de comandes de chaque client : le champ “total”. Il faut bien penser a faire le lien en nommant précisement le champ utilisé dans la requete principale (“c.client_id”).

Je sais que c’est pas grand chose, dans l’absolu, mais ca vient de me rendre un très très grand service ! Je passe de 37 secondes d’execution à 0.017 secondes d’execution : Le jeu en vaut la chandelle.

 

Quelques astuces en PHP

Bonjour,

Je suis tombé sur un blog avec notamment quelques petites astuces de code PHP pas forcément inintéressantes. Du coup je souhaite vous en faire profiter aussi.

Tout d’abord rendons à César ce qui appartient à César, le billet du blog concerné est disponible ici.

Voici parmi les astuces  vues celles qui me semble notable :

  • Lister les noms de fichiers d’un repertoire : Plutôt que d’utiliser la duo classique opendir/readdir, un simple scandir permet de recuperer les noms des fichiers :
    <?php
    var_dump(scandir('.'));
    ?>
    php test.php 
    array(3) {
    [0]=>
    string(1) "."
    [1]=>
    string(2) ".."
    [3]=>
    string(8) "test.php"
    }
  • Créer des variables dynamiquement
    <?php 
    $nomVariable = "idleman";
    $$nomVariable = "is so lazy…";
    echo $idleman
    //résultat : "is so lazy…";
    ?>
  • L’opérateur “Elvis”  assigne une valeur a une autre si la valuer initiale est nulle.
    foo = foo ?: bar;

Voila les astuces que j’ai repérer (parce que je ne les connaissais pas) et qui me seront utiles à l’avenir.

Si j’en trouvent d’autres je les mettrais à la suite.

En espérant que ca vous aide aussi.

Comment récuperer les parametres d’appel de votre page en javascript.

Bonjour,

Juste un petit code super rapide, pour extraire les paramêtres de l’url d’appel d’une page en javascript. Dans mon cas ca a été utile pour retransmettre certains  paramètres dans le cas d’une redirection pour de l’affiliation.

Attention, ce post n’est en aucun cas une redite par rapport a mon post précédent : Je parle ici des paramètres d’appel à la page html :

Si par exemple, votre page a comme url  monsite.tld/toto.php?arg1=AAAAA&arg2=BBBBB, ce script va vous permettre de recuperer une tableau associatif de cette forme :

array(
    [arg1]=>'AAAAA',
    [arg2]=>'BBBBB'
);

La différence vient que dans mon précédent post ( Voir le post ) j’extrayer les paramêtres d’appel du fichier javascript et non du fichier PHP (ou html).

Voila le snippet :

function extractUrlParams(){	
	var t = location.search.substring(1).split('&');
	var f = [];
	for (var i=0; i<t.length; i++){
		var x = t[ i ].split('=');
		f[x[0]]=x[1];
	}
	return f;
}

En espérant que ce petit bout de code puisse pour permettre d’extraire les paramètres de l’appel de votre url en javascript.

Comment récuperer des paramètres passés en Url d’un appel de javascript !

Bonjour,

Derrière ce titre quelque peut imbitable, se cache une problèmatique réelle. Dans le cadre de l’affilation certains diffuseurs ont besoin d’inclure des javascript plutot que des widget en iframe.

Pourquoi ? Ben tout simplement pour pouvoir afficher de manière asynchrone leur page et les widgets des annonceurs.

Si comme moi, vos bannières sont des médias riches incluant des images, css, et js, vous  et si en plus vos médias ont besoin de paramètres particuliers, vous allez aimer ce billet !

Je m’explique.

J’ai des bannières paramétrables et qui nécéssitent d’être insérées dans la pages du diffuseur via une iframe (Oui je sais les iframes c’est mal ! :-D).

Exemple de script Iframe :

<iframe src="monurliframe" width="malargeur" height="mahauteur"/>

Seulement je voudrais faire ceci en chargeant simplement un fichier javascript avec un appel du type :

<script type="application/x-javascript" src="httpw://monsite/js/monscript.js?param1=valeur1&param2=valeur2"></script>

Ah oui mais seulement voila, les paramêtres ne sont pas recupérable  en javascript, donc “Houston ? On as un problème !”

L’astuce consiste a rechercher l’inclusion du script, de “parser” la source de l’appel et à en extraire les paramètres.

Pour ce faire, j’ai utliser un bout de code trouvé à l’adresse suivante : http://linuxfr.org/forums/programmationweb/posts/javascript-appel%C3%A9-avec-param%C3%A8tres-dans-lurl

Avec un peu de reformattage, on arrive au code suivant :

//Recuperation des parametres passés en url de l'appel javascript.
function getParam(){
  var src;
  var scripts = document.getElementsByTagName('script');
  for(var i = 0; i < scripts.length; i++){
    src = scripts[i].getAttribute('src');
    if(src.match(/widget\.js(\?.*)?$/) != null){
      var splitURL = src.split('?');
      var params = splitURL[1].split('&');
      var myParams = new Object();
      var keyValue = new Array();
      for(var j = 0; j < params.length; j++){
        keyValue = params[j].split('=');
        myParams[keyValue[0]] = unescape(keyValue[1]);
      }
    }
  }
  return myParams;
}
params = getParam();
//Ecriture de l'iframe
document.write('<iframe src=\"http:/monsite.com/mapageiframe.php?param1='+params['param1']+'&param2='+params['param2']+'\" frameborder=\"0\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"></iframe>');

La premiere partie est la fonction qui parcourt le document courant et isole toutes les balises <script>, ensuite pour chacune d’entre elles, on verifie que le nom du fichier javascript correspond bien au notre. Si c’est le cas, on extrait les paramêtres que l’on retourne dans un tableau associatif.

La seconde partie est un exemple d’utilisation : l’ecriture d’une iframe, ceci dit c’est applicable à nombre de cas !

En espérant que ce billet vous sera utile !

Symfony 2 : erreur 502 sur le profiler.

Bonjour,

J’ai installer Symfony2 pour une petite application “perso” et je me suis rendu compte que la barre de debug de Symfony renvoyait systématiquement sur une erreur 502.

Cela vient du fait que les entêtes http sont trop importants parce que par défaut Symfony 2 envoie des informations de debug pour des plugins FirePHP et ChromePHP.

On peut très simplement les désactiver dans le fichier de configuration app/config/config_dev.yml

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
#        firephp:
#            type:  firephp
#            level: info
        #chromephp:
         #   type:  chromephp
          #  level: info

En commentant les lignes 7 à 12, on désactive l’envoi des informations de debug dans les entêtes, réactivant ainsi l’utilisation des barres de debug “en ligne” de Symfony 2.

Voila, pensez juste à vider le cache par sécurité.

php app/console cache:clear

Yapluka !!