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


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).'"';

@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

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
Auteur

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

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