Эта тема на forum.dklab.ru


iVariable: DBSimple. Экранирование плейсхолдеров.
Драсьте :)

Пишу один небольшой скрипт и столкнулся с такой проблемой.

Есть код вида:


$messages=$ctxt->db->selectPage($total,
'SELECT m.id as ARRAY_KEY, '.implode(',',$sres).',
uid, u.login as uname, ufo, active, crdate, moddate, moduid
FROM
`'.$ctxt->dbTables['message'].'` m LEFT JOIN `'.$ctxt->dbTables['user'].'` u ON m.uid=u.id AND m.moduid=u.id
WHERE 1=1 {AND ?a}
ORDER BY crdate DESC
LIMIT ?d, ?d',
(empty($where)? DBSIMPLE_SKIP : $where),
$limit[0],$limit[1]
); //@



В табличках Message и User есть поле ID. И если передать в качестве $where массив array('m.id'=>ВАЛИДНЫЙ_ИД) то за счет того, что DbSimple экранирует целиком m.id в `m.id`, запрос не отработает, потому что поля m.id не существует. Соответственно передать просто id нельзя, потому что в обоих таблицах есть такое поле.
В результате пришлось тщуть-тщуть подправить код Mysql.php, а именно:



function _performEscape($s, $isIdent=false)
{
if ($isIdent) {
if(($n=strpos($s,'.'))===false){
return "`" . str_replace('`', '``', $s) . "`";
}else{
return substr($s,0,$n+1)."`" . str_replace('`', '``', substr($s,$n+1)) . "`";
};
} else {
return "'" . mysql_real_escape_string($s, $this->link) . "'";
}
}


А теперь собссно вопрос. :) Имеет ли право на жизнь такая правка или я не увидел где то возможную проблему?
Миша Спларов:
http://dklab.ru/lib/DbSimple/#list4 и следующие примеры
iVariable:
До Штирлица не дошло сообщение из штаба. Перечитал. Все равно не дошло. (с) ^_^

Что именно я там должен увидеть? Где там проблема, описанная мной выше?
Anonymous:
Может всё таки {AND m.id = ?a} ??
iVariable:
1) Нет. В массиве $where может передаваться не только id. Там могут быть разные параметры. Да и не в этом дело.
2) Дело не в том что я не могу сделать так, чтоб работало. Я сделал и запрос уже немного другой на самом деле, ибо в тоом я тупанул маненько :)
Дело в том, что ИМХО в ДБСимпл бага в функции _performEscape для mysql, которую я исправил кодом выше. И я хчу чтобы либо разработчики, либо кто нить, кто разбирается в SQL лучше меня, посмотрел и определил не приведет ли такая правка к какой нить проблеме, которой я не вижу. Собссно вот )

Эта тема на forum.dklab.ru