From 70b7d16a0af346dd4ccd7f2e11c03784cbc64371 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Sat, 18 Sep 2010 11:42:53 +0000 Subject: [PATCH] Abstraction mysql : dans sql_insertq et sql_updateq on utilisait spip_mysql_cite en lui passant le type. Bien que sql_quote puisse prendre le type en argument, lui utilisait toujours _q() ce qui ne donnait pas un resultat equivalent (cas typique de '0001' stocke dans une chaine que _q transforme en 1). On change donc cela : lorsque le type est fournit a sql_quote, il utilise spip_mysql_cite qui saura faire ce qu'il faut, sinon il s'en remet a _q comme avant, qui fait de son mieux sans rien savoir du format de stockage. On traite les tableaux par propagation du type, afin de ne rien casse de la compatibilite de sql_quote --- ecrire/req/mysql.php | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index ce9ccc9945..eadb17ae8a 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -716,9 +716,19 @@ function spip_mysql_hex($v) return "0x" . $v; } -function spip_mysql_quote($v, $type='') -{ - return ($type === 'int' AND !$v) ? '0' : _q($v); +function spip_mysql_quote($v, $type='') { + if ($type) { + if (!is_array($v)) + return spip_mysql_cite($v,$type); + // si c'est un tableau, le parcourir en propageant le type + foreach($v as $k=>$r) + $v[$k] = spip_mysql_quote($r, $type=''); + return $v; + } + // si on ne connait pas le type, s'en remettre a _q : + // on ne fera pas mieux + else + return _q($v); } function spip_mysql_date_proche($champ, $interval, $unite) @@ -770,13 +780,17 @@ function calcul_mysql_in($val, $valeurs, $not='') { // http://doc.spip.org/@spip_mysql_cite function spip_mysql_cite($v, $type) { - if (sql_test_date($type) AND preg_match('/^\w+\(/', $v) - OR (sql_test_int($type) - AND (is_numeric($v) - OR (ctype_xdigit(substr($v,2)) - AND $v[0]=='0' AND $v[1]=='x')))) + if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)) return $v; - else return ("'" . addslashes($v) . "'"); + if (sql_test_int($type)) { + if (is_numeric($v) OR (ctype_xdigit(substr($v,2)) + AND $v[0]=='0' AND $v[1]=='x')) + return $v; + // si pas numerique, forcer le intval + else + return intval($v); + } + return ("'" . addslashes($v) . "'"); } // Ces deux fonctions n'ont pas d'equivalent exact PostGres -- GitLab