IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Mysql en mysqli. De qui se moque t'on?


Sujet :

MySQL

  1. #21
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Et voici donc... mes tout premiers pas avec mysqli:
    Qu'en pensez-vous?
    Mon code est-il propre?
    Auriez-vous des améliorations à me proposer?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php // BaseInfo.php script (mysqli/object) giving the parameter of the database connection:
    define('BaseHost', 'localhost'); define('BaseUser', 'root'); define('BasePass', ''); define('BaseName', 'olivier'); ?>

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php // index.php script (mysqli/object) recording visitors in my table "visitors" in my database "olivier":
      $VisitIp=$_SERVER['REMOTE_ADDR']; $VisitDate=date("y-m-d"); 
      $MyBase = new mysqli(BaseHost, BaseUser, BasePass, BaseName);
      if($MyBase->connect_errno > 0){die('Error:'.$MyBase->connect_error );}
      $result = $MyBase->query('SELECT * FROM visitors WHERE VisitIp="'.$VisitIp.'" AND VisitDate="'.$VisitDate.'"');
      $nb = $result->num_rows; $result->free();
      if ($nb==0) {$statement = $MyBase->prepare("INSERT INTO visitors (VisitIp, VisitDate) VALUES (?,?)");
      $statement->bind_param('ss', $VisitIp, $VisitDate);
      $statement->execute(); $MyBase->close();} ?>

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php // Stat.php script (mysqli/object) showing total amount of visitors & counting visits/day for last 2 months:
      $MyBase = new mysqli(BaseHost, BaseUser, BasePass, BaseName);
      if($MyBase->connect_errno > 0){die('Error:'.$MyBase->connect_error );}
      $result = $MyBase->query('SELECT * FROM visitors');
      $TotalVisitors = $result->num_rows; $result->free();
      echo '<h3>Total of visitors since 2013-04-16: <font color="red"><b>'.$TotalVisitors.'</b></font></h3>'; 
      $result = $MyBase->query('SELECT VisitDate, COUNT(VisitDate) AS CountRow FROM visitors GROUP BY VisitDate 
      ORDER BY VisitDate DESC LIMIT 0,60'); 
      while($row = $result->fetch_array()){ 
      echo 'Visitors on '.$row['VisitDate'].': <font color="red"><b>'.$row['CountRow'].'</b></font><br />';}
      $result->free(); $MyBase->close(); ?>

  2. #22
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Hello,

    je te suggères un IDE qui te force à respecter des règles d'indentations car ton code n'est pas maintenable dans l'état.
    - Une instruction terminant par un ; = une ligne de code.
    - Vérifie la valeur de tes variables avant de passer à la prochaine instruction (qui te garantie que $VisitIP n'est pas vide et ne casse pas la suite de ton script ?)
    - Les champs de tes requêtes devraient être entourés de ````````````` pour éviter de petits désagréments.
    - N'oublie pas de terminer une requête SQL par un ;
    - Essaie de réorganiser le code pour séparer la logique (ton code pour obtenir les résultats de base de données) de la présentation (ton affichage de résultats).
    - Au lieu d'utiliser des die() partout, trouve un moyen de ne pas tuer ton script à chaque erreur (via des exceptions non bloquantes par exemple) et signale le à l'utilisateur pour qu'il ne se retrouve pas devant une page blanche sans savoir quoi faire quand ça pète !

    Sinon, en soi, le code commence à tendre vers une solution intéressante pour du mysqli.
    Petites questions :
    - Ca fonctionne chez toi ? Tu obtiens bien les bons résultats ?
    - Comment as-tu perçu l'apprentissage de mysqli ? La courbe d'apprentissage était-elle si élevée que cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  3. #23
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Merci Zaza576 pour toutes tes suggestions mais malheureusement tu utilises bien souvent des mots que je ne comprends pas.

    Qu'est-ce une IDE?

    Tu dis que "Les champs de tes requêtes devraient être entourés de ````````````` pour éviter de petits désagréments."
    Que veux tu dire exactement? C'est quoi ces petits trucs?
    Je n'ai jamais vu ça. Je ne sais même pas où trouver ça sur mon clavier.

    Tu parles "d'exception non bloquante"... C'est quoi ça ???
    Pourrais-tu me montrer un petit exemple d'un script avec ce genre de truc?
    (Et ce n'est pas forcément vouloir le beurre et l'argent du beurre et le cul de la crémière comme on dit dans nos campagnes... )

    A part ça, oui, mon code fonctionne bien sur mon wamp et sur mon easyPHP et j'obtiens bien les résultats souhaités mais ça bug sur mon hébergeur Atspace et en attendant de comprendre, j'ai donc remis la vieille version mysql sur mon site.

    Tu me demandes:
    "Comment as-tu perçu l'apprentissage de mysqli ? La courbe d'apprentissage était-elle si élevée que cela ?"

    Oueh, je rame...
    Pas simple d'autant plus que la méthode recommandée est par objet alors que je n'y connais rien en programmation orienté objet...
    Ce qui veut dire qu'en plus d'un nouveau langage, il faut aussi une autre logique que celle procédurale qui est plus simple à visualiser puisqu'elle se déroule de manière "chronologique".
    Et voire des petits exemples m'aide beaucoup plus que de longues explications abstraites.

    Je ne suis pas un intellectuel mais un visuel... Sorry, nobody's perfect.

    Par exemple, j'aimerai beaucoup qu'on me dise quel mot décrirait le mieux le symbole "->" que je vois un peu partout en objet et qui n'existe pas en procédural.

    Merci d'avance pour tes lumières et merci aussi pour d'éventuelles autres lumières.

  4. #24
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par olivierdauxais Voir le message
    Merci Zaza576 pour toutes tes suggestions mais malheureusement tu utilises bien souvent des mots que je ne comprends pas.

    Qu'est-ce une IDE?
    Un IDE est un logiciel qui te permet principalement d'éditer ton code. Des modules sont greffés à ce logiciel pour t'offrir des fonctionnalités à appliquer à tes sources (indentation, traitement par fichier, par chaîne de caractères, ...). Disons que c'est la Rolls Royce de Vi / Emac / ... (Aïe, Aïe, je vois la manif des anciens développeurs conservateurs arriver en colère, banderolle en l'air. On ne tire pas sur une ambulance, je donne des explications simples ).


    Citation Envoyé par olivierdauxais Voir le message
    Tu dis que "Les champs de tes requêtes devraient être entourés de ````````````` pour éviter de petits désagréments."
    Que veux tu dire exactement? C'est quoi ces petits trucs?
    Je n'ai jamais vu ça. Je ne sais même pas où trouver ça sur mon clavier.
    Faisons simple :
    Tu as une requête SQL : SELECT * FROM maTable WHERE monParam1 = "Zozo" AND monParam2= $maVariablePHP;

    Cette requête SQL, quand tu vas l'utiliser dans PHP, sera sous la forme d'une chaîne de caractère. Il faudra donc dans un premier temps distinguer l'écriture statique et dynamique (variable PHP) de ta requête :

    $maRequete = "SELECT * FROM maTable WHERE monParam1 = 'Zozo' AND monParam2 = ".$maVariablePHP.";";
    /!\ Tu vois qu'ici j'ai du mettre Zozo entre simple côte pour l'inclure comme chaine de ma requête SQL dans ma chaîne PHP.
    De plus, $maVariablePHP est une variable que je concatène à ma chaîne PHP pour obtenir sa valeur.
    Enfin, je concatène le ; de ma requête SQL dans ma chaine PHP

    L'usage de ` autour du nom de chaque table ou attribut tel que ceci :
    $maRequete = "SELECT * FROM `maTable` WHERE `monParam1` = 'Zozo' AND `monParam2` = ".$maVariablePHP.";";

    permet de garantir plusieurs aspects sécuritaires lors de la création de la requête. Je n'en citerais que deux (Vous qui nous lisez, n'hésitez pas à citer ceux qui vous passe à l'esprit) :

    - si dans ta requête tu te retrouves avec deux tables différentes ayant le même nom d'attribut, il existe une parmi plusieurs syntaxes pour désigner précisément l'attribut de la table que tu souhaite :
    maTable1.monParam1
    Pour éviter toute mauvaise interprétation, que ce soit un accent dans l'un de ces noms, ou l'usage d'un caractère spécial, il est prudent d'utiliser ce caractère : ` (Touches AltGr suivie de touche 7 du clavier alphanumérique)
    - ce caractère ` se distingue facilement des simples ' et doubles " quotes.

    [QUOTE=olivierdauxais;8103801]Tu parles "d'exception non bloquante"... C'est quoi ça ???
    Pourrais-tu me montrer un petit exemple d'un script avec ce genre de truc?
    (Et ce n'est pas forcément vouloir le beurre et l'argent du beurre et le cul de la crémière comme on dit dans nos campagnes... )</QUOTE]

    Oublions un peu l'expression "Exception non bloquante" et voyons plutôt de quelle manière je vois l'usage du die().

    Si tu mêle logique et affichage, quand tu die un script, tu t'arrêtes à l'endroit où ca a été levé. Et donc ton affichage n'est pas terminé. Cela peut générer des bugs !

    Un die(MESSAGE), quand il est appelé, tue ton script PHP en affichant un MESSAGE si indiqué. Pour moi c'est un peu comme si tu te prenais une porte dans la figure. C'est en gros, j'ai levé une erreur, Vlan, je stoppe l'exécution du script à ce niveau.
    En fonction de son usage, cela peut être efficace ou pas. Ici, tu effectues une requête vers une base de données. Imagines que ta requête soit super consommatrice de mémoire ? Ton script fait un die() juste après la récupération des données de ta requête. Pan, page blanche. L'utilisateur n'a même pas de message d'erreur et ne peut pas faire un retour sur erreur. L'utilisateur agacé va relancer la requête tant qu'il ne voit pas un message plus ergonomique, moins brutal. Au bout d'un petit moment, ton serveur va clamser sous le poid des requêtes de cet utilisateur.

    Dans ta jolie interface web, avec un peu de HTML + JS + JQuery + Ajax, tu peux indiquer à l'utilisateur que son action a échoué, juste au dessus du formulaire d'action. Du genre :
    echo "Y a un problème de serveur. Reviens plus tard";
    return;

    Ce qui est moins radical que :
    die("Meurt script PHP. Ah ah ah tu ne peux plus rien faire maintenant j'ai tué ton script. Obligé de faire un backspace et de réactualiser ta page / script ")




    Citation Envoyé par olivierdauxais Voir le message
    Tu me demandes:
    "Comment as-tu perçu l'apprentissage de mysqli ? La courbe d'apprentissage était-elle si élevée que cela ?"

    Oueh, je rame...
    Pas simple d'autant plus que la méthode recommandée est par objet alors que je n'y connais rien en programmation orienté objet...
    Ce qui veut dire qu'en plus d'un nouveau langage, il faut aussi une autre logique que celle procédurale qui est plus simple à visualiser puisqu'elle se déroule de manière "chronologique".
    Et voire des petits exemples m'aide beaucoup plus que de longues explications abstraites.

    Je te stoppe tout de suite. Les fonctions mysqli ne sont pas purement orientées objet.
    Prenons mysqli close comme exemple : http://php.net/manual/en/mysqli.close.php

    La team PHP a consacré son temps aux deux philosophies. Regarde dans la doc, tu verras cela :

    Object oriented style
    bool mysqli::close ( void )

    Procedural style
    bool mysqli_close ( mysqli $link )

    Ainsi, il n'y a quasiment rien à faire si tu es un procédural.


    Citation Envoyé par olivierdauxais Voir le message
    Je ne suis pas un intellectuel mais un visuel... Sorry, nobody's perfect.

    Par exemple, j'aimerai beaucoup qu'on me dise quel mot décrirait le mieux le symbole "->" que je vois un peu partout en objet et qui n'existe pas en procédural.

    Merci d'avance pour tes lumières et merci aussi pour d'éventuelles autres lumières.

    Si tu es un "visual boy", alors je te suggère de t'inspirer de la documentation PHP. Je t'avouerai que moi aussi j'aimais pas lire, mais on trouve son bonheur. Il faut juste pas se fier à l'IHM un peu tristounette (violet et gris, j'avoue c'est déprimant). Le contenu est travaillé, sérieux et la doc est mise à jour régulièrement pour toutes les fonctions / méthodes régulièrement employées par la communauté PHP. Autant te dire, tu trouveras rarement une documentation aussi soutenue et détaillée. Il y a même des exemples d'usage dans quasiment toutes les pages.

    -> C'est l'opérateur de référence d'une propriété d'un objet en orienté objet.

    En orienté objet :
    Fruit f = new Fruit();
    f->setFruit("Pomme");
    f->printFruit(f->getFruit()); // Affiche Pomme

    En procédural :
    $fruit = array("Pomme");
    echo $fruit[0]; // Affiche Pomme

    Ce sont deux philosophies différentes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  5. #25
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Merci, merci et encore merci `Zaza576` pour toutes tes remarques.

    Oui, oui, j'avais bien vu que la team PHP s'est cassé la tête à mettre en place 2 langages mysqli (procédural et objet) pour respecter au mieux les "philosophies" de chacun et c'est fort sympathique de leur part.

    Mais puisque j'ai lu ici et là que mysqli se prêtait mieux à l'orientation objet, et puisqu'il me fallait apprendre ce langage autant le faire dans la "philosophie" qui s'y prête le mieux... Et c'est vrai que cela fait souvent un code plus court, en tout cas pour mysqli.
    Mais y a pas à dire mon cerveau est plus procédural que orienté objet.
    J'en ai encore eu la preuve avec ta petite démo des fruits...
    Autant le procédural me parle, autant l'orienté objet me passe complètement au dessus de la tête...

    Pour en revenir au manuel officiel de PHP, le design ne me gêne pas, c'est leur approche et leur façon d'expliquer qui est certes très technique mais comme bien souvent le "trop technique" tue le pédagogue.
    Et la pédagogie, ça me connait puisque je suis moniteur professionnel de plongée sous-marine.
    Par exemple, tout comme le manuel PHP, il y a des moniteurs de plongée qui vont te faire un long cours théorique plein de noms savants tel que la loi d'Archimède pour t'expliquer la flottabilité... etc...
    Bah moi, je zappe tout ça pour ne surtout pas effrayer mes clients et je leur dis simplement:
    "On va aller dans 1m d'eau (on a pied) avec le matos de plongée. On va s'allonger sur le ventre et on va vider nos poumons.
    Vous allez voir qu'on coule doucement et si on regonfle les poumons on remonte... Avec ça, vous avez la clef pour la plongée sous-marine."

    Y a déjà 2 ou 3 ans, je me suis amusé à faire un petit tuto sur le HTML et je le crois moins effrayant et plus motivant que d'autres: http://www.olivierdauxais.fr/Tuyau02.html
    Une fois que j'aurai mieux maitriser mysqli, je pense que j'en ferai un petit intitulé:
    "De mysql à mysqli... Tout en douceur".
    Si cela peut éviter à des débutants de ramer comme j'ai ramé, et bah tant mieux !!!

    Encore merci `Zaza576` pour ton aide.

    PS: Désolé pour mon style compact de script, mais cela se prête mieux au petit écran de mon netbook.
    Quant aux IDE, je préfère créer moi-même mes scripts, quand bien même, cette option est souvent plus lente.

    A vous autres qui lisez cette discussion, auriez-vous d'autres remarques sur mon script ci-dessus?
    Au fait, avec mysql, il y avait les "real_escape_..." machin-truc... Y a t'il un équivalent avec mysqli?
    Si oui, serait-ce possible de voir un petit exemple comment incrémenter cela dans ma version mysqli/objet ci-dessus?
    Est-ce encore nécessaire ou plus vraiment sous mysqli?

  6. #26
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Salut,

    les philosophies procédurale et orientée objet sont toutes deux justifiables selon tes besoins.
    Pour réaliser SOI-MEME une petite application web, un petit site web statique ou un simple script, le procédural est pas mal pour les débutants.
    Ensuite, dès que tu es plus à l'aise, l'orienté objet permet de structurer ton code et réaliser une architecture plus facilement maintenable surtout sur de gros projets, possédant des composants divers séparés en plusieurs couches (je cite Modèle Vue Contrôleur et compagnie pour l'exemple).

    Les frameworks, moteurs de template et autres produits informatiques sont généralement structurés de cette manière.

    Le manuel PHP peut parfois être un fourre tout. Mais il faut le voir comme un enfant qui apprend à lire un livre pour la première fois. Il ouvre une page, pleine de mots, de lettres, de sons... Et il va tenter de chercher à comprendre, à appliquer les règles de cette page dans sa tête, pour comprendre.

    Je te rejoins sur ta manière de présenter un sujet à tout néophyte sans l'effrayer. Il est vrai que nous avons tendance, nous "techniciens et experts" dans le monde de l'informatique (et aussi dans d'autres domaines), à parfois laisser notre enthousiasme déborder et sortir des mots qui ne sont pas forcément compris de tous.

    Ton site web sur l'apprentissage du HTML est un très bon exemple d'une communication pour présenter du technique à la portée de tous.

    Et merci pour le petit cours rapide de plongée

    Voici un exemple de mysqli_real_escape : http://www.w3schools.com/php/func_my...ape_string.asp

    Son usage est toujours d'actualité pour protéger tes requêtes des caractères spéciaux. Fais tout de même attention au charset que tu utilises :

    Caution
    Security: the default character set

    The character set must be set either at the server level, or with the API function mysqli_set_charset() for it to affect mysqli_real_escape_string(). See the concepts section on character sets for more information.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  7. #27
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Comme prévu, j'ai fait un p'tit tuto pour les débutants pour passer en douceur de MySQL à MySQLi:
    http://www.olivierdauxais.fr/Tuyau03.php
    Bonne continuation à toutes et tous.
    H Olivier Dauxais.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Requête mysql (rechercher tout ce qui commence par).
    Par toffff dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/03/2007, 09h44
  2. [MySQL] Extension mysql ou mysqli ?
    Par DJesus dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/03/2007, 12h50
  3. Faire cohabiter mysql et mysqli
    Par Christophe Charron dans le forum Installation
    Réponses: 1
    Dernier message: 01/03/2006, 17h14
  4. difference entre MySQL et Mysqli?
    Par maire106 dans le forum Installation
    Réponses: 3
    Dernier message: 16/06/2005, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo