Archives pour la catégorie SQL

Je viens de réaliser un jeu concours en PHP pour un de mes clients dans le ménage et je voulais partager avec vous 2 ou 3 trucs sur lesquels vous pourriez perdre beaucoup de temps, surtout si vous n’avez que  4 jours devant vous (4 jours uniquement après le taff, soit entre 19h et 1h du mat).

Le jeux en question est à cette adresse, d’ailleurs n’hésitez pas à participer, il y a 935€ de ménage de ménage à gagner.

Donc les 2 ou 3 trucs qui m’ont un peu fait galérer :

1- Le template : à l’origine on m’avait dit qu’on me fournirait le design. Sachant cela j’avais évalué à 2 jours de travail pour le PHP, or en fait il s’est trouvé qu’on m’a simplement fournit une image .jpg et absolument pas un template avec du HTML, CSS et Javascript en bon et du forme. Du coup une journée de boulot supplémentaire. Donc premier conseil : bien s’entendre sur les éléments fournit, le travail à faire, les fonctionnalités, avant d’envisager quoi que ce soit.

2- Le Charset : alors c’est sympa de développer son petit script sur son serveur dédié avec son IDE favori (Netbean en ce qui me concerne), mais on en vient rapidement à oublier que les « autres » on tsouvent une config différente, notamment en ce qui concerne l’encodage. Travaillant uniquement en UTF-8 je n’avais pas songé une seconde que la config par défaut de PHP sur le serveur du client avait définit le charset à « disable » au lieu du traditionnel UTF-8. Du coup quelques headers à ajouter/modifier et pas mal de utf8_encode().

3- Transmission des variables : là bien sûr que 2 options : soit $_GET, ce qui est moyen pour la sécurité des données, soit $_POST, mais restreint par action. Donc j’ai opté pour $_POST en utilisant les $_SESSION. Du coup ça fait pas trop crade dans la barre d’adresse, ça évite les soucis d’injection SQL (de toute manière avec prepare je suis tranquille de ce coté là) et ça permet de balader ses variables où on veut. Bien entendu il faut manipuler les sessions avec soin pour éviter d’éventuels vols.

4- Contrôleurs : mine de rien on les oublis souvent un peu, mais c’est bien eu qui prennent le plus de temps, d’autant plus qu’ils différent en fonction de ce qui a été défini avec le client (possibilité de rejouer, champs obligatoires ou pas, etc)

Au final on a quoi :

- un petit formulaire classique avec info utilisateurs + réponses

- une petite fonction mail qui envoi les infos au client et au joueur, une fois le formulaire soumis

- un petit insert en BDD avec les info + datetime + http_referer

- un petit système viral qui génère une url tracking à la volée pour inviter les amis à jouer et qui permettra de tirer le vainqueur au sort. Bien sûr couplée à Google Analytics avec entonnoir de conversion.

Voila, donc rien de bien méchant, mais c’est quand même mieux de ne pas s’y prendre à la dernière minute.

J’ai cherché pendant un moment la solution à cette requête SQL donc autant vous la faire partager.

Imaginons que vous ayez 3 tables sous MySQL :

  1. walk
  2. walk_photo
  3. photo

Dans votre table photo certaines photos n’ont pas de titre (title) ou celui-ci est en NULL. Vous voulez donc faire un UPDATE de la table photo en associant les titres de la table walk correspondant aux photos.

Problème : si vous n’aviez que 2 tables, cela ne poserait aucun problème car il suffirait de faire un UPDATE en joignant les 2 par un WHERE walk.id = photo.id . Or ici ce n’est pas possible car l’on a une table entre les deux (walk_photo) qui lie les 2 tables, les deux premières n’ayant pas de clé commune.

Donc voici la solution:

UPDATE photo
SET photo.title = walk.title
JOIN walk_photo ON walk_photo.photo = photo.id
JOIN walk ON walk.id = walk_photo.walk
WHERE photo.title IS NULL OR photo.title = ''

Je pense que la requête est assez claire pour être dispensé de commentaire, néanmoins pensez à mettre le SET avant la jointure! Sinon ça ne marchera pas! Au début j’avais commencé par faire ma jointure avant de faire le set et je ne comprenais pas pourquoi ça ne marchait pas….

mysql-workbench

Dans le cadre de mon stage on m’a montré un beau schéma de la base de donnée de l’un des sites internet de l’entreprise et ma première pensée, un tantinet primitive, fût: « Quoi??!! C’est possible de faire ça??!! Trop coooool!!!! :D  »

Ni une, ni deux, a peine rentré chez moi que je me mets à faire quelques recherche sur Google pour tomber sur MySQL Workbench. Aïe ça marche sous Linux ça?? Ben oui!!! :D

Après avoir installé le .deb MySQL Workbench 5.1.16 (i386) je me suis mis à faire un petit schéma d’une base sous Magento pour voir ce que ça donne (et c’est un joyeux bordel! :s).

Donc voici les explications en images une fois le paquet installé.

Tout d’abord se rendre dans: Applications => Programmation => MySQL Workbench

(Lire la suite…)