4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
Откуда: Москва Всего сообщений: 2994 Рейтинг пользователя: 79 Дата регистрации на форуме: 29 сен. 2001
|
Профиль | Сообщить модератору | ИгнорироватьNEW! Сообщение отправлено: 6 мая 2006 17:38
При переходе с MySQL 4 на MySQL 5 обнаружил очень неприятный момент: перестали работать некоторые запросы. В частности, запрос вида
$sql="SELECT u.*, lv.*, ln.*, st.*, u__pmcount AS pmcount, u__warnings AS uw_count ".
"FROM ".$GLOBALS['DBprefix']."User u, ".$GLOBALS['DBprefix']."Language ln, ".$GLOBALS['DBprefix']."StyleSet st ".
"LEFT JOIN (".$GLOBALS['DBprefix']."LastVisit lv) ON (lv.uid=u.u_id AND lv.fid=\"$forum\") ".
"WHERE $sqldata AND st.st_id=u.u_stid ";
стал давать ошибку "unknown column u.u_id".
Долго искал причину и выяснил, что в MySQL 5 поменялся приоритет запросов и теперь надо список таблиц после FROM брать в скобки, чтобы все работало нормально, т.е.
$sql="SELECT u.*, lv.*, ln.*, st.*, u__pmcount AS pmcount, u__warnings AS uw_count ".
"FROM (".$GLOBALS['DBprefix']."User u, ".$GLOBALS['DBprefix']."Language ln, ".$GLOBALS['DBprefix']."StyleSet st )".
"LEFT JOIN (".$GLOBALS['DBprefix']."LastVisit lv) ON (lv.uid=u.u_id AND lv.fid=\"$forum\") ".
"WHERE $sqldata AND st.st_id=u.u_stid ";
Лично я решил эту проблему так: перед выполнением все запросы стал обрабатывать вот так:
if (strpos(strtoupper($query),"SELECT")!==false) {
$query=preg_replace("/FROM([^\"\']+?)LEFT\s+?JOIN/is","FROM($1)LEFT JOIN",$query);
}
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
|