Stocker dans des variables php les fonctions MySql

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par poupilou, 2 Février 2019.

  1. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Salut à tous,

    Je suis entrain de passer mes sites en php 7.2 et je dois ré-écrire pas mal de lignes de codes php, certaines de mes anciennes requêtes MySQL sont obsolètes et il faut modifier chaque page qui fait une requête mysql.

    Je me posais donc la question sur le fait de pouvoir stocker dans une variable php les principales fonctions MySQL, Est-ce une bonne pratique ? N'est-ce pas dangereux (faille de sécurité, etc...) ?

    Mon code php donnerait cela :
    Code:
    /********** Connexion base de données ****************/
    $connexion = @new mysqli($host, $login, $pass, $base);
    if(mysqli_connect_errno()){echo "Impossible de se connecter à MySQL : ".mysqli_connect_error();}
    
    /********** Fonction php connection MySql ****************/
    function get_requete($requete){
      global $connexion;
      $result = $connexion->query($requete);
      return $result;
    }
    
    /********** Variables php MySql ****************/
    $MysqliFetchArray = "mysqli_fetch_array";
    $MysqliClose = "mysqli_close";
    
    /********** Exemples de requête MySql ****************/
    $requete = get_requete("SELECT * FROM ma_table WHERE nom LIKE '%B'");
    while($voir = $MysqliFetchArray($requete))
    {
    echo "".$voir['nom']."<br>";
    }
    $MysqliClose($connexion);
    
    Qu'en pensez-vous ?

    Il suffit ensuite de modifier une seule fois les variables $MysqliFetchArray et $MysqliClose pour modifier l'ensemble des fonctions MySQL sur tout le site.

    Autre question : faut-il insérer systématiquement mysqli_free_result après chaque requête MySQL, une fois que l'on a plus besoin du résultat de cette requête ?

    Merci pour vos réponses.
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 839
    J'aime reçus:
    248
    Semi HS : mais pourquoi ne pas passer à PDO ?
    Ou tant qu'a faire, à un ORM/query builder ?

    PHP:
    $requete get_requete("SELECT * FROM ma_table WHERE nom LIKE '%B'");
    while(
    $voir $MysqliFetchArray($requete))
    {
    echo 
    "".$voir['nom']."<br>";
    }
    Query builder :
    PHP:
    $users DB::table('users')->where('nom''LIKE''%B');
    foreach (
    $users as $user) {
        echo 
    $user->nom;
    }
    ORM :
    PHP:
    $users User::where('nom''LIKE''%B')->get();
    foreach (
    $users as $user) {
        echo 
    $user->nom;
    }
     
  3. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Merci Spout.

    Qu'entends-tu par "Semi HS" ?

    Qu'est-ce que PDO apporte de plus que mysqli ?
     
  4. rick38
    rick38 WRInaute passionné
    Inscrit:
    23 Février 2013
    Messages:
    1 226
    J'aime reçus:
    145
    Pourquoi dangereux, ça ne change rien.
    En général on utilise une classe (fournie dans un framework genre Zend par exemple), et on passe à une méthode de celle-ci en paramètre la requête.

    La critique que j'aurais globalement, c'est que j'ai l'impression que vous ne codez pas en objet.
    Le PHP était autrefois seulement procédural, mais maintenant on fait plutôt toujours des classes.
     
  5. rick38
    rick38 WRInaute passionné
    Inscrit:
    23 Février 2013
    Messages:
    1 226
    J'aime reçus:
    145
    Parce qu'il vous fait remarquer que vous tentez de réinventer la roue donc vous suggère des alternatives courramment utilisées.
     
  6. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Les langages de programmation, les framework sont tellement nombreux et évoluent tellement rapidement qu'il est tout simplement impossible de suivre le rythme et de tout connaitre. Quand vous êtes seul à gérer votre boite, à coder (mettre à jour le code) vos sites (une bonne dizaine), à gérer votre serveur dédié, à faire le référencement de vos sites, à gérer vos commandes, etc... vous ne pouvez pas vous tenir au courant de tout !

    Pour infos, mes sites internet tournent à l'heure actuelle (encore) sous php 5.3.... et oui ça fonctionne encore avec cette vieille version de php... même si cette version de php est obsolète (ou du moins "indiqué" comme telle), on peut toujours utiliser les bonnes vieilles versions des années 2000. Pour infos, mes sites sont toujours en http et ils sont très bien référencés sous Google (ils sont devant les sites https).... comme quoi avec du très vieux on peut aussi bien qu'avec du "clinquant" :)

    Il existe (entre autre) msqli, PDO, le php procédurale, le php orienté objet, etc... c'est sans fin, il arrive un moment ou il faut choisir et j'ai choisi msqli et le php procédurale. Comme indiqué sur ce site http://php.net/manual/fr/mysqli.quickstart.dual-interface.php "Il n'y a pas de différence significative d'un point de vue performance entre les deux interfaces. Les utilisateurs peuvent faire leur choix que d'un point de vue personnel.".

    J'ai toujours codé mes sites moi-même en php, je n'utilise pas de CMS, j'utilise de temps en temps jquery qui est très utile pour certaines utilisations, sinon le code de mes sites c'est du php 100%, du javascript et du css écrit par moi même (et par Spout qui m'a sorti plus d'une épine du pied).... ce qui évite les éventuels problèmes de compatibilité entre les différentes versions php, les framework et plugins en tout genre.

    J'avais réfléchis à passer mes sites sur un CMS (WordPress par exemple) ou sur Prestashop mais en fin de compte je ne pense pas que ce soit un gain de temps, ni de liberté : le codage php apporte plus de souplesse dans les projets particuliers que l'on souhaite mener (c'est en tout cas la conclusion à laquelle je suis arrivé après avoir pesé le pour et le contre de l'utilisation d'un CMS, de prestashop, etc...).

    J'ai testé le script que je propose au début de ce thread et ça fonctionne parfaitement bien.

    Si ça ne pose pas de problème ou de faille de sécurité particulier, je vais opter pour cette méthode.
     
    spout apprécie ceci.
  7. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Je suis entrain de voir comment traiter en php les problèmes d'injection sql via des formulaires html.

    Est-ce que ces 2 codes ci-dessous sont identiques pour vous ?
    Code:
    foreach($_POST as $index => $valeur){$$index = mysqli_real_escape_string($connexion, $valeur);}
    et
    Code:
    foreach($_POST as $index => $valeur){$_POST[$index] = mysqli_real_escape_string($connexion, $valeur);}
    Une fois le foreach{} terminé comment insérer les valeurs des champs du formulaire dans une table MySQL afin d'éviter les injections sql ?

    Peut-on utiliser les variables de notre formulaire du type $nom, $prenom, $email, etc... ce qui donnerait :
    Code:
    INSERT INTO ma_table (date, nom, prenom, email, message) VALUES (NOW(), '$nom', '$prenom', '$email', '$message')
    ou bien comme ceci :
    Code:
    INSERT INTO ma_table (date, nom, prenom, email, message) VALUES (NOW(), '".$_POST['nom']."', '".$_POST['prenom']."', '".$_POST['email']."', '".$_POST['message]."') 
    ou bien une autre méthode ?
     
  8. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 839
    J'aime reçus:
    248
    Pour ton insert, utilise plutôt une fonction helper du genre:

    PHP:
    function mysql_insert_array($table$inserts) {
        
    $values array_map('mysql_real_escape_string'array_values($inserts));
        
    $keys array_keys($inserts);
          
        return 
    mysql_query('INSERT INTO `'.$table.'` (`'.implode('`,`'$keys).'`) VALUES (\''.implode('\',\''$values).'\')');
    }

    function 
    mysql_update_array($table$data$id_field$id_value) {
        foreach (
    $data as $field => $value) {
            
    $fields[] = sprintf("`%s` = '%s'"$fieldmysql_real_escape_string($value));
        }
        
    $field_list join(','$fields);
        
        return 
    mysql_query(sprintf("UPDATE `%s` SET %s WHERE `%s` = %s"$table$field_list$id_fieldintval($id_value)));
    }
    (A adapter pour mysqli)
     
  9. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Merci Spout.

    Dans ta fonction "mysql_insert_array" les variables $keys et $values utilisent toutes les deux $inserts, il n'y a pas un truc qui déconne là ? Dans le INSERT INTO de ta fonction la variable $keys correspond aux noms des champs de la table et la variable $values aux valeurs à insérer dans ces champs, ils ne peuvent pas être identiques, non ?
     
  10. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 839
    J'aime reçus:
    248
    Regarde bien, il y a un array_values pour les values, et un array_keys pour les noms des colonnes.
    J'ai utilisé avec succès ces 2 méthodes dans différents (anciens) projets.
     
  11. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Ah oui j'avais pas vu.

    Et donc la variable $inserts sera de la sorte :
    Code:
    $inserts = array("nom" => "".$_POST['nom']."", "prenom" => "".$_POST['prenom']."");
     
  12. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 839
    J'aime reçus:
    248
    PHP:
    "".$_POST['nom'].""
    ça sert à quoi de concaténer avec 2 strings vide ?

    Si tes variables $_POST sont les mêmes que les colonnes tu px même faire :
    PHP:
    mysql_insert_array('test'$_POST);
    Cependant attention aux champs dont tu voudrais pas remplir via le form, genre user_id.
     
  13. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Merci Spout je vais voir si j'arrive à faire fonctionner tes fonctions.

    Connais-tu un tutoriel pour sécuriser efficacement le traitement des formulaires html contre l'injection sql, les failles XSS, etc... ?
     
  14. poupilou
    poupilou WRInaute impliqué
    Inscrit:
    9 Février 2004
    Messages:
    685
    J'aime reçus:
    6
    Très instructif, merci Spout.
     
  15. indigene
    indigene WRInaute accro
    Inscrit:
    7 Septembre 2003
    Messages:
    3 751
    J'aime reçus:
    83
    Je suis étonné que la connexion soit dans la fonction getrequete
    En général on ne fait qu'une seule connexion par page et un seul close par page et on ne refait pas ça à chaque requête. Ou alors c'est une spécificité de php 7. Moi aussi je suis resté au 5
     
  16. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 839
    J'aime reçus:
    248
    Il ne fait qu'une seule connexion, il accède à l'instance via global $connexion.
     
  17. indigene
    indigene WRInaute accro
    Inscrit:
    7 Septembre 2003
    Messages:
    3 751
    J'aime reçus:
    83
    oui, j'avais lu un peu rapidement et je suis habitué à l'écriture procédurale alors c'est pour ça.
     
Chargement...
Similar Threads - Stocker variables php Forum Date
Une ASTUCE pour stocker les données peu courantes sans modifier la structure de la table Développement d'un site Web ou d'une appli mobile 9 Mai 2014
Stocker des marchandises à son domicile e-commerce 12 Août 2012
Stocker des données sur le serveur à travers webservice Développement d'un site Web ou d'une appli mobile 10 Novembre 2011
Doit-on stocker les adresses IP des messages ? [plateforme communautaire] Administration d'un site Web 27 Juillet 2011
Stocker ses mots de passe sur un serveur distant sécurisé Le café de WebRankInfo 23 Juillet 2011
[SQL] Stocker nombre à virgules Développement d'un site Web ou d'une appli mobile 21 Octobre 2010
Stocker les recherches des internautes pour et des fausses pages, légal ou pas ? Débuter en référencement 29 Décembre 2008
Redirection avec variables dans l'URL URL Rewriting et .htaccess 26 Novembre 2019
.htaccess avec variables ? Netlinking, backlinks, liens et redirections 11 Novembre 2019
htaccess et retrait des variables get URL Rewriting et .htaccess 13 Juin 2019
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice