8719 sujets

Développement web côté serveur, CMS

Bonjour,

Le domaine configuré sur un socle Arfooo comporte nativement, dans les fonctions d'administration, une fonction de sauvegarde de base.

Hors depuis peu, celle-ci ne fonction plus et affiche le message d'erreur suivant :

(8192) mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead   DatabaseModel.php


J'ai trouvé ici une explication du problème mais je n'arrive pas à implémenter une solution dans le programme.

Voilà, une partie de ce qui est codé :

            $res = $this->db->sqlQuery("SELECT * FROM $table");
            $linesCount = $this->db->sqlNumRows($res);

            if ($linesCount) {
                $backupSqlCode .= "INSERT INTO $table VALUES";

                while ($dataRow = $this->db->sqlFetchArray($res)) {
                    $linesCount--;
                    $dataRow = array_map("mysql_real_escape_string", $dataRow);
                    $dataLine = "('" . implode("', '", $dataRow) . "')";
                    if ($linesCount) {
                        $dataLine .= ",";
                    }
                    $backupSqlCode .= $dataLine;
                }

                $backupSqlCode .= ";";
            }


Je comprends partiellement la syntaxe, mais je n'arrive pas à effectuer l'upgrade technique

Merci d'avance pour votre aide et vos réponses !
Modifié par mbouchaud (08 Apr 2017 - 05:50)
Salut,
je ne vois pas bien le lien avec l'autre post que tu donnes.

En gros toutes les fonctions du type "mysql_XXXX" sont obsolètes ("deprecated") depuis quelques années.
A ma connaissance, deux variantes ont été mis en place en remplacement : "PDO" et "mysqli_XXXX"
Dans ton cas le plus simple doit être de remplacer la fonction "mysql_real_escape_string" par "mysqli_real_escape_string" (juste ajout du "i" à la fin de mysql)

Il faudrait aussi voir ce que c'est le "$this" car il se pourrait que cela soit une référence à un objet obtenu après une fonction du type mysql_connect par exemple.

Tu trouveras des explications et les options de remplacement possible dans la doc de php : http://php.net/manual/fr/function.mysql-real-escape-string.php
salut,


Les fonctions mysqli réclament souvent une ressources en premier paramètre. Dans le cas de mysqli_real_escape_string c'est la connexion au serveur (retour de mysqli_connect).

il te faut changer cette ligne $dataRow = array_map("mysql_real_escape_string", $dataRow);
le problème c'est qu'il te faut la connexion et que la array_map ne va pas t'aider, du coup un foreach va surement s'imposer pour le faire.

Cela inclus aussi que la propriété DB soit un objet qui utilise mysqli derrière.
je te conseil de lui ajouter une méthode pour wrapper l'échappement tu n'auras le problème de recherche de connexion Smiley cligne

un tuto sur le sujet (mysql -> mysqli ): https://forum.phpfrance.com/faq-tutoriels/passer-mysql-mysqli-pdo-t276282.html


@+
Merci beaucoup pour vos explications, avec toutes ces informations je vais essayer d'avancer.
Modifié par mbouchaud (10 Apr 2017 - 13:21)