Stocker dans des variables php les fonctions MySql

poupilou

WRInaute impliqué
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.
 

spout

WRInaute accro
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;
}
 

rick38

WRInaute passionné
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.
 

poupilou

WRInaute impliqué
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.
 

poupilou

WRInaute impliqué
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 ?
 

spout

WRInaute accro
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'", $field, mysql_real_escape_string($value));
    }
    $field_list = join(',', $fields);
    
    return mysql_query(sprintf("UPDATE `%s` SET %s WHERE `%s` = %s", $table, $field_list, $id_field, intval($id_value)));
}

(A adapter pour mysqli)
 

poupilou

WRInaute impliqué
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 ?
 

spout

WRInaute accro
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.
 

poupilou

WRInaute impliqué
Ah oui j'avais pas vu.

Et donc la variable $inserts sera de la sorte :
Code:
$inserts = array("nom" => "".$_POST['nom']."", "prenom" => "".$_POST['prenom']."");
 

spout

WRInaute accro
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.
 

poupilou

WRInaute impliqué
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... ?
 

indigene

WRInaute accro
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
 

Discussions similaires

Haut