[SQL] GROUP BY sur deux champs (exemple des conversations)
Dans le cas d'un script de messagerie en ligne par exemple, vous voulez lister toutes les conversations actives d'un utilisateur.
Nous avons donc une table `messages` composée des champs suivants:
- INT A.I message_id
- INT expediteur_id
- INT destinataire_id
- TEXT message
Nous voulons afficher à l'utilisateur la liste des conversations qu'il a entrepris avec d'autres utilisateurs.
Pour cela nous utilisons la fonction GROUP BY avec deux paramètres:
SELECT MAX(message_id) FROM messages WHERE (`expediteur_id` == $leUserIdDuClient) OR (`destinataire_id` == $leUserIdDuClient) GROUP BY GREATEST( `expediteur_id` , `destinataire_id` ) , LEAST( `expediteur_id` , `destinataire_id` )
Dans la clause WHERE on indique que l'on recherche les messages dans lesquels l'utilisateur est impliqué.
Comme l'utilisateur se trouve soit dans expediteur_id soit dans destinataire_id, on classe simplement ces deux champs dans l'ordre décroissant pour grouper tous les messages concernant ces 2 utilisateurs (dans les deux sens), d'où l'utilisation de GREATEST et LEAST.
Et le "MAX(message_id)" ? Dans notre exemple, il peut être utile d'afficher la date du dernier message en même temps à côté du nom de la conversation, ce bout de code permet donc de ne garder que le dernier message du groupe, à adapter bien sur.
[PHP] Division des résultats d’une requête MySQL par pages
Diviser les résultats d'une requête MySQL en pages permet d'augmenter l'expérience utilisateur et par la même occasion soulager le serveur, on affiche souvent en plusieurs pages les articles d'un blog ou les résultats d'une recherche.
Dans ce tutoriel nous allons voir comment obtenir le résultat de la requête en fonction de la page demandée et comment afficher un petit menu de navigation en bas de page avec des accès rapides aux pages précédentes et suivantes.
Structure
On a une table avec des entrées que l'on veut afficher dans l'ordre décroissant grâce à l'index "id".
On utilisera le paramètre "floor" pour indiquer quelle page on veut au script PHP.
On classera les résultats par étages décroissants de x entrées, dans ce tutoriel, 10 entrées.
Le premier étage correspondra aux 10 dernières entrées, le deuxième étage aux entrées 10-20 en partant des dernières, etc.
Pour rendre l'URL plus "user-friendly" on ne commencera pas nos étages à floor=0 mais à floor=1, les étages représentant les pages, et la page "0" étant difficilement imaginable, d'où le décalage constant que vous pourrez apercevoir dans la suite du tutoriel.
Requête MySQL
$sql = "SELECT * FROM articles ORDER BY id DESC LIMIT ".(isset($_GET['floor'])) ? ($_GET['floor']-1)*10 : "0".", 10"; $req = mysql_query($sql) or die('Erreur:<br>'.$sql.'<br>'.mysql_error());
ORDER BY id DESC: on range par id dans l'ordre décroissant
($_GET['floor']-1)*10 correspond au point de départ de la requête, pour floor=1, on commence au dernier message (0), pour floor=2 on commence par le dixième dernier message.
Ensuite le "..., 10" signifie que l'on demande 10 résultats maximum.
L'opérateur ternaire ici présent indique que si aucun étage n'a été spécifié, on demande les dix derniers articles (soit 0 comme départ).
Affichage du menu de navigation
echo '<center>Pages: '; $req = mysql_query("SELECT count(*) AS nbrEntrees FROM articles"); $data = mysql_fetch_array($req); $total_pages = floor($data['nbr']/10) + 1; // on fait des étages de 10, on rajoute 1 car entrées entre 0 et 10 ne correspondent pas à l'étage 0 mais au premier étage, ce qui créé un décalage sur toutes les entrées. $requested = $_GET['floor']; $cursor = (empty($requested)) ? "1" : $requested; $cursor = $cursor - 4; // afficher les 4 pages précédentes if($cursor <= 0) $cursor = 1; if($cursor > 1) echo '<a href="index.php">1</a> ... '; // si curseur loin de 1 (pas affichage de 1), affichage de 1 pour retour accueil rapide. $i = 1; while(($i < 10) && ($cursor <= $total_pages)) // afficher un lien supplémentaire tant que l'on en a pas affiché 10 et tant que l'on a pas dépassé le nombre de pages existantes { if($cursor==$requested) echo $cursor . ' | '; else echo '<a href="?floor='.$cursor.'">'.$cursor.'</a> | '; $i++; // le i n'est la que pour afficher seulement 10 liens pour les pages precedentes et suivantes $cursor++; } if($cursor-1 != $total_pages) echo '... <a href="?floor='.$total_pages.'">'.$total_pages.'</a>'; // acces rapide fin echo '</center>';
CyberAmour et DigMeToo: une idée, deux sites web.
Hier, j'ai regardé "La vrai histoire de Mark Zuckerberg". Un étudiant de Harvard qui avait monté un site nommé "DigMeToo" était interviewé. Il avait reçu une offre d'emploi de Facebook.
Ni une ni deux ce matin je me connecte sur DigMeToo.com, c'est alors que je découvre avec stupeur que le concept (et le fonctionnement) de DigMeToo.com est exactement le même que mon site CyberAmour.com !
Je me suis donc renseigné.
L'idée du site faisait partie d'un concours à Harvard, je ne sais donc pas exactement quand le gars a eu l'idée, le domaine a ensuite été acheté le 6 Décembre 2010 et le site a été ouvert le 10 Décembre 2010.
J'ai eu l'idée de CyberAmour plusieurs mois avant que je commence à le coder puis j'ai acheté le domaine le 15 Novembre 2010. A cause d'un probleme au niveau de mon registrar, je n'ai pu le mettre en ligne que début Décembre.
En voyant le mince succès de mon site j'en ai fait la promo début Janvier, on peut d'ailleurs voir une poussée croissante de mon nombre de visiteurs à partir du 8 Janvier.
Récapitulatif:
Mark Alan Isaacson et moi avons eu l'idée plus ou moins en même temps, chacun de notre côté.
Rob Schaaf et moi avons mis en ligne le site plus ou moins en même temps, chacun de notre côté.
DigMeToo.com propose de digger seulement une personne dans sa liste d'amis Facebook grâce à Facebook Connect, alors que CyberAmour.com permet de digger n'importe quelle personne grâce à son adresse email.
Résultat:
En vérifiant les comptes FB Connect, quelqu'un de chez Facebook a remarqué DigMeToo et a envoyé une proposition d'emploi chez Facebook à Rob Schaaf.
Voici pourquoi, moi, BabyGeek, 14 ans, je suis un peu déçu ce 25/07/2011.
Betcoin: jeux de chance Bitcoin
Après DoubleYourBitcoins.co.cc au design plus que douteux, j'ai décidé de développer un site tout beau tout propre beaucoup plus complet avec tout un tas de jeux de hasard pour faire exploser son porte feuille Bitcoin: ça s'appelle Betcoin !
Betcoin est, encore une fois, administré par mes soins ce qui empêche totalement toute tentative de hacking.
Pourquoi Betcoin et pas un autre ? Tout simplement car Betcoin propose des jeux avec les pourcentages de chances les plus élevés du web.
Vous êtes radins ? 1Visitor/2 est fait pour vous, vous pouvez perdre au maximum 0.05 BTC et en gagner 0.5 !
Vous voulez être sur de gagner ? Instant Win est fait pour vous, vous gagnez 10x votre mise toutes les 11 mises, vous êtes surs à 90% de gagner (si le compteur est à 3, vous jouez 8 fois et vous obtenez 10x votre mise !)
Vous êtes joueur ? The Red Button est fait pour vous, vous appuyez dessus et 45% de chance de gagner 1 BTC.
Vous voulez devenir riche maintenant ? Jackpot ! est fait pour vous, si c'est votre jour de chance vous pouvez gagner 50 BTC avec une mise d'1 BTC !
Tous les jeux n'ont pas été cités ci dessus, je suis en train d'en développer d'autres !
Vous l'aurez compris, il y en a pour tout le monde !
Et pour le lancement du site: Le site offre aux 15 premiers joueurs la possibilité de se faire rembourser s'ils perdent
!
Note avant de jouer: parfois le service de paiement MyBitcoin bug: il n'affiche pas l'adresse à laquelle envoyer les Bitcoins, il suffit d'effacer ses cookies et son cache puis de rejouer (vos BTCs ne seront pas envoyés 2 fois)!
L'argent mis de côté grâce aux perdants alimente la cagnotte des gagnants, donc en quelque sorte si vous perdez vous finirez par regagner une partie de votre argent en rejouant.
PS: j'ai tout vérifié mais il se peut qu'il reste des erreurs dans le code, si vous en voyez, merci de m'en informer, merci.
Have fun !
Sécuriser son fichier wallet.dat

Je suppose que vous avez entendu parler du vol d'1/2 Million de dollars en Bitcoin récemment?
En cause un virus tournant sous Windows, qui récupère le fichier wallet.dat (votre portefeuille bitcoin) dans votre ordinateur et l'envoie par mail au pirate (la fiche détaillée du virus sur le site de symantec).
Ce type de virus étant d'une simplicité extrême à coder, je pense qu'un réseau de pickpockets numériques va très vite se développer: c'est pourquoi j'ai décidé aujourd'hui d'écrire un petit tuto (très théorique) pour vous aider à sécuriser au maximum votre petit butin.
Théorie
La meilleure solution pour protéger son wallet et de le stocker sur une machine dédiée qui n'aura accès à internet que pour les transactions, et seulement pour les transactions.
Si vous avez un netbook ou un vieil ordinateur que vous n'utilisez plus, vous pouvez vous en servir, mais la solution la plus pratique reste la machine virtuelle.
Nous allons créer une machine virtuelle Ubuntu, y installer Bitcoin, transférer nos Bitcoins vers le nouveau wallet, crypter le wallet, effectuer une sauvegarde régulièrement du conteneur crypté vers un périphérique USB ou un serveur distant.
Place à la pratique !
Préparation de la machine virtuelle
Créez une machine virtuelle (VM) avec VirtualBox (par exemple) et installez y Ubuntu.
Lancez la VM, téléchargez le client Bitcoin, décompressez le: tar -xvf bitcoin*, maintenant lançons Bitcoin: ./bitcoin*/bin/32/bitcoin
Il va se mettre à télécharger tous les blocs, laissez le terminer puis envoyez tous vos Bitcoins de votre ancien wallet vers le nouveau (envoyez au début 0.01 pour tester que la transaction fonctionne bien).
Une fois tous vos BTCs transférés, coupez la connexion au réseau sur la VM.
Cryptons tout ça!
La création d'une machine isolée ne suffit pas: si l'hôte de la VM est infecté, ou si l'on vous vole physiquement votre ordinateur, votre wallet court un danger.
C'est là qu'intervient le cryptage !
Rendez vous dans /home/username/.bitcoin/, copiez le fichier wallet.dat sur une clé USB (temporaire, pour restaurer en cas de problème pendant les prochaines manipulations).
Installez TrueCrypt sur votre VM, créez un conteneur de 1Go, créez un dossier "Bitcoin" dedans puis coupez à l'intérieur le contenu du dossier /home/username/.bitcoin/.
Ce conteneur contient maintenant votre porte monnaie + les blocs.
Vous devrez maintenant avant de lancer Bitcoin, monter le conteneur, puis lancez Bitcoin avec le paramètre "-datadir=PointDeMontageDuConteneur/Bitcoin".
Mais... il reste un soucis: nous n'avons aucune sauvegarde de notre wallet, si le conteneur est supprimé ou corrompu nous perdrons tout ! Problème: les blocs sont inutiles et prennent pas mal de place, pas pratique donc de faire une sauvegarde du conteneur, à ce problème je n'ai qu'une solution: créer un conteneur de 10Mo et y copier régulièrement le wallet à partir du gros conteneur d'1Go. Vous pourrez ensuite envoyer votre conteneur de 10Mo sur un serveur FTP ou sur clé USB.
Note: Il est inutile de sauvegarder plusieurs fois de suite votre wallet si celui ci n'a pas rencontré de modifications (transactions, changement de l'adresse...).
Sinon, pour les paranos, il y a possibilité de crypter le fichier de la VM lui même (et ceci autant de fois que vous le souhaitez).
Si j'ai pu vous éviter de perdre quelques centaines/milliers d'euros, vous pouvez me faire un don (voir en haut à droite du blog)
[Bash] BTCValueNotifier
![BTCValue-notifier Screenshot BTCValue notifier [Bash] BTCValueNotifier](http://babygeek.free.fr/wp-content/upload/BTCValue-notifier.jpg)
J'ai codé un petit script Bash qui affiche toutes les x secondes le taux de change du Bitcoin avec un wget sur la page d'API de différents markets, en y extrayant les informations et en les envoyant avec notify-send.
Lien de téléchargement: BTCValueNotifier.sh
Il suffit de le rendre exécutable, le lancer et le réduire, une boucle dotée d'un sleep à la fin se charge de vous envoyer la valeur toutes les 120 secondes (ce nombre est modifiable dans le script).
Si vous n'arrivez pas à le faire fonctionner, vérifiez que vous avez installé le paquet notify-send.
EDIT 26 Juin: J'ai ajouté le support de TradeHill ainsi que différentes devises. Pour plus de simplicité j'ai créé une partie "CONFIG" où il est possible d'activer ou non certaines fonctionnalités.
Enfin, pour plus de simplicité, j'ai décidé de passer le développement du script sur launchpad: https://launchpad.net/btcvaluenotifier
Doublez vos Bitcoins [Chance]
J'ai développé hier après-midi un petit site de chance - au design laissant plus qu'à désirer - permettant de doubler ses bitcoins ! Il s'agit de http://www.DoubleYourBitcoins.co.cc
Le principe est simple: Un joueur sur deux gagne, l'argent donné par le perdant sert à payer le gagnant, vous avez donc 50% de chance de gagner.
Pour le moment la mise minimum acceptée est 0.01BTC et maximum 1BTC.
Si jamais vous gagnez une somme que le serveur n'a pas en stock, je vous rembourse votre mise ou vous propose d'attendre un joueur perdant.
Toutes les transactions sont, pour le moment, effectuées par mes soins pour éviter et détecter toutes tentatives de triche.
Maintenant, vous allez me dire: "Ce genre de service existe déjà , pourquoi le tiens est-il mieux que les autres ?", voilà pourquoi:
- DoubleYourBitoins.co.cc est géré par moi, et vous savez bien que je suis de confiance
! J'ai 3200 de Karma sur Launchpad, je suis quelqu'un de sérieux
Si jamais je vous arnaque, vous n'avez qu'à détruire ma e-réputation, et me flooder sur irc. - Toutes les transactions sont effectuées manuellement, plus de sécurité.
- Vous avez 50% de chance de gagner, je prends ma taxe au niveau des gains, vous ne gagnez pas 200% de votre mise mais 190%. Certains sites vous donnent 200% mais mettent un taux de chance à 47% des fois trafiqué.
- Les autres sites génèrent un nombre aléatoire pour déterminer si vous avez perdu ou gagné, vous pouvez donc perdre plusieurs fois de suites, DoubleYourBitcoins.co.cc utilise un procédé simple: un visiteur sur deux gagne, si vous retentez votre chance après avoir perdu vous êtes quasiment sur de gagner.
- DoubleYourBitcoin.co.cc peut si vous le souhaitez, vous créer un compte read-only sur son serveur ftp pour vous montrer son code source.
- Les transactions de Bitcoins sont effectuées par MyBitcoin.com - e-wallet très sérieux - vos bitcoins ne s'évaderont pas je ne sais où !
- Le webmaster de DoubleYourBitcoin.co.cc est un gros geek: les paiements et le support sont très réactifs ! Je me réveillerai la nuit s'il le faut pour effectuer les paiements.
Alors ? Convaincu ?

