Jump to content

Search the Community

Showing results for tags 'PHP'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Discussions communautaires
    • Annonces importantes
    • Suggestions
    • Postulation
    • Présentation des membres
    • Discussions générales
    • Multimédias
    • Jeux vidéos
    • Actualités
    • Aide / Support
    • Études
    • Archives
  • Informatique
    • Projets des membres
    • Autres / Divers / Découvertes
    • Crypto-monnaie(s)
    • Réseaux
    • Gestion de serveur
    • Système d'exploitation : Smartphone
    • Système d'exploitation : Ordinateur
  • Programmation
    • Projets des membres
    • Développement web
    • Développement de logiciels
    • Développement d'applications pour smartphones
    • Outils du développeur
    • Aide / Support
  • Emulation
  • Partenariats

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Skype


Site web


AIM


MSN


ICQ


Yahoo


Jabber


Tox


Centres d'interêts


Localisation


Study level

Found 21 results

  1. Bonjour à tous ! Aujourd'hui nous nous attaquons à un tutoriel assez long ! Je vous préviens tout de suite ! Si vous n'avez pas de connaissance en PHP / HTML il est inutile de poursuivre ce tutoriel. Nous allons donc comme dit plus haut utilisé du PHP & du HTML pour réaliser ce tutoriel. 1 - Système de connexion C'est partie ! On s'occupe en premier de la base de donnée : Nous allons donc créer un table nommer "membre" qui regroupera tous les membres du site. CREATE TABLE membre ( id int(11) NOT NULL auto_increment, login varchar(8) NOT NULL, password varchar(8) NOT NULL, PRIMARY KEY (id), KEY ID_2 (id) ); Ici on stocke : L'id, le Pseudo & le Password du membre. Ensuite on créer la page LOGIN.PHP & on insére formulaire HTML de connexion : <form method="post" action=""> <legend>Connexion au Panel</legend> <div class="form-group"> <label class="col-lg-2 control-label">Login</label> <div class="col-lg-10"> <input type="text" class="form-control" name="login" placeholder="Login"> </div> </div><br/><br/><br/> <div class="form-group"> <label class="col-lg-2 control-label">Mot de passe</label> <div class="col-lg-10"> <input type="password" class="form-control" name="password" placeholder="Mot de passe"> </div> </div> <br/><br/><center><button type="submit" name="submit" class="btn btn-primary">Connexion</button></center> </form> Ensuite on créer le système qui vas vérifier & nous connecter : <?php // on se connecte à MySQL $db = mysql_connect('localhost', 'login', 'password'); mysql_select_db('nomdelabase',$db); if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['password'])) { $_POST['password'] = hash("sha256", $_POST['password']); extract($_POST); // on recupére le password de la table qui correspond au login du visiteur $sql = "select password from membre where login='".$login."'"; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $data = mysql_fetch_assoc($req); if($data['password'] != $password) { echo '<div class="alert alert-dismissable alert-danger"> <button type="button" class="close" data-dismiss="alert">x</button> <strong>Oh Non !</strong> Mauvais login / password. Merci de recommencer ! </div>'; } else { session_start(); $_SESSION['login'] = $login; echo '<div class="alert alert-dismissable alert-success"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>Yes !</strong> Vous etes bien logué, Redirection dans 5 secondes ! <meta http-equiv="refresh" content="5; URL=dashboard"> </div>'; // ici vous pouvez afficher un lien pour renvoyer // vers la page d'accueil de votre espace membres } } else { $champs = '<p><b>(Remplissez tous les champs pour vous connectez !)</b></p>'; } ?> Ensuite nous modifions la ligne : // on se connecte à MySQL $db = mysql_connect('localhost', 'login', 'password'); mysql_select_db('nomdelabase',$db); Ici vous entrez les identifiants de connexion à la base de donnée. Voilà, la connexion est terminée. Maintenant nous passons au plus dur ! 2 - Système d'inscription Ici on créer une page REGISTER.PHP & on créer le système d'inscription. Enfaite ce n'est pas réellement le plus dur car ici nous nous servirons tout simplement d'un système de news en php mais nous le modifierons un petit peut ! Alors go : On créer le formulaire d'inscription et on l'insère dans la page <form method="post" action=""> <legend>S'inscrire sur le site</legend> <div class="form-group"> <label class="col-lg-2 control-label">Login</label> <div class="col-lg-10"> <input type="text" class="form-control" name="login" placeholder="Login"> </div> </div><br/><br/><br/> <div class="form-group"> <label class="col-lg-2 control-label">Mot de passe</label> <div class="col-lg-10"> <input type="password" class="form-control" name="password" placeholder="Mot de passe"> </div> </div> <br/><br/><center><button type="submit" name="submit" class="btn btn-primary">S'Inscrire</button></center> </form> Et on créer le système ! IMPORTANT : Ici nous effectuons une connexion MYSQL PDO (beaucoup plus sécurisé) et tout à l'heure le système était fait de sorte à utiliser une connexion MYSQL BASIQUE qui bientôt disparaitra ... C'est partie : <?php //Connexion à la BDD try { $bdd = new PDO ('mysql:host=localhost;dbname=nomdelabase', 'login', 'password'); } catch(Exception $e) { die('Erreur :'.$e->getMessage()); } if(ISSET($_POST['submit'])) { //On créer les variables $login = $_POST['login']; $password = $_POST['password']; $password = hash("sha256", $password); $req = $bdd->prepare('INSERT INTO membre(login, password) VALUES (:login, :password)'); $req->execute(array("login" => $login, "password" => $password)); if(!empty($login) && !empty($password)) { }else{ ?> <b>Pseudo ou MDP vide !</b> <?php } if(empty($login) && empty($password)) { }else{ session_start(); $_SESSION['login'] = $_POST['login']; header('Location: dashboard'); } } ?> La connexion PDO est ici : <?php //Connexion à la BDD try { $bdd = new PDO ('mysql:host=localhost;dbname=nomdelabase', 'login', 'password'); } catch(Exception $e) { die('Erreur :'.$e->getMessage()); }[/php] Il ne vous reste plus qu'à changer : [php]('mysql:host=localhost;dbname=nomdelabase', 'login', 'password')[/php] Et ici aussi pour le lien de redirection une fois que la SESSION à démarrée : [php] session_start(); $_SESSION['login'] = $_POST['login']; header('Location: LIEN-DE-REDIRECTION'); 3 - Système de vérification ICI nouveau problème : Si on essaye d'accèder à une page qui normalement doit être réservé au personne connectées, par exemple : panel.php. Et bien nous y avons quand même accès même déconnecté ! Nous allons résoudre ce problème avec une page nommée vérif.php. On y inclue ce code : <? session_start(); /* si la variable de session login n'existe pas cela siginifie que le visiteur n'a pas de session ouverte, il n'est donc pas logué ni autorisé à acceder à l'espace membres */ if(!isset($_SESSION['login'])) { echo '<h1>Vous n\'êtes pas connecté, accés interdit !</h1> <meta http-equiv="refresh" content="0; URL=index.php"> '; } ?> Comme indiqué en haut, on regarde si la SESSION est démarrée, si elle ne l'est pas on interdit l'accès. Ensuite il ne vous reste plus qu'à include ce code sur toutes les pages que vous voulez : <?php include ('verif.php') ; ?> 4 - Système de déconnexion Pour finir l'utilisateur doit bien ce déconnecter une fois qu'il à terminé. Pour ce faire nous créons la page logout.php et on y inclue ce code : <?php session_start(); session_unset(); session_destroy(); header('Location: login.php'); ?> Ici on déconnecte l'utilisateur & on le redirige vers la page de login ! Ce tutoriel est maintenant terminé ! Attention : Je préviens à l'avance avant que tous le monde spam le topic : Le Topic ne sert en aucun cas de Support ! J'insiste bien la dessus. Vu que je ne suis pas méchant contactez mon plutôt par Mp sur le Forum, c'est quand même mieux ! En espérant vous avoir aidez, à la prochaine !
  2. CodeAnywhere Aujourd'hui je viens vous présenter un site que j'ai découverts, qui a l'air vachement intéressant : CodeAnywhere. C'est un OCE (Online Code Editor / Editeur de code en ligne), et en gros cela vous permet de travailler sur un projet depuis n'importe où. Si vous disposez d'un projet commun ou personnel, qu'il soit sur votre Dropbox , votre Github, votre FTP ou d'autres services du cloud, CodeAnywhere vous permet de coder e t travailler dessus depuis n'importe où dans le monde. Il vous suffit de vous rendre sur le site pour travailler sur votre projet, et c'est super intéressant. Visiblement, tout les langages sont nativement pris en charge, du moins la plus grande majorité. Des offres payantes existent pour coder à plusieurs de ce que j'ai cru comprendre, mais l'offre de base est très bien pour une utilisation personnelle. Petit plus personnel : Le SSL est activé sur l'ensemble du site. https://codeanywhere.com/
  3. Bonjour à tous, Je vais essayer de m'habituer à la nouvelle interface et vous faire un jolie tuto, non je ne vais pas expliquer comment faire un héébergeur d'image je ferais un autre tuto plus aboutis sur ça si vous voulez, mais bon là on va parler de l'hébergement avec par exemple les images payantes que l'on trouve sur google toute belle et quand on clique dessus on se retrouve avec un gros copyright qui rend l'image inexploitable... ou quand on veut ouvrir une image dans un onglet et que l'on est rediriger sans vers la page du site proposant l'image. Mes exemples régénèrent les images donc peuvent être gourmands si les images sont grandes et il existe peut-être des façons plus optimisées mais bon je programme proprement comme un porc :hap: On va donc réécrire l'adresse et gérer son affichage livre à vous d'utiliser une base de données (ex:sql) et vous ne communiquez qu'une référence ou un vrai nom dans l'url. Trop de blabla pas assez de CODE! :E Encore un petit truc, Google a son propre User-Agent (chaine qui donne des informations que vous utilisez Firefox sur Windows10 64-bit et qu'il est configurer en français) nous alors donc nous servir de cela pour détecter si c'est un moteur de recherche ou un simple utilisateur qui regard, notez qu'il est possible de trafiquer son User-Agent donc il y a mieux comme sécurité en cherchant la liste des ips des serveurs par exemple. Les User-Agents: GoogleBot: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) GoogleBot-Image: Mozilla/5.0 (compatible; Googlebot-Image/1.0; +http://www.google.com/bot.html) YahooSlurp: Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) MsnBot: msnbot/1.1 (+http://search.msn.com/msnbot.htm) On va faire un test avec une expression régulière en php pour voir si ça ressemble à un bot Google: header("Content-Type: image/png"); // on dit que c'est une image est pas du php/html $img = imagecreatefrompng("images/tructresinteressant.png"); // image à protéger $cp = image createfrompng("image/copyright.png"); // copyright de protection à appliquer if (!preg_match("~Googlebot\-[a-zA-Z]+(/\d+(\.\d+)?)?~", $_SERVER['HTTP_USER_AGENT'])) imagesettite($img, $cp); // on applique un motif avec le copyright imagepng($img); imagedestroy($cp); Si vous voulez que la personne soit redirigée quand elle va sur le lien de l'image c'est très simple: // on précise qu'il s'aigt d'une image png et non d'une page html (php compilé) header("Content-Type: image/png"); //vous charger l'image avec $im = imagecreatefrompng("monimage.png"); imagepng($im); imagedestroy($im); // ou plus cours et peut-être moins lourd mais risqué au niveau de l'encodage: echo file_get_contents("monimage.png"); // et enfin la redirection header("Refresh: 0; url=/index.php"); Maintenant on gère le débit, cette option est plus intéressante pour des plus gros fichiers car les images sont jamais très lourdes. :/ // dans notre exemple on aura un débit de 10Ko/s (très lent) $handle = @fopen("monimage.png"); if ($handle) { while (($buffer = fgets($handle, 1024)) !== false) { // 1024 => nombre d'octet dans le buffer que l'on écrit echo $buffer; usleep(100); // 10 => nombre de milliseconde entre chaque envoie, 1000 = 1seconde } } [En cours de rédaction.... des idées? :)] PS: j'ai tapé le code directement sur le fofo donc s'il a y des fautes prévenez moi^^'
  4. Bonjour à tous, Donc comme si bien dit dans mon titre je vais vous expliquer comment faire un système de bbcode en php. Et pour ceux qui ne savent pas ce qu'est le bbcode c'est un système de balise utilisé principalement sur les forums par exemple ici si vous voulez mettre un image avec un lien (si comme moi vous écrivez le bbcode à la main à la place d'utiliser l'interface) vous aurez un "code" comme celui-ci: [url=http://mon_utrl/][img=mon_image.png][/url] mais une fois traité il s'affichera sous une forme html: <a href="http://mon_url/" target="_blank"> <img src="mon_image.png" border="0" /> </a> ps: dans mon contexte les liens s'ouvrent dans un onglet et le desactive les bords pour IE Pourquoi ne pas laisser le code html aux utilisateurs/clients? Parce que celà fait une faille XSS (plus d'info sur ce topic) même si vous pouvez aussi en désactiver/activer certaines seulement. Je vais donc vous expliquer comment faire: - une balise orpheline (ex: [ img=], elle n'a aucune fermeture) - une balise non-orpheline (ex: [ code] - une balise non-orpheline + paramètre (ex: [ url=], il y a un paramètre en plus dans la balise) Donc pour faire notre bbcode vous allons utiliser ce qui s'appel des expressions régulières (aussi appelé "motif de recherche"), un truc que personnellement je n'aime pas car je me trompe souvent... Et donc une expression c'est en réalité une structure dans un texte (par exemple) on peut donc analyser s'il y a des chiffres, une chaîne de caractères ou autre, c'est souvent utilisé pour les e-mails pour voir si ce que vous avez entré ressemble à un e-mail, je ferais donc peut-être (si j'ai le courage un topic sur ça, sinon je connais un site assez bien. Bref donc nous allons commencer par une balise orpheline: // Contexte: J'ai fais une shoutbox et je mettre en place une balise [ img=] donc <img... en html $msg = "Bonjour! [img=heart.gif]"; $bb = '#\[ img=(.+)\]#iUs'; $htm = '<img src="$1" border="0" />'; $msg = preg_replace($bb, $htm, $msg); Donc l'expression: '#\#iUs' - Elle est délimité par des # - On utilise les antislashes ("\") avant certains caractères car ils peuvent être utilisé pour la structure (expression), caractères tels "[", "]", "(", ")", ... - "(.+)" : - - les parenthèses "()" symbolise un groupement littéral - - le point (".") symbolise qu'il peut s'agir de n'importe quel caractère et le plus ("+) symbolise qu'il peut y avoir 1 ou plusieurs caractères - "#iUs' : - - "i" effectuer une recherche insensible à la casse (par de différence entre une lettre majuscule et une minuscule). - - "U" cette option inverse la tendance à la gourmandise des expressions rationnelles. - - "s" permet au point "." de correspondre à encore plus de caractères et/ou un retour à la ligne. > Documentation PHP::Options de recherche Maintenant une balise pour center donc [centre][/centre] devient <center></center>, je vais un peux compacter le code pour avoir plus simple: $msg = "[centre]Coucou![/centre]"; $msg = preg_replace('#\[centre\](.+)\[\/centre\]#iUs', '<center>$1</center>', $msg); Il a donc suffit de déplacer "(.+)" et pour ceux qui n'avait pas encore compris la partie trouvée ici va remplacer le "$1", il sagit en réalité d'un tableau donc quand vous cherchez plusieurs expressions vous avez donc "$2", "$3",.. qui arrive. Nous allons donc maintenant avoir une balise avec un paramètre et pour complexer un peut on va dire que le paramètre est obligatoirement un chiffre décimal ^-^ // balise [taille=][/taille] remplacée par <font size=""></font> $msg = "[taille=5]Hello World! [/taille]"; $msg = preg_replace('#\[taille=(\d+)\](.+)\[\/taille\]#iUs', '<font size="$1">$2</font>', $msg); Comme vous le voyait j'ai mis la mettre "\d" à la place d'un "." donc à la place de chercher n'importe quel caractère je dis que c'est un chiffre décimal et le "+" spécifie qu'il peut-être composé de plusieurs chiffres même si je pense que font-size ne peut prendre que une valeur entre 1 et 5 j'aurais pu mettre directement "([1-2-3-4-5])" mais bon je ferais une explication plus détaillée dans un prochain topic PS: pour les smileys c'est un simple str_replace(): str_replace(":D", "<img src=\"images/smiley.gif\" />", $msg); PPS: et si vous avez plusieurs balise directement vous pouvez faire un tableau (si vous voulez vous pouvez mettre par exemple $htm[0] = "<b>$1</b>"; et donc pour reprendre toutes les balises faites + anti-faille XSS dans une fonction: function BBCode($msg = '') { $msg = htmlentities($msg); // suprresion des caractères spéciaux (html), à placer avant les modifications sinon vous affichez le message avec les balises (en lisible) $bb = array( '#\[img=(.+)\]#iUs', '#\[centre\](.+)\[\/centre\]#iUs', '#\[taille=(\d+)\](.+)\[\/taille\]#iUs', '#\[url=(\.*)\](.+)\[\/taille\]#iUs' ); $htm = array( '<img src="$1" border="0" />', '<center>$1</center>', '<font size="$1">$2</font>', '<a src="$1" target="_blank">$2</a>' ); return preg_replace($bb, $htm, $msg); } echo BBCode("[centre]<b>XSS</b>[/centre]"); /!\j'ai mis des espaces dans les balises pour pouvoir publier (ex: "[ img]")! Bonne programmation à tous! Cordialement, Mars073
  5. Bonsoir, vous n'êtes pas sans savoir que, les hackeurs utilisent une méthode appelée "l'injection sql", qui comme son nom l'indique, permet d'injecté du code sql dans une fonction POST ou GET d'une page php. Elle est souvent utilisé pour contourner des connexion (par exemple, 'OR "="). Mais comment se protégé ? Tout simplement, rajoutez dans votre méthode POST ou GET : mysql_escape_string(); Ce qui donnerais au final (avec la variable et la méthode) : $user = mysql_escape_string($_POST['user']); Voila, j'espère que ça vous auras aidé ! ^^
  6. Le PHP est un langage de programmation web permettant d'insérer du contenu dynamique dans vos pages. Ce langage offre de nombreuses possibilités telles que la gestion de news ou encore l'envoie d'eamil et combiné à une base de données, ses performances sont considérables. Le PHP nécessite de nombreux outils et de nombreuses heures d’apprentissage. Pour commencer, vous aurez besoin de Xampp ou Wamp ou tout autre logiciel incluant Apache, PHP et MySQL. Ensuite, je vous conseille vivement de garder la documentation proposée par PHP afin de trouver rapidement des fonctions ainsi qu'un cours bien rédigé comme celui de Mateo21 sur OpenClassrooms. Bien que dans ce cours elles ne sont pas utiles, le PHP requière des connaissances en HTML/CSS. En combinant tous ces langages, vous pourrez obtenir un site à la fois dynamique et élégant. Vous pourrez le rendre encore plus dynamique en utilisant le langage Javascript.
  7. Soulalex

    Apprendre le PHP

    Si vous souhaitez vous lancer dans l'apprentissage du PHP, ce petit guide va vous aider à vous orienter vers les ressources dont vous aurez besoin tout au long de votre formation à ce nouveau langage. Les outils nécessaire : Un éditeur de texte (Sublim Text, Notepad++, Bloc note).Un serveur web avec PHP (xampp est un logiciel contenant tous les outils nécessaires pour ce faire).Un navigateur web (Firefox; Chrome) pour accéder à vos applications web avec éventuellement quelques outils de débug (Firebug). Sur Melinyel : Cours d'initation aux rudiments du PHP : Ce guide contient l'essentiel pour débuter en PHP. Il va vous permettre d'apprendre les rudiments de ce langage Cours : Concevez votre site web avec PHP et MySQL : Ce cours complet créé par Mathieu Nebra d'OpenClassrooms va vous permettre d'atteindre un bon niveau en PHP. Il est a noter que plusieurs mois d'apprentissage sont nécéssaire avant d'acquérir la certification finale. Tutoriels : Créer un système de Connexion / Inscription en PHPFaire son propre BB-CodeCréer un moteur de recherche de baseGestion d'image en PHP Documentations : Documentation officielle en français : Cette documentation est votre amie en toute circonstance. Elle vous permettra de comprendre certaines fonctions dont vous aurez besoin.
  8. Présentation Symfony est un framework PHP libre développé par une entreprise française SensioLabs qui fournit de nombreuses fonctonnalités modulables pour les développeurs confirmés : Des performances accrues (système de cache, benchmark), Une sécurité parfaite (sécurité des controlleurs et de URLs), Gestion des URLs, Séparation du code selon la norme MVC, Implentation de pulgins. Installation Symfony peut être installé sur tous les systèmes d'exploitation (Windows, Linux, Mac). Il vous suffit pout cela d'entrer les commandes suivantes dans votre invité de commande préféré selon votre système : Pour Windows : php -r "readfile('http://symfony.com/installer');" > symfony Pour Linux et Mac OS : sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony sudo chmod a+x /usr/local/bin/symfony Une fois installé, vous pouvez créer un nouveau projet Symfony avec la commande suivante : symfony new my_project Site officiel de Symfony : https://symfony.com/ GitHub : https://github.com/symfony/symfony Documentation : http://symfony.com/doc/current/book/index.html Cours Openclassrooms : https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony2/symfony2-un-framework-php
  9. Bonjour, voici une petite méthode pour faire de l'ajax simple sans aucun plugin : le DSL Dans l'idée nous allons apprendre à créer une page qui affiche un nombre et un bouton pour incrémenter ce nombre. Afin de stocker ce nombre, nous allons le ranger bien au chaud dans une BDD. Notre page devra donc : incrémenter ce nombre dans la BDD sans rechargement de la page mettre à jour l'affichage du nombre, toujours sans recharger la page (sinon c'est trop simple ) L'utilisation d'une BDD juste pour un nombre peut paraitre exhaustive, mais l'idée est d'appliquer la méthode avec plusieurs nombres, possédants chacun un id... on verra ça après Nous allons utiliser deux pages : index.php et incrementation.php. Voici index.php : <?php $bdd = new PDO('mysql:host=kpsoftware.fr;dbname= toto','jean-michel','fjhbqfkqsfhgsjkgbs'); ?> /* connexion à la BDD */ <div style="text-align: center;"> <span class="leNombre"> <?php $nombre=$bdd->query('SELECT nombre FROM nombre'); $nombre=$nombre->fetch(); echo $nombre['nombre']; ?> </span> /* on à notre nombre ! */ <input value="Plus un !" type="button"/> </div> <script> /* les choses sérieuses commencent ici */ function addEvent(element, event, func){ if (element.attachEvent) { element.attachEvent('on'+event, func); } else { element.addEventListener(event, func, true); } } /* ceci est notre fonction pour ajouter des évènement en javascript */ (function(){ var elements = document.getElementsByTagName('input') for (var i=0;i<elements.length;i++){ addEvent(elements[i],'click',function(e){ /* on ajoute un évènement sur les "input" */ var target=e.target || e.srcElement; if(target.value == 'Plus un !'){ /* quand un "input" est cliqué, on teste sa "value" */ /* si cette "value" est "plus un !", alors on créer un script, dont la source est une page php : incrementation.php. Il ne reste plus qu'à l'ajouter ! */ var scriptElement = document.createElement('script'); scriptElement.src ='incrementation.php'; document.body.appendChild(scriptElement); } }); } })(); /* à ce stade, incrementation.php à été exécuté, je vous invite à aller voir cette page avant de lire la fin de index.php */ function refreshNombre(newNombre){ var spanElements = document.getElementsByTagName('span'); var newSpan = document.createTextNode(' ' + newNombre + ' '); /* on créer notre nouveau span contenant le nouveau nombre */ for (var i=0;i<spanElements.length;i++){ var classSpan = spanElements[i].className; if (classSpan == "leNombre"){ /* on test pour trouver le bon span */ spanElements[i].replaceChild(newSpan.cloneNode(false),spanElements[i].firstChild); /* et là on remplace le firstChild (le texte) de spanElements[i] ( le span contenant l'ancien nombre ) par un clone de newSpan (celui créer juste au dessus contenant le nouveau nombre */ } } } </script> voici maintenant incrementation.php : <?php header("Content-type: text/javascript"); $nombre=$bdd->query('SELECT nombre FROM nombre'); $nombre=$nombre->fetch(); $newNombre=$nombre['nombre']+1; //on récupère le nombre $nombre->closecursor(); $upNbr=$bdd->prepare('UPDATE nombre SET nombre = :newNombre'); $upNbr->execute(array('newNombre'=>$newNombre)); $upNbr->closecursor(); // on l'incrémente ?> refreshNombre(<?php echo $newNombre ?>); /* on execute enfin la dernière fonction de index.php qui va se charger de rafraichir le nombre sur la page, il n'y à eu aucun reload de la part du navigateur ! */ Si les commentaires ne sont pas assez explicatifs dites-le moi ! je me ferais un plaisir de détailler tout ça ! Bien, si vous avez compris l'idée de l'appel d'une page externe via JS pour exécuter un code php sans reload de page, vous avez tout compris. Mais pour exploiter pleinement la puissance du DSL et de la BDD, il nous faudrait avoir plusieurs bouton et nombres dynamiques. Pour cela il suffirait d'envoyer au script incrementation.php une id afin de transformer la requête SQL en : $upNbr=$bdd->prepare('UPDATE nombre SET nombre = :newNombre' WHERE id= :id); $upNbr->execute(array('newNombre'=>$newNombre, 'id'=>$_GET['id'])); $upNbr->closecursor(); et on change la fonction refresh pour qu'elle contienne un paramètre en plus : l'id function refreshNombre(id,newNombre){ var spanElements = document.getElementsByTagName('span'); var newSpan = document.createTextNode(' ' + newNombre + ' '); for (var i=0;i<spanElements.length;i++){ var classSpan = spanElements[i].className; var idSpan = classSpan.substring(classSpan.lastIndexOf('a')+1); if (idSpan == id){ spanElements[i].replaceChild(newNombre.cloneNode(false),spanElements[i].firstChild); } } } avec son appel : refreshNombre(<?php echo $_GET['id']; ?>,<?php echo $newNombre; ?>); Avez-vous vu la subtilité du : var idSpan = classSpan.substring(classSpan.lastIndexOf('a')+1); ? En fait, en HTML il est impossible de mettre un nom de class commençant par un chiffre... du coup, on met un "a" devant et on utilise "substring" pour découper ce "a" on prend la dernière apparition de "a" et on ajoute 1 au rang, il ne nous reste plus que l'id ! celui-ci est donc afficher sur index.php comme ceci : <span class="a<?php echo $nombre['id'];?>"> <?php echo $nombre['nombre']; ?> </span> bien sûr la requere SQL change légèrement : SELECT * FROM nombre Voilà voilà ! DSL dans toute sa grandeur ! Si vous avez des questions n'hésitez pas !
  10. Bonjour à tous, Je vais vous partagez un bout de code (que vous pouvez transformer en fonction) assez utile pour faire des requêtes POST (non pas avec du html) tout en PHP <3 à quoi ça sert? quand vous désirez faire un système distant un peu sécurisé ou quand quelqu'un vous ennuie et qu'il n'a pas d'anti-robot sur sa page d'inscription... /* Contexte: ayant bricolé un serveur apache et installé PHP avec beaucoup de mal vous n'arrivez pas à installer un serveur SMTP (gestion d'envoie et de réception d'email). Alors pour pallier à ce problème vous utilisez un script distant sur un ftp ayant un serveur smtp vous devez effectuer une requête POST avec des variable: l'espéditeur, le destinataire, le sujet ($sujet), le contenu ($content) et une clé de sécurité. le serveur répond "OK" si l'envoie c'est fait, on récupère la réponse dans la variable $result */ $data = array( 'exp' => "[email protected]", // expéditeur 'dest' => "[email protected]", // destinataire 'subject' => $sujet, // sujet 'content' => $content, // contenu du mail 'key' => 0258410025412002541200255210 // clé de sécurité ); $url = "http://mars073.be/smtp.phps"; // url sur la quelle il faut envoyer la requête $data_url = http_build_query($data); $data_len = strlen($data_url); $x = array ('content'=>file_get_contents ($url, false, stream_context_create (array ('http'=>array ('method'=>'POST', 'header'=>"Connection: close\r\nContent-Type: application/x-www-form-urlencoded\r\n". "Content-Length: $data_len\r\n", 'content'=>$data_url)))), 'headers'=>$http_response_header ); $result = $x['content']; if ($result == "OK") { echo "L'envoie a été un succés."; } else { echo "t'as foiré #YOLO."; } Bonne programmation à tous! Cordialement, Mars073
  11. Bonjour PHP 7 sera là pour Novembre 2015 selon les informations officiels ! (non pas de 6 ) PHP sera évidemment plus rapide : une refonte, une optimisation et un nettoyage du code de base de PHP aura lieu. Pourquoi PHP 7 et pas 6 ? Tout simplement pour ne pas prêter confusion avec la nouvelle version créée en 2005 qui avait pour nom...je vous le donne en mille, PHP 6. Mais ce projet fut abandonné en 2010. Et aussi car beaucoup sont septiques au nombre 6 (comme certains pour le Vendredi 13...) vu que de nombreux langages ont vu leur version 6 tombés à l'eau ou n'ont jamais été publiés. J'aimerai bien vous faire part de plus d'informations sur les nouveautés mais...je n'ai pas trouvé grand chose sur les nouveautés, il est sans doutes trop tôt. (dites moi si vous avec des caractéristiques techniques ! )
  12. Sublime Text Aujourd'hui, je viens vous présenter le logiciel par excellence pour développer en HTML / CSS ou même dans quasiment tout les autres langages ne nécessitant pas de compilation (essentiellement du web) : Sublime Text. Liens : http://www.sublimetext.com/ Téléchargement : Sublime Text 3 is currently in beta. The latest build is 3059.OS X (10.7 or later is required)Windows - also available as a portable versionWindows 64 bit - also available as a portable versionUbuntu 64 bit - also available as a tarball for other Linux distributions.Ubuntu 32 bit - also available as a tarball for other Linux distributions. Il n'y a pas grand chose à dire non plus sur ce logiciel, à part que l'essayer c'est l'adopter. Il y a une version payante du logiciel, je n'ai cependant jamais compris à quoi sert-elle puisque la version gratuite dispose de toute les fonctionnalités de manière illimité dans le temps (à part un popup qui apparait toutes les 10 à 15 sauvegardes de fichiers, pour vous demander si vous voulez acheter la license). Quelques screenshots : C'est le logiciel que j'utilise personnellement pour tout mes projets web et je le recommande à tout le monde.
  13. mars073

    Des bouts de code

    Bonjour à tous, Je fais ce topic pour tout les petits codes pour éviter de faire plein de topic, si vous avez besoin de quelque chose en php vous le dites et je l'ajoute 1. Tester si un port est ouvert: -> fsockopen if (@fsockopen("127.0.0.1", 80, $errno, $errstr, 1) { // port ouvert } #en compact echo (@fsockopen("127.0.0.1", 80, $errno, $errstr, 1))? "En ligne":"Hors-ligne"; [/php] Notes: - le @ empêche de faire apparaître une erreur si une erreur est rencontré; "127.0.0.1" est à remplacer par l'ip ou le domaine; 80 est à remplacer par le port; $errno et $errstr servent à récupérer l'erreur mais je les mets que pour utiliser le paramètre suivant; 1 est le temps maximum pour que le serveur réponde en seconde (un serveur actuellement prend 0.002sec pour faire un ping à l'opposé du monde en moyen). 2. Vérification de base pour un include 3. Afficher le visage d'un skin minecraft à partir du nom de compte et d'une dimension(optionnel) header('Pragma: public'); header('Cache-Control: max-age=86400'); header('Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + 86400)); header("Content-type: image/png"); $size = (isset($_GET['size'])&&is_numeric($_GET['size'])&& $_GET['size']<=128&&$_GET['size']>=8) ? $_GET['size'] : 64; $name = (isset($_GET['name'])) ? $_GET['name'] : "char"; $img = imagecreate($size, $size); $src = @imagecreatefrompng("http://minecraft.net/skin/{$name}.png"); if(!$src){ $src = @imagecreatefrompng("http://www.minecraft.net/skin/char.png"); } imagecopyresized($img, $src, 0, 0, 8, 8, $size, $size, 8, 8); imagepng($img); imagedestroy($img); imagedestroy($src); Notes: - les paramètres (nom et dimension) sont dans l'url (donc en $_GET) la dimension reste carré est s'exprimer à l'aide d'un entier de 8 à 128, si l'utilisateur s'appel "Mars075" et que que l'on veut d'une taille de 32px sur 32px l'url ressemblera à "head.php?name=Mars075&size=32". Si le nom n'est pas spécifié ou si le compte "officiel" n'a pas de skin correspondant le skin par défaut est affiche, si aucune taille n'est spécifiée la taille par défaut est de 64pixels, le site pour les apparences étant assez lent les images sont mises en cache pendant 24 heures (86400 secondes). 4. Ma fonction pour charger une image $_FILES sans se soucier de tout les imagecreatefrom* function imagecreatefromfile($file) { $func = "imagecreatefrom".substr($file['name'], strrpos($file['name'], ".")+1); $func = stri_replace(array("jpg", "jpe"), "jpeg", $func); return (function_exists($func)) ? $func($file['tmp_name']) : false; } défaut principal: ne fonctionne pas avec imaged2part mais bon suffit de modifier un peu pour ceux qui l'utilise
  14. Tout d'abord vous devez posséder un distribution de Linux. Par ailleurs, les scripts contenus dans ce tutoriel sont compatibles avec Debian et ses dérivés. Installation d'un serveur web avec PHP : Le script ci-dessous va vous installer un serveur web avec PHP : #!/bin/sh #Installation d'Apache2 et de PHP5 sudo apt-get update sudo apt-get install apache2 sudo apt-get install php5 libapache2-mod-php5 #On redémarre Apache2 sudo /etc/init.d/apache2 restart A cette étape, quand vous allez sur votre site vous devriez voir une page blanche ou non apparaitre. Vous pouvez désormais modifier votre site web contenu dans le dossier /var/www/ à votre guise. Optimiser son site avec une base de données : Si vous avez besoin d'une base de données, vous pouvez installer MySQL : sudo apt-get install mysql-server Pour pouvoir accéder à vos bases de données depuis un autre ordinateur, vous devez modifier la variable bind-address dans le fichier /etc/mysql/my.cnf par l'IP de votre machine. Pour plus de sécurité, il est vivement recommandé de définir un mot de passe à l'utilisateur root. Dans votre terminal, exécutez la commande suivante : mysql -u root Vous entrez dans la console de votre serveur MySQL et tapez la commande suivante : SET PASSWORD FOR 'root'@'localhost' = PASSWORD('yourpassword'); Ceci étant fait, il nous maintenant configurer Apache2 et PHP pour qu'ils puissent utiliser le serveur MySQL.Exécutez donc la commande suivante : sudo apt-get install libapache2-mod-auth-mysql php5-mysql Puis dans le fichier /etc/php5/apache2/php.ini, changez la ligne ";extension=mysql.so" par "extension=mysql.so". Ensuite, redémarrez votre serveur Apache2. Le firewall : On va maintenant protéger notre serveur avec iptables. Installez donc ce paquet avec la commande suivante : sudo apt-get install iptables Pour gagner du temps, je vais vous fournir un petit script qui va bloquer tous les paquets entrant (sauf ceux qu'on aura ajouter à notre liste blanche) que vous devrez placer dans le fichier /etc/init.d/firewall : #!/bin/sh # Réinitialise les règles sudo iptables -t filter -F sudo iptables -t filter -X # Controle du trafic sudo iptables -t filter -P INPUT DROP sudo iptables -t filter -P FORWARD ACCEPT sudo iptables -t filter -P OUTPUT ACCEPT # Autorise les connexions déjà établies et localhost sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -t filter -A INPUT -i lo -j ACCEPT sudo iptables -t filter -A OUTPUT -o lo -j ACCEPT # ICMP (Ping) sudo iptables -t filter -A INPUT -p icmp -j ACCEPT # SSH sudo iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # HTTP / HTTPS sudo iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT # MySQL (Attention a bien gérer vos acces) sudo iptables -t filter -A INPUT -p tcp --dport 3306 -j ACCEPT Rendez ce script exécutable : sudo chmod +x /etc/init.d/firewall Puis indiquer à votre machine de l'utiliser au démarrage : sudo update-rc.d firewall defaults Plus d'informations sur iptables sur la doc ubuntu.
  15. Bonjour à tous, Aujourd’hui je vais vous montrer comment coder un moteur de recherche de base, vous pouvez donc aussi bien améliorer la structure de vos tables que la condition de recherche elle même. Contexte: Le moteur de recherche sert à trouver un joueur et afficher ses statistiques. Structure table: CREATE TABLE `players` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `guild` text NOT NULL, `token` int(11) NOT NULL, PRIMARY KEY (`id`) ) AUTO_INCREMENT=1 ; Le formulaire de recherche (search.php): <form action="./search.php" method="GET"> <label for="name">Nom du joueur</label> <input type="text" name="name"> <input type="submit" value="Rechercher"> </form> Je ne m'attarde pas sur le html vu que c'est un tuto php/my-sql. à la suite du code html vous allons ajouter du php: <table width="100%"> <tr> <th>#</th> <th>Nom</th> <th>Points</th> </tr> <?php $page = 0; if (isset($_GET['name']) { $page = 1; // Page par défaut affichée $np_page = 25; // Nom de résultat par page $name = addslashes($_GET['name']); // suppression faille sql $icxn = mysqli_connect("127.0.0.1", "root", "toor", "game"); //connexion mySQLi // vérification du numéro de la page si elle est indiqué dans l'url en "?page=n" if (isset($_GET['page'])&&is_numeric($_GET['page'])&& $_GET['page']>0&&$_GET['page']<9999999) $page = $_GET['page']; $fourchette = ($page - 1) * $np_page; $iquery = mysqli_query($icxn, "SELECT * FROM `players` WHERE `name` LIKE '%$name%' ORDER BY `name` ASC LIMIT $fourchette, $np_page"); while ($char = mysqli_fetch_array($iquery)) { echo <<<LINE <tr> <td>{$char['id']}</td> <td><b>{$char['name']}</b></td> <td>{$char['token']}</td> </tr> LINE; } } ?> </table> <?php if ($page!=0) { echo "page(s): "; $iquery_count = mysqli_query($icxn, "SELECT * FROM `players` WHERE `name` LIKE '%$name%'"); $count = mysqli_nums_rows($iquery_count); for ($i = 1; $i < $count/$np_page; $i++) { echo '<a href="./search.php?page='.$i.'">'.$i.'</a>&nbsp;'; } } ?> Conseil pour améliorer: -Si la table est beaucoup avec votre moteur faite une colonne de plus où il y a une simplification des caractères (ex: "é" => "e"; "â" => "a"; etc). -Attention aux caractères html utilisiez la fonction strip_tag() ou autre sur ce qui causer des faille xss par exemple si le client peu choisir le nom de son personnage et mettre du code html dedans c'est mort. -Supprimez les caractères "%" et "_" si ils sont présent dans $name et instauré une limite au niveau du nombre de caractères pour la recherche exemple: minimum 4 caractères, pour évites de charger trop de chose. Version pdo pour les gens qui aiment la pdo: <table width="100%"> <tr> <th>#</th> <th>Nom</th> <th>Points</th> </tr> <?php $page = 0; if (isset($_GET['name']) { $page = 1; // Page par défaut affichée $np_page = 25; // Nom de résultat par page $name = $_GET['name']; $cxn = new PDO('mysql:host=127.0.0.1;dbname=game', 'root', 'toor'); //connexion mySQL // vérification du numéro de la page si elle est indiqué dans l'url en "?page=n" if (isset($_GET['page'])&&is_numeric($_GET['page'])&& $_GET['page']>0&&$_GET['page']<9999999) $page = $_GET['page']; $fourchette = ($page - 1) * $np_page; $query = $cxn->prepare("SELECT * FROM players` WHERE `name` LIKE '%:name%' ORDER BY `name` ASC LIMIT :fourchette, :npp"); $query->bindValue(':name', $name, PDO::PARAM_STR); $query->bindValue(':fourchette', $fourchette, PDO::PARAM_INT); $query->bindValue(':npp', $np_page, PDO::PARAM_INT); $query->execute(); while ($char = $query->fetch()) { echo <<<LINE <tr> <td>{$char['id']}</td> <td><b>{$char['name']}</b></td> <td>{$char['token']}</td> </tr> LINE; } } ?> </table> <?php if ($page!=0) { echo "page(s): "; $query_count = $cxn->prepare("SELECT * FROM `players` WHERE `name` LIKE '%:name%'"); $query_count->bindValue(':name', $name, PDO::PARAM_STR); $query_count->execute(); $count = $query_count->rowCount(); for ($i = 1; $i < $count/$np_page; $i++) { echo '<a href="./search.php?page='.$i.'">'.$i.'</a>&nbsp;'; } } ?> Bonne programmation à tous! Cordialement, Mars073
  16. Bonjour à tous, Aujourd'hui je fais essayer de faire un truc plus sérieux, les failles les plus courantes (sql, xss, csrf et exploit cookie). Les failles SQL, c'est le fait que le client peut modifier une requête sql sur vote site, ses failles peuvent permettent de modifier, afficher, supprimer toutes les tables voir la base de donnée. Contexte: J'affiche mes news avec une variable ?page dans l'url <?php $query = mysql_query("SELECT * FROM `news` LIMIT ".$_GET['page'].",10"); ?> normalement l'url va ressemble à: http://mars073.be/faille.php?page=2 .mais si quelqu'un écrit : http://mars073.be/faille.php?page=2;TRUNCATE%20`news`# bah... vous perdez toutes vos news, la requête sera double: SELECT * FROM `news` LIMIT 2; TRUNCATE `news`; #,10 il existe des programmes pour exploiter plus facilement les failles ils permettent aussi de lister les autres tables ._. solution: 1 - vérifier que la variable est un chiffre (numérique); <?php $page = 0; if (isset($_GET['page'])&&is_numeric($_GET['page'])) $page = $_GET['page']; $query = mysql_query("SELECT * FROM `news` LIMIT $page,10"); ?> étrangement cette erreur est très fréquente encore... mais bon parfois y a un pare-feu derrière et c'est pas marrant 2-dans le cadre où il s'agit d'un texte faites appel à la fonction: addslashes(). Exemple: $titre = addslashes($_GET['titre']); 3-Simplement coder en pdo mais ça peut-être dérangeant quand vous n'avez pas codé le site et que vous devez donc tout refaire... Les failles xss, aussi très courantes c'est une faille qui permet au client d'afficher du code html ou javascript, ce qui permet de faire des forkbomb, redirections, voler les logins, etc. Contexte: je débute et j'ai fais une chatbox avec une faille xss: <?php $query = $cxn->query("SELECT * FROM `chat`"); $query->execute(); while ($msg = $query->fetch()) { echo $msg['user']." a dit:".$msg['content']; } ?> maintenant Jean-Kevin envoie le message suivant: <meta http-equiv="refresh" content="0;url=http://JeanKevdu06.free.fr/"> ce qui aura pour effet de rediriger une fois la page charger sur un autre site. pour pallier à ce problème il suffit de faire appel à une fonction: htmlspecialchars(), il existe d'autre fonction avec plus où moins le même effet, c'est à dire convertir le code en caractère lisible. exemple avec le code au dessus: <?php $query = $cxn->query("SELECT * FROM `chat`"); $query->execute(); while ($msg = $query->fetch()) { $msg['content'] = htmlspecialchars($msg['content']); // Dans le contexte le nom d'utilisateur ne peut pas comporter de caractères spéciaux. echo $msg['user']." a dit:".$msg['content']; } ?> je considère les failles "include" comme des failles xss mais si c'est pas totalement vrai, je suppose que vous connaissez tous la fonction include(), vu que c'est la base du php... Bref beaucoup de site utile utilise une variable $_GET (ex: $_GET['p']) et donc il font un code du genre: <?php if (isset($_GET['p'])&&is_file($_GET['p'])) include("pages/".$_GET['p'].".php"); ?> mais bon une fois de plus si le méchant utilisateur change l'url: en ?p=../includes/config bah... ça inclue le fichier config ._.il y a beaucoup de façon différente pour résoudre cette faille mais dans le contexte ej vais utiliser le switch() <?php if (isset($_GET['p'])) { //on test si la page est spécifiée switch (strtolower($_GET['p'])) { // test la valeur de la variable en minuscule pour avoir plus facile case 'home': include("pages/home.php"); //l'acccueil break; case 'contact': include("pages/contact.php"); break; case 'machin': include("pages/machin.php"); // machin break; default: include("pages/404.php"); //page d'erreur } } else { include("pages/home.php"); //si aucune page spécifiée on met l'accueil } ?> Les failles csrf, déjà plus rare, ça consiste dans le faire exécuter par le biais d'une image comme une signature sur un forum, je vais prendre pour exemple un forum.Contexte: Je fais une signature qui va vous déconnecter automatiquement quand vous l'afficherait: je mets le lien pour se déconnecter comme le lien d'une image. [img=http://forum.mars073.be/deconnect.php] Dans ce cas ci il faut utiliser un token, c'est une variable qui va contenir une suite aléatoire.Exemple dans votre script de connexion vous allez surement utiliser des variables $_SESSION, donc il suffit d'ajouter dans votre script de connexion: <?php // ... $_SESSION['token'] = dechex(rand(0, 999999))."-".dechex(rand(0, 999999)); ?> votre bouton déconnexion: <a href="deconnect.php?t=<?=$_SESSION['token']?>">Déconnexion</a> et le script deconnect.php: <?php session_start(); if (isset($_GET['t'])&&$_GET['t']==$_SESSION['token']) { session_unset(); session_destroy(); echo "Vous avez bien été déconnecté"; } else { echo "La requête est incorrect"; } ?> Le forum Melinyel a un système similaire mais en plus n'autorise que certaines extensions mais le systèmes d'extension ne sert à rien vu qu'il peut être trompé avec le ".htaccess". Nous arrivons donc au dernier type de faille les voles de cookies, miam miam... Contexte: mon script php camouflé en "cookie.png" doit voler le cookie du nom de "autolog" qui permet que le compte se connecter automatiquement. /!\Rappel: le cookie est stocké du coté client il y a un risque de modification, donc cryptait le un maximum pour pas qu'il puisse détourner sa connexion sur un autre compte, comme pour les variables caché html ou js. donc nous allons créer votre cookie avec une protection correcte: $crypt = $user['id']."|".md5(sha1($user['name']).$user['haspass']); setcookie( "autolog", $crypt, time()+60*60*24*31, "./marsLogin", "mars073.be", false, true); donc $crypt dans mon exemple est composé de l'id de l'utilisateur et le cumule crypté du nom d’utilisateur crypté et de son mot de passe crypté, même crypté normalement on ne met pas le mot de passe dans le cookie je dis bien normalement.paramètres de mon cookie: 1 - Son nom: "autolog" 2 - sa valeur: $crypt 3 - sa date d'expiration en seconde: 31jours après création 4 - dossier ou je vais le ranger 5 - le seul site (domaine) qui a le droit d'y accéder: "mars073.be" 6 - si le cookie ne peut être utilisé que par des site en https:// : non (si votre site à le https:// mettez "true" si vous voulez) 7 - Interdit la modification du cookie par du javascript par exemple (ne fonctionne pas tout le temps). mais comment faire maintenant pour vérifier l'utilisateur? Comme ça: <?php if (isset($_COOKIE['autolog'])) { $data = explode("|", $_COOKIE['autolog']; // On sépare l'id du reste if (isset($data[1])&&is_numeric($data[0])) { // On vérifie la structure du cookie $query = $db->query("SELECT * FROM `user` WHERE `id` = ".$data[0]." LIMIT 1"); $query->execute(); $user = $query->fetch(); if ($data[1] == md5(sha1($user['name']).$user['haspass'])) { $_SESSION['login'] = $user; echo "Connexion réussite"; } else { echo "cookie incorrect"; } } else { echo "Cookie corrumpue"; } } ?> Je pense avoir fait le tour des trucs les plus courant en php... ps: exemple d'image en php qui passe à travers le filtre du forum avec un simple dossier, quand vous actualisez elle change: Bonne programmation à tous! Cordialement, Mars073
  17. Bonjour à tous, J'ai fais un topic sur la création d'image et la sécu, et j'ai eu aucun commentaire :E mais bon là je vais faire un mélange des 2 je vais vous expliquer comment faire une captcha de base. Pour ceux qui ne qui n'ont jamais entendu parler des captcha, et non chapka (le chapeau russe), c'est le plus nouveau une suite de chiffre ou/et de lettre qu'il faut recopier lorsque l'on inscrit ou que l'on fait appel à un service sur un site. Contexte: On doit généré un code qui fait entre 3 et 5 caractères alphanumérique en majuscule sauf 0 (car c'est lourd mélanger le O et le 0). <?php $chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible $code = ""; $code_len = rand(3, 5); // longueur de code aléatoire for ($i = 0; $i < $code_len; $i++) { $code .= $chars[rand(0, strlen($chars)-1)]; // ajout d'un caractère au hasard } echo $code; ?> maintenant on génère un image avec: <?php header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD) header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache header('Cache-Control: post-check=0, pre-check=0', false); // même chose header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots... $img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut imagefill($img, 0, 0, 0xFFFFFF); // la couleur de fond est blanc dans ce cas-ci $chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible $code = ""; $code_len = rand(3, 5); // longueur de code aléatoire for ($i = 0; $i < $code_len; $i++) { $code .= $chars[rand(0, strlen($chars)-1)]; // ajout d'un caractère au hasard } imagestring($img, 5, 20, 10, $code, 0x000000); imagepng($img); imagedestroy($img); ?> rendu: fonction non-vu dans mon autre topic: - imagecratetruecolor() crée une image avec toute les couleurs (+16 million). - imagefill() ça vous permet de remplir votre image d'une certaine couleur. - imagestring() écrire un simple texte sur l'image. 0x000000 est l'équivalent du code couleur hexadécimal #000000 le système souvent utilisé en html, css, lua, etc. Normalement on utilise une variable (car les couleurs ne sont pas correctes de mémoire) le code pour le remplissage aurait donc due être: <?php $blanc = imagecolorallocate($img, 255, 255, 255); imagefill($img, 0, 0, $blanc); // la couleur de fond est blanc dans ce cas-ci ?> la fonction imagecolorallocate() permet de déclarer une couleur en peu comme en css avec par exemple: "rgb( 255, 255, 255);". une image php peut se mettre au même titre que n'importe quelle image dans un code html: <!-- Contexte: L'image php s'appel "captcha.php" et se trouve dans le même dossier que le code html --> <img src="captcha.php" border="0"> <input type="text" name="antirobot" placeholder="Recopier le code..."> Mais comment on fait pour connaître code après? simplement avec une variable $_SESSION et au passage on va ajouter entre 2 et 6 lignes en arrière-plan. <?php session_start(); header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD) header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache header('Cache-Control: post-check=0, pre-check=0', false); // même chose header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots... $img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut imagefill($img, 0, 0, 0xFFFFFF); // la couleur de fond et blanc dans ce cas-ci $chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible $code = ""; $code_len = rand(3, 5); // longueur de code aléatoire $line_n = rand(2, 6); // nombre de ligne aléatoire entre 2 et 6 for ($i=0; $i < $line_n; $i++) { // position du point de départ et de fin de la ligne au hasard imageline($img, rand(1, imagesx($img)), rand(1, imagesy($img)), rand(1, imagesx($img)), rand(1, imagesy($img)), 0x000000); } for ($i = 0; $i < $code_len; $i++) { $code .= $chars[rand(0, strlen($chars)-1)]; // ajout d'un caractère au hasard } $_SESSION['code'] = $code; imagestring($img, 5, 20, 10, $code, 0x000000); imagepng($img); imagedestroy($img) ?> fonctions: - imageline() tracer une ligne sur une image avec un point de départ et un point de fin. - imagesx() retourne la largeur de l'image. - imagesy() retourne la hauteur de l'image. Protégé contre les robots? haha t'es marrant, je te tuerais en dernier. En faite il est extrêmement compliqué... enfin les vrai robot pas les trucs en mousse codé en javascript ou en vb. maintenant on va faire en sorte que les lettres soient positionnées un peu aléatoirement: <?php session_start(); header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD) header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache header('Cache-Control: post-check=0, pre-check=0', false); // même chose header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots... $img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut imagefill($img, 0, 0, 0xFFFFFF); // la couleur de fond et blanc dans ce cas-ci $chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible $code = ""; $code_len = rand(3, 5); // longueur de code aléatoire $line_n = rand(2, 6); // nombre de ligne aléatoire entre 2 et 6 for ($i=0; $i < $line_n; $i++) { // position du point de départ et de fin de la ligne au hasard imageline($img, rand(1, imagesx($img)), rand(1, imagesy($img)), rand(1, imagesx($img)), rand(1, imagesy($img)), 0x000000); } for ($i = 0; $i < $code_len; $i++) { $char = $chars[rand(0, strlen($chars)-1)]; // un caractère au hasard $code .= $char; // ajout du catactère imagestring($img, 5, 20+($i*12)+rand(-2, 2), 10+rand(-10, 5), $char, 0x000000); } $_SESSION['code'] = $code; imagepng($img); imagedestroy($img) ?> maintenant on va mettre des couleurs et flouter l'image avec une matrix: <?php session_start(); header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD) header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache header('Cache-Control: post-check=0, pre-check=0', false); // même chose header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots... $img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut imagefill($img, 0, 0, 0xA3A3A3); // la couleur de fond et blanc dans ce cas-ci $chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible $code = ""; $code_len = rand(3, 5); // longueur de code aléatoire $line_n = rand(2, 6); // nombre de ligne aléatoire entre 2 et 6 for ($i=0; $i < $line_n; $i++) { // position du point de départ et de fin de la ligne au hasard imageline($img, rand(1, imagesx($img)), rand(1, imagesy($img)), rand(1, imagesx($img)), rand(1, imagesy($img)), "0x".dechex(rand(20, 200)).dechex(rand(20, 200)).dechex(rand(20, 200))); } for ($i = 0; $i < $code_len; $i++) { $char = $chars[rand(0, strlen($chars)-1)]; // un caractère au hasard $code .= $char; // ajout du catactère imagestring($img, 5, 20+($i*12)+rand(-2, 2), 10+rand(-10, 5), $char, "0x".dechex(rand(180, 255)).dechex(rand(180, 255)).dechex(rand(180, 255))); } $_SESSION['code'] = $code; $flou = array( array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0) ); imageconvolution($img, $flou, 16, 0); imagepng($img); imagedestroy($img) ?> ps: la fonction dechex() permet de transformer un chiffre décimal en hexadécimale pour le code couleur. et donc le test de la captcha en requête POST (par exemple) donnerait: <?php session_start(); if (isset($_POST['antirobot'])) { if ($_POST['antirobot']==$_SESSION['code']) { echo "Le code est valide"; } else { echo "Le code est incorrect"; } } ?> Rendu final: moche et compliqué à lire, c'est ça le principe? non à vous de modifier Bonne programmation à tous! Cordialement, Mars073
  18. Bonjour all, Je vais vous expliquer comment générer une image en php. je vais partir directement sur un exemple assez complexe vous allons nous baser sur l'image suivante (j'avais bien commencé mais bon j'avais la flemme donc j'ai fais un arbre vite fait avec un quadrillage dégeu au dessus trop chiant dessiner à la souris rip mon stylet et un petit personnage très mystérieux et donc dans cet exemple nous allons positionner un personnage sur le quadrillage le coté le plus à gauche est le point d'origine (0, 0). contexte: vous avez votre bonhomme à déplacer sur le quadrillage grace à une variable $x et $y que l'on dans l'url ($_GET) et vous devez conserver la transparence des 2 images. <?php $x = $y = 0; // on initialise la variable $x et $y à zéro // on test l'existant de ?x et ?y dans l'url et si ils sont compris entre 0 et 6 if (isset($_GET['x'])&&is_numeric($_GET['x'])&& $_GET['x']>=0&&$_GET['x']<=6) $x = $_GET['x']; if (isset($_GET['y'])&&is_numeric($_GET['y'])&& $_GET['y']>=0&&$_GET['y']<=6) $y = $_GET['y']; // on spécifie le type MIME, c'est à dire que le script php va se faire passer pour un autre type de fichier si vous ne mettez pas ça en accédant à la page vous aurez exactement le même résultat que lorsque voys ouvrez l'image avec bloc note header('Content-Type: image/png'); $map = imagecreatefrompng("island_air.png"); // on charge l'île volante $char = imagecreatefrompng("char.png"); // on charge le bonhomme mystèrieux // on copie l'image du petit bonhomme et on la colle sur le terrain avec la position relative imagecopy($map, $char, (210 + ($x * 12) + ($y * 13)), 140 + ($y * 14) - ($x * 10), 0, 0, 23, 43); // on conserve le canal alpha, c'est à dire la transparence imagealphablending($map, false); imagesavealpha($map, true); // on fait le rendu de l'image dans le format MIME imagepng($map); // on supprime les calques que l'on a fait (pour vider la mémoire) imagedestroy($map); imagedestroy($char); ?> donc en récapitulatif vous devez: -choisir le type MIME (format de rendu) [liste utile] -créer à calque à partir d'une image même si elle est distante (ex: imagecreatefromjpeg("http://picture.com/A0001.jpg")) ou vous pouvez créer un calque vide aux dimensions désirées (exemple: imagecreate(600, 400), pour créer une image de 600px de large et 400px de haut). -faire un rendu dans le format que vous aviez choisis (ex: imagejpeg($image)) si vous désirez enregistrer votre rendu vous pouvez le faire directement par exemple en rendu jpg ou jpeg vous ajoutez simplement un paramètre avec le nom de destination exemple: <?php imagejpeg($image, "rendu.jpg"); // vous pouvez aussi choisir la qualité en ajoutant un troisième paramètre de 0 à 100 ou de 0 à 75 selon le format imagejpeg($image, "rendu.jpg", 45); // vous pouvez aussi choisir le rendu sans enregistrer en remplacant la destination par NULL: imagejpeg($image, NULL, 45); ?> > documentation php si vous avez eu du mal à comprendre la syntaxe de image copie de vous invite à Cliquer ici. Si vous desiez vous pouvez rendre moins mystérieux le bonhomme on lui mettant un nom au dessus de sa tête avec la fonction imagestring(); ça vous fera un petit exercice Bonne programmation à tous! Cordialement, Mars073
  19. Shalut all, Je vais vous expliquer comment faire des tests et c'est super simple Il y a juste plein de façon de le faire! xD Pour faire un test simple, on fait comme ceci: If ([valeur à tester] [symbôle du test (voir le bas)] [La valeur à la quelle elle est comparée]) { [Le code à exécuter si le test se révèle positif]; } exemple: If ($check == true) { include("W\tourbilol.php"); } // ou If ($check == true): include("W\tourbilol.php"); endif; // ou If ($check == true) { include("W\tourbilol.php"); } // ou If ($check == true) {include("W\tourbilol.php");} // ou If ($check == true) include("W\tourbilol.php"); // Ces systaxes ont exactement le même effet // version courte souvent utilisée dans la syntaxe: <?=([condition]) ? 'oui' : 'non'?> : include ($check == true) ? "W\tourbilol.php" : "W\tourbilol_v2.php"; Imaginons que nous programmons un jeu et que vous voulons tester la position_X soit 3 et que le position_Y soit 5 on va faire comme cela: If (($position_X=3) AND ($position_Y=5)) { [Le code à exécuter si le test se révèle positif]; } // ou If (($position_X=3) && ($position_Y=5)) { [Le code à exécuter si le test se révèle positif]; } Il suffit juste de mettre les 2valeurs entre parenthèse et de mettre un "And"(et) ou "&&" entre les deux.^^ Toujours facile.. alors on va compliquer les choses x) Imaginons toujours notre petit jeux, cette fois je veux que la position_X soit 3 ou 5 et que que la position_Y soit 5 toujours simple mais bon : If ((($position_X=3) OR ($position_X=5)) AND ($position_Y=5)) { [Le code à exécuter si le test se révèle positif]; } // ou If ((($position_X=3) || ($position_X=5)) && ($position_Y=5)) { [Le code à exécuter si le test se révèle positif]; } on ajoute encore des parenthèses et on met un "Or"(ou) ou "||" même principe que le "And" On monte encore un peu dans la difficulté Cette fois la position_X doit être compris entre 3 et 5 et la position_Y doit doit être 5. è_é If ((($position_X>3) AND ($position_X<5)) && ($position_Y==5)) { [Le code à exécuter si le test se révèle positif]; } Cette fois le test demande si le nombre est supérieur et si il est inférieur ^^ Maintenant on va demander que si number est 1 il envoie un message "c'est 1!"; si c'est 2 un message "c'est deux" et si ce n'est pas un des deux, le programme envoie un message "chiffre inconnu", et pour cela on va mettre un "ElseIf": If (number==1) { echo "c'est 1!"; } ElseIf (number==2) { echo "c'est 2!"; } Else { echo "chiffre inconnu"; } Il existe aussi la méthode du "Case Of" ou plus communément appellé "Switch()" en PHP: Switch (number) { Case 1: echo "c'est 1!"; break; // Important! Il faut mettre un "break;" à la fin du code à exécuter si la condition est remplie. Case 2: echo "c'est deux!"; break; Case 3: Case 4: echo "c'est trois ou quatre!"; Break; Default: // Équivalent d'un "Else" echo "chiffre inconnu"; } Les symboles de test === : est égale exactement... (le plus souvent utilisé lors d'un test avec une fonction par exemple qui retourne une valeur booléen [ true ou false]) !== : n'est pas du tout commun avec ... == : égale à ... > : supérieur à ... < : inférieur à ... >= : supérieur ou égale à... <= : inférieur ou égale à... != : n'est pas égale à... Fonction utile: empty et isset:Empty sert à tester si une valeur est vide Isset sert à tester si la variable existe (n'est pas égale à null) // On test si la variable $text est vide: if (empty($text)) {echo "Le texte est vide";} // On test si la variable id contenu dans l'url existe (ex: http://0.0.0.0/view.php?id=1234&AutreVar=0) if (isset($_GET['id'])) {echo "Article N°", $_GET['id'];} // ou aussi : if ($_GET['id']) {echo "Article N°", $_GET['id'];} test en une ligne, afficher "online" si $test = 1 et "offline" dans le cas contraire: echo ($test==1) ? "online" : "offline"; Bonne programmation à tous! Cordialement, Mars073
  20. Bonjour à tous. Aujourd'hui, je lance le premier concours de programmation, donc pas nécessairement le plus dur. C'est simple, celui-ci sera de coder un site web basique pour aider Akimace dans son projet ! Toutes les informations sont ses besoins sont ici, mais je vais détailler. Langage de programmation du projet : Web : HTML / CSS (obligatoire). PHP, SQL, Javascript et autre (facultatif). Le but est de concevoir un site web de meilleur qualité que celui-ci : Basket Club Solérien (son club de basket). La date limite est le 31 Mars 2014, 23h59. Les participants devront préciser leurs noms, s'ils veulent s'y essayer, et ceux-ci seront inscrit ci-dessus. Les récompenses seront : 20 points de réputation. Le code final sera exposé sur le GitHub de Melinyel, avec les crédits pour l'auteur. J'espère que vous saurez monter vos capacités.
  21. Bonjour, Si ça peut en intéresser quelques uns, voici un Mooc pour apprendre à concevoir son site web dynamique en PHP. Voici le lien : http://fr.openclassrooms.com/mooc/concevez-votre-site-web-avec-php-et-mysql?utm_source=Homepage-OC&utm_medium=Encart%20A%20la%20Une&utm_campaign=Encart-mooc-php Si ça peut vous donner envie... Voilà
×
×
  • Create New...