Bonsoir à tous, je viens de terminer le troisième jour de "Developper son site de A à Z.
J'ai téléchargé le code source afin de tenter de corriger les erreurs que j'ai; mais rien n'y fait...
Voici les 3 erreurs que j'obtiens :
( ! ) Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in C:\wamp\www\fs\core\model.php on line 54
Call Stack
1 0.0009 244040 {main}( ) ..\index.php:0
2 0.0042 309296 Dispatcher->__construct( ) ..\index.php:9
3 0.0047 320560 call_user_func_array:{C:\wamp\www\fs\core\Dispatcher.php:21} ( ) ..\Dispatcher.php:21
4 0.0048 321088 PagesController->view( ) ..\Dispatcher.php:21
5 0.0072 334192 model->findFirst( ) ..\PagesController.php:8
6 0.0072 334344 model->find( ) ..\model.php:69
7 0.0073 334704 mysql_escape_string ( ) ..\model.php:54
La ligne 54 correspond : $v = '"'.mysql_escape_string($v).'"';
J'ai cru comprendre que mysql_escape_string était obsolète, mais tous ce que j'ai trouvé ne me corrige pas l'erreur.
( ! ) Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in C:\wamp\www\fs\core\model.php on line 54
Call Stack
1 0.0009 244040 {main}( ) ..\index.php:0
2 0.0042 309296 Dispatcher->__construct( ) ..\index.php:9
3 0.0047 320560 call_user_func_array:{C:\wamp\www\fs\core\Dispatcher.php:21} ( ) ..\Dispatcher.php:21
4 0.0048 321088 PagesController->view( ) ..\Dispatcher.php:21
5 0.0072 334192 model->findFirst( ) ..\PagesController.php:8
6 0.0072 334344 model->find( ) ..\model.php:69
7 0.0417 335984 mysql_escape_string ( ) ..\model.php:54
La ligne 54 correspond : $v = '"'.mysql_escape_string($v).'"';
( ! ) Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id="pages" AND type="page"' at line 1 in C:\wamp\www\fs\core\model.php on line 65
Call Stack
1 0.0009 244040 {main}( ) ..\index.php:0
2 0.0042 309296 Dispatcher->__construct( ) ..\index.php:9
3 0.0047 320560 call_user_func_array:{C:\wamp\www\fs\core\Dispatcher.php:21} ( ) ..\Dispatcher.php:21
4 0.0048 321088 PagesController->view( ) ..\Dispatcher.php:21
5 0.0072 334192 model->findFirst( ) ..\PagesController.php:8
6 0.0072 334344 model->find( ) ..\model.php:69
7 0.0716 337256 execute ( ) ..\model.php:65
La ligne 65 correspond à : $pre->execute();
J'ai beau tourner le problème dans tous les sens je ne vois pas ce qui cloche...
Je vous remercie par avance de votre aide.
Cordialement.
Ou alors utilise bind de pdo pour envoyer tes variables à ta requête car sinon le prepare ne sert pas et autant utiliser un execute à la place
Bonjour,
L'erreur est normal car la function mysql_escape_string est à remplacer par la function pdo::quote
Cordialement
Voici la partie du code correspondant :
// Construction de la condition
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_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ',$cond);
}
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
Peut être que je me plante, et si c'est le cas je remercie les autres de me corriger...
dans le cas d'une requête préparée, on n'est pas censé utiliser des alias pour justement ne pas avoir à se casser la tête avec ce genre de sécurité ??
J'ai testé une modification qu'une personne a proposé dans les commentaires du tuto :
if(!is_numeric($v)){
$v = '"'.$this->db->quote($v).'"';
Cela m'a supprimé l'alerte, mais je me retrouve avec de nouvelles erreurs.
( ! ) Notice: Undefined variable: pages in C:\wamp\www\tuto\view\layout\default.php on line 15
Call Stack
# Time Memory Function Location
1 0.0004 243672 {main}( ) ..\index.php:0
2 0.0030 309136 Dispatcher->__construct( ) ..\index.php:9
3 0.0033 320408 call_user_func_array:{C:\wamp\www\tuto\core\Dispatcher.php:21} ( ) ..\Dispatcher.php:21
4 0.0034 320856 PagesController->view( ) ..\Dispatcher.php:21
5 0.0063 333864 Controller->e404( ) ..\PagesController.php:11
6 0.0063 334432 Controller->render( ) ..\Controller.php:73
7 0.0069 340824 require( 'C:\wamp\www\tuto\view\layout\default.php' ) ..\Controller.php:36
( ! ) Warning: Invalid argument supplied for foreach() in C:\wamp\www\tuto\view\layout\default.php on line 15
Call Stack
# Time Memory Function Location
1 0.0004 244040 {main}( ) ..\index.php:0
2 0.0020 309456 Dispatcher->__construct( ) ..\index.php:9
3 0.0023 320736 call_user_func_array:{C:\wamp\www\tuto\core\Dispatcher.php:21} ( ) ..\Dispatcher.php:21
4 0.0023 321184 PagesController->view( ) ..\Dispatcher.php:21
5 0.0045 334192 Controller->e404( ) ..\PagesController.php:11
6 0.0045 334760 Controller->render( ) ..\Controller.php:73
7 0.0051 341152 require( 'C:\wamp\www\tuto\view\layout\default.php' ) ..\Controller.php:36
Bonjour,
À vrai dire, tu n'es pas obligé de te conformer aux "warnings", c'est seulement affiché parce que ta configuration les fait afficher. Néanmoins, tout ce que ça veut dire c'est que mysql_real_escape_string est déprécié et qu'il pourrait être retiré dans des versions futures de PHP. La meilleur solution: faire comme les autres ont dit. :D
Ramz.
Bonjour,
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 = '"'.$this->db->quote($v).'"';
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ', $cond);
}
}
Cordialement.
bonsoir, cela me confirme ce que j'ai essayé de faire, malheureusement une fois "$this->db->quote" utilisé, cela me plante complètement le contenu de la page. Les même erreurs écrites un peu plus haut dans ma dernière réponse.
Bonsoir,
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);
}
}
Cordialement.
Bonsoir,
Voila ce que moi j'utilise et ça fonctionne très bien :
//Construction de la condition
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 = $this->db->quote($v);
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ', $cond);
}
}
De plus ne te focalise pas sur le probleme du modele car les warnings que tu donne apres ne corresponde plus à cette erreur;)
Cordialement