Deprecated: mysql_real_escape_string():

Par PKR, il y a 7 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Model.php

<?php class Model{ static $connections = array(); public $conf = 'default'; public $table = false; public $db; public function __construct(){ //je ne connecter a la base de donne $conf = Conf::$databases[$this->conf]; if(isset(Model::$connections[$this->conf])){ $this->db = Model::$connections[$this->conf]; return true; } try{ $pdo = new PDO('mysql:host='.$conf['host'].';dbname='.$conf['database'].';',$conf['login'],$conf['password'],array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); Model::$connections[$this->conf] = $pdo; $this->db = $pdo; }catch(PDOException $e){ if(Conf::$debug >= 1){ die($e->getMessage()); }else{ die('Page indisponible !!!'); } } //echo "j'ai charge la base de donne et je m'y suis connecte"; //j'initialise qulque variable if($this->table === false){ $this->table = strtolower(get_class($this)).'s'; } } public function find($req){ $sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' '; //Construiction de la conditions if(isset($req['conditions'])){ $sql .= 'WHERE '; if(!is_array($req['conditions'])){ $sql .= $req['conditions']; }else{ $cond = array(); foreach($req['conditions'] as $k=>$v){ if(!is_numeric($v)){ $v = '"'.mysql_real_escape_string($v).'"'; } $cond[] = "$k=$v"; } $sql .= implode(' AND ',$cond); } } die($v); $pre = $this->db->prepare($sql); $pre->execute(); return $pre->fetchAll(PDO::FETCH_OBJ); } public function findFirst($req){ return current($this->find($req)); } } ?>

Ce que je veux

SELECT * FROM posts as Post WHERE id = \'\"

Ce que j'obtiens

Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO :(

5 réponses

Lartak, il y a 7 ans

Bonsoir.
La réponse t'es donné dans le message d'erreur, la fonction mysql_real_escape_string() est déprécié, il te faut par exemple utiliser mysqli_real_escape_string() au lieu de mysql_real_escape_string().
Tu as donc juste à remplacer par :

$v = '"'.mysqli_real_escape_string($v).'"';
Huggy, il y a 7 ans

@Lartak c'est pas si simple car les fonctions mysqli demandent un $link or il utilise PDO
il n'y a pas d'équivalent de mysql_real_escape_string en PDO (voir ici)

@PKR comme tu utilises déjà une requête préparée, il te suffit d'utiliser les placeholder "$k = ?" et construire un tableau de $v que l'on passe ensuite à la méthode execute

Lartak, il y a 7 ans

c'est pas si simple car les fonctions mysqli demandent un $link or il utilise PDO

En effet, je me suis tellement habitué à coder en POO, que j'avais un peu oublié ça.
Sinon PKR, quelqu'un d'autre avait eu le même problème que toi et il lui avait été proposé d'utiliser la fonction addslashes à la place de mysql_real_escape_string, voir ici : créer un site de A à Z jour 3 problème mysql_escape_string.

PKR, il y a 7 ans

Merci infiniment pour vos réponses Lartak ta fonction addslashes a bien réglé mon problème merci

Huggy, il y a 7 ans

Tu devrais t'intéresser au pb de l'injection SQL
addslashes n'est plus du tout adapté aux encodages multi-byte comme UTF-8
voir ici le pb lié aux homoglyph