To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

Ogłoszenia - [ B??d + fix ] B?dy na forum po instalacji MySQL > 5.0.12

spy - 02-11-2005, 15:03
Temat postu: [ Błąd + fix ] Będy na forum po instalacji MySQL > 5.0.12
Był taki temat http://www.przemo.org/php...er=asc&start=15 ale poza kilkoma sugestiami pójścia sobie do diabła, nie zapostowano rozwiązania.

W MySQL wprowadzno ładnych parę zmian w składni języka (niektóre są na tyle durne, że sam się dziwię, że przeszły). Te kilka zmian na pewno zdecydowanie utrudni życie ładnej rzeszy niechlujnych programistów i zmusi innych do cierpliwego poszukiwania rozwiązania.
W każdym razie, w tym konkretnym przypadku zmieniono sposób traktowania operandów instrukcji JOIN. W tej chwili, jeśli lista operandów ma długość większą niż jeden, to należy tę listę ująć w nawias.
Problem na pewno występuje w plikach:
posting.php
report.php
includes/usercp_register.php

Przykład (plik posting.php):

Jest tak:
$sql = "SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM " . GROUPS_TABLE . " g, " . USERS_TABLE . " u
LEFT JOIN " . USER_GROUP_TABLE . " ug ON g.group_id = ug.group_id AND ug.user_id = $user_id
WHERE u.user_id = $user_id
AND g.group_single_user = 0
AND g.group_count_enable = 1
AND g.group_moderator <> $user_id";


Ma być tak:

$sql = "SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM (" . GROUPS_TABLE . " g, " . USERS_TABLE . " u)
LEFT JOIN " . USER_GROUP_TABLE . " ug ON g.group_id = ug.group_id AND ug.user_id = $user_id
WHERE u.user_id = $user_id
AND g.group_single_user = 0
AND g.group_count_enable = 1
AND g.group_moderator <> $user_id";


Różnicę (ogromną) robią nawiasy po między FROM a LEFT JOIN. Poprawienie tego kawałka eliminuje wyrzucanie przez forum błędu przy wysyłaniu/usuwaniu posta.

Przykład dobrej implementacji przy kilku JOINach jest w pliku includes/functions.php (developerzy powinni sprawdzić skrypt pod tym właśnie kątem):

$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id, t.topic_last_post_id, t.topic_title
FROM ((( " . FORUMS_TABLE . " f
LEFT JOIN " . POSTS_TABLE . " p ON p.post_id = f.forum_last_post_id )
LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id )
LEFT JOIN " . TOPICS_TABLE . " t ON t.topic_last_post_id = p.post_id
AND t.forum_id = f.forum_id)
ORDER BY f.forum_order, f.forum_id";


P.S.
Szczegółowe informacje tutaj:
http://dev.mysql.com/doc/refman/5.0/en/join.html

patrick - 04-11-2005, 12:29

Wiec dzis zainstalowalem MySQLl 5.0.15 bo zostal uznany przez mysql.com za wersje rekomendowana (czyli wersje 4.0.x i 4.1.x odpadaja juz swiat idzie do przodu ).

Jednak forum "by przemo" wywala bledy . Mysle ze ta wersja mysql zostanie instalowana na serverach hostingow i moga byc problemy ;)
Blad wystapuje np. przy wysylaniu posta

Kod:
Error geting users post stat

DEBUG MODE

SQL Error : 1054 Unknown column 'g.group_id' in 'on clause'

SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM phpbb_groups g, phpbb_users u LEFT JOIN phpbb_user_group ug ON g.group_id = ug.group_id AND ug.user_id = 153 WHERE u.user_id = 153 AND g.group_single_user = 0 AND g.group_count_enable = 1 AND g.group_moderator <> 153

Line : 1088
File : posting.php

Trzeba jak najszybciej przystosowac sie do standardow.

chelloPL - 04-11-2005, 14:40

patrick, czytaj "nasz" dział... Tam już jest to zgłoszone i jest rozwiązane. W nowej wersji będzie (powinno) działać.
spy - 04-11-2005, 15:03

Jak miło. A tutaj nie mogliście zapostować tego rozwiązania? :P
patrick - 04-11-2005, 15:08

chelloPL napisał/a:
patrick, czytaj "nasz" dział... Tam już jest to zgłoszone i jest rozwiązane. W nowej wersji będzie (powinno) działać.


widzisz jaki ja slepy ;)
Cytat:
Jak miło. A tutaj nie mogliście zapostować tego rozwiązania? Razz

ja widzialem ze sobie sam poradziles ;)
Mysle ze mozna zablokowac.

spy - 04-11-2005, 17:34

Jeśli forum stoi na serwerze gdzie jest zainstalowany MySQL w wersji 5.0.12 lub wyższej, ten patch powinien pomóc:

Kod:
### [OPEN] album.php
### [FIND]
             FROM ". ALBUM_TABLE ." AS p
                 LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
                 LEFT JOIN ". ALBUM_CAT_TABLE ." AS ct ON p.pic_cat_id = ct.cat_id
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
             FROM ((((". ALBUM_TABLE ." AS p
                 LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
                LEFT JOIN ". ALBUM_CAT_TABLE ." AS ct ON p.pic_cat_id = ct.cat_id)
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)




### [OPEN] album_cat.php
### [FIND]
             FROM ". ALBUM_TABLE ." AS p
                 LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
             FROM (((". ALBUM_TABLE ." AS p
                 LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_comment_delete.php
### [FIND]
         FROM ". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
             LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
         FROM ((". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
             LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_comment_edit.php
### [FIND]
         FROM ". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
             LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
         FROM ((". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
             LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_modcp.php
### [FIND]
                 FROM ". ALBUM_TABLE ." AS p
                     LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
                     LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
                     LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
                 FROM (((". ALBUM_TABLE ." AS p
                     LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
                     LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
                     LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_page.php
### [FIND]
         FROM ". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
             LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
             LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
         FROM (((". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
             LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
             LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_personal.php
### [FIND]
             FROM ". ALBUM_TABLE ." AS p
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
             FROM ((". ALBUM_TABLE ." AS p
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_portal.php
### [FIND]
             FROM ". ALBUM_TABLE ." AS p
                 LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
                 LEFT JOIN ". ALBUM_CAT_TABLE ." AS ct ON p.pic_cat_id = ct.cat_id
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id
### [REPLACE WITH]
             FROM ((((". ALBUM_TABLE ." AS p
                 LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
                 LEFT JOIN ". ALBUM_CAT_TABLE ." AS ct ON p.pic_cat_id = ct.cat_id)
                 LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
                 LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)



### [OPEN] album_rate.php
### [FIND]
         FROM ". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id
             LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id
### [REPLACE WITH]
         FROM ((". ALBUM_TABLE ." AS p
             LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
             LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)



### [OPEN] posting.php
### [FIND]
             $sql = "SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM " . GROUPS_TABLE . " g, " . USERS_TABLE . " u
### [REPLACE WITH]
             $sql = "SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM (" . GROUPS_TABLE . " g, " . USERS_TABLE . " u)




### [OPEN] report.php
### [FIND]
             FROM " . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt
                 LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id
                 LEFT JOIN " . USERS_TABLE . " u2 ON u2.user_id = p.reporter_id
### [REPLACE WITH]
             FROM (((" . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt)
                 LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id)
                 LEFT JOIN " . USERS_TABLE . " u2 ON u2.user_id = p.reporter_id)
### [FIND]
             FROM " . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt
                 LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id
                 LEFT JOIN " . USERS_TABLE . " u2 ON u2.user_id = p.reporter_id
### [REPLACE WITH]
             FROM (((" . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt)
                 LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id)
                 LEFT JOIN " . USERS_TABLE . " u2 ON u2.user_id = p.reporter_id)



### [OPEN] includes/usercp_register.php
### [FIND]
             $sql = "SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM " . GROUPS_TABLE . " g, ".USERS_TABLE." u
### [REPLACE WITH]
             $sql = "SELECT ug.user_id, g.group_id as g_id, g.group_name , u.user_posts, g.group_count FROM (" . GROUPS_TABLE . " g, ".USERS_TABLE." u)



### [OPEN] admin/index.php

### [FIND]

            if( preg_match("/^(3\.23|4\.)/", $version) )
            {
                $db_name = ( preg_match("/^(3\.23\.[6-9])|(3\.23\.[1-9][1-9])|(4\.)/", $version) ) ? "`$dbname`" : $dbname;


### [REPLACE WITH]

            if( preg_match("/^(3\.23|4\.|5\.)/", $version) )
            {
                $db_name = ( preg_match("/^(3\.23\.[6-9])|(3\.23\.[1-9][1-9])|(4\.)|(5\.)/", $version) ) ? "`$dbname`" : $dbname;




Pliki z nałożonymi łatami dla PHP 5.x i MySQL 5.0.12 są tutaj:
http://www.przemo.org/php...p=132963#132963

A jeszcze dokładniej - tu: http://www.przemo.org/php...oad.php?id=3974

Jeśli nie nakładałe(a)ś dodatkowych modów i śpieszy Ci się lub nie radzisz sobie z samodzielnym poprawianiem plików .php, to zrób kopię własnych plików i podmień tymi z załącznika.

UWAGA: pliki zawierają ten mod http://www.przemo.org/php...p=133496#133496
Jeśli ktoś go nie chce, to usunięcie go powinno być naprawdę proste, ponieważ wiąże się jedynie z wykasowaniem kilku linijek w pliku posting.php. Niestety trzeba to zrobić samemu.
PLIKI NA PEWNO SĄ O.K., więc jesli coś nie działa, to znaczy, że to Ty popaełniłe(a)ś jakiś błąd.

DuroneK - 04-11-2005, 18:22

MySQL zwrócił komunikat: Dokumentacja
#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 'FROM ". ALBUM_TABLE ." AS p
LEFT JOIN ". USERS_TABLE ." AS u

spy - 04-11-2005, 18:56

Przy którym pliku to wyskakuje? (jaki jest adres w przeglądarce w momencie wystąpienia tego błędu?)
strus - 05-11-2005, 09:03

Czyli jak na 1 serverze mam wersje 5.0.15 to rozwiazanie spy wyeliminuje bledy przy wysylaniu postow ?
spy - 05-11-2005, 15:07

Tak.
Przemo - 10-11-2005, 19:12

obawiam sie, ze bedzie problem poniewaz to co tu podajecie jest niezgodne z manualem mysql5 Obawiam sie, ze bedzie z tym duzy problem. Szczerze mowiac nie jestem w stanie tego sprawdzic i chyba tego nie zrobie.
Przydalo by sie zeby znalezc gdzies w necie jak na 100% mozna to zrobic, czy przypadkiem nie trzeba rozdzielic zapytan osobno dla mysql >5 i <5

Po prostu masakra, chyba komus zalezy zeby programisci php mieli problemy. Ostatnio PHP5 spowodowalo problemy, teraz mysql, kolej na apache...

spy - 10-11-2005, 19:29

O czym ty piszesz? :D
Przecież to zostało zrobione na podstawie manuala MySQLowego :lol: Nie wziąłem tego z powietrza, tylko stąd: http://dev.mysql.com/doc/refman/5.0/en/join.html . Zresztą podałem ten link w pierwszym poście. Dokładnie chodzi o to:

Cytat:
Prior to 5.0.12, the SELECT is legal due to the implicit grouping of t1,t2 as (t1,t2). From 5.0.12 on, the JOIN takes precedence, so the operands for the ON clause are t2 and t3. Because t1.i1 is not a column in either of the operands, the result is an Unknown column 't1.i1' in 'on clause' error. To allow the join to be processed, group the first two tables explicitly with parentheses so that the operands for the ON clause are (t1,t2) and t3:

SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

This change also applies to INNER JOIN, CROSS JOIN, LEFT JOIN, and RIGHT JOIN.


Poza tym to są wszystkie zmiany, które trzeba zaaplikować, by forum działało poprawine zarówno z MySQLem 4.x jak i 5.x. Przecież to tylko grupowanie argumentów, które wcześniej "domyślnie" były grupowane, a teraz trzeba to zadeklarować wprost. Zresztą, sprawdź u siebie. Wystarczy, że przejdzie w posting.php.

Przemo napisał/a:
Po prostu masakra, chyba komus zalezy zeby programisci php mieli problemy.

Przecież ta zmiana akurat idzie na dobre. Wreszcie czytając tasiemcowy kod nie trzeba będzie się domyślać co jest gdzie i do czego się odnosi. Po przeczytaniu Twojego komentarza, pozostaje mieć nadzieję, że nie piszesz w C :mrgreen:
Tak przy okazji i na marginesie... Nie wiesz może, który to pajac z devów PHPBB wymyślił sposób opisu paczy w tym popieprzonym formacie z "find", "add", "replace" itd? Osobiście złożyłbym gratulacje temu geniuszowi, ktory najwyraźniej w życiu nie słyszał o narzędziach diff i patch. _TO_ jest dopiero masakra.

patrick - 10-11-2005, 20:37

spy, ale po twojej poprawce wszystko dziala ;)
Mysle, ze trzeba tylko dodac schemat mysql5 do instalacji (moze byc to schemat mysql4 bo na nim dziala ) i wszystko ok ...
spy napisał/a:
kolej na apache...


no apache powoli wprowadza wersje 2.1.x ale tam niema zmian by popsuc obsluge php ;)

Przemo - 11-11-2005, 18:02

spy, w takim razie skąd w patchu co podałes to:
Kod:
FROM (((". ALBUM_TABLE ." AS p
  LEFT JOIN ". USERS_TABLE ." AS u ON p.pic_user_id = u.user_id)
  LEFT JOIN ". ALBUM_RATE_TABLE ." AS r ON p.pic_id = r.rate_pic_id)
  LEFT JOIN ". ALBUM_COMMENT_TABLE ." AS c ON p.pic_id = c.comment_pic_id)
W manualu nie doszukalem sie informacji na temat wielokrotnego dolaczania roznych tabel. Z tego co widze w manualu w takim zapytaniu nie potrzeba zadnych nawiasów.

Widmo - 12-11-2005, 00:30

Przemo, uwierz ze ta zmiana pomaga - juz na 3 forach pomogło...


Powered by phpBB modified by Przemo © 2003 phpBB Group