|
|
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo
|
|
Zamknięty przez: arcy 21-12-2009, 23:55 |
[ B??d + fix ] B?dy na forum po instalacji MySQL > 5.0.12 |
Autor |
Wiadomość |
spy
Pomógł: 9 razy Posty: 147
|
Wysłany: 02-11-2005, 15:03 [ 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 |
Ostatnio zmieniony przez Widmo 25-11-2005, 22:07, w całości zmieniany 1 raz |
|
|
|
|
Gadatliwa Kasia
|
|
|
|
patrick
Pomógł: 159 razy Posty: 1900
|
Wysłany: 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
Pomógł: 413 razy Posty: 2544
|
Wysłany: 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ć. |
_________________ Zanim napiszesz do mnie na GG/PW, koniecznie przeczytaj zasady.
Sygnaturka to nie tablica z ogłoszeniami! PAMIĘTAJ o tym! Nadużywanie i celowe reklamowanie stron jest ZABRONIONE i karalne!
Gość, a czy Ty nie masz sobie nic do zarzucenia? |
|
|
|
|
spy
Pomógł: 9 razy Posty: 147
|
Wysłany: 04-11-2005, 15:03
|
|
|
Jak miło. A tutaj nie mogliście zapostować tego rozwiązania? |
|
|
|
|
patrick
Pomógł: 159 razy Posty: 1900
|
Wysłany: 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
Pomógł: 9 razy Posty: 147
|
Wysłany: 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. |
Ostatnio zmieniony przez spy 07-12-2005, 02:52, w całości zmieniany 4 razy |
|
|
|
|
DuroneK
Posty: 264
|
Wysłany: 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
Pomógł: 9 razy Posty: 147
|
Wysłany: 04-11-2005, 18:56
|
|
|
Przy którym pliku to wyskakuje? (jaki jest adres w przeglądarce w momencie wystąpienia tego błędu?) |
_________________ Spy |
|
|
|
|
strus
Pomógł: 66 razy Posty: 547
|
Wysłany: 05-11-2005, 09:03
|
|
|
Czyli jak na 1 serverze mam wersje 5.0.15 to rozwiazanie spy wyeliminuje bledy przy wysylaniu postow ? |
_________________ if(DobaZegarowa>24) cout<<"Z checia Ci pomoge!"; else cout<<"Fuck OFF and Find OUT it yourself."; |
|
|
|
|
spy
Pomógł: 9 razy Posty: 147
|
Wysłany: 05-11-2005, 15:07
|
|
|
Tak. |
_________________ Spy |
|
|
|
|
Przemo
Pomógł: 210 razy Posty: 3148
|
Wysłany: 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
Pomógł: 9 razy Posty: 147
|
Wysłany: 10-11-2005, 19:29
|
|
|
O czym ty piszesz?
Przecież to zostało zrobione na podstawie manuala MySQLowego 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
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
Pomógł: 159 razy Posty: 1900
|
Wysłany: 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
Pomógł: 210 razy Posty: 3148
|
Wysłany: 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. |
|
|
|
|
Gadatliwa Kasia
|
|
|
|
Widmo
Pomógł: 180 razy Posty: 2435
|
Wysłany: 12-11-2005, 00:30
|
|
|
Przemo, uwierz ze ta zmiana pomaga - juz na 3 forach pomogło... |
_________________ Potrzebujesz pomocy? |
|
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
Kopiowanie wszelkich treści zawartych na forum, modyfikacji oraz instrukcji bez zgody administracji i autorów tematów/postów zabronione!
Powered by phpBB modified by Przemo © 2003 phpBB
| Strona wygenerowana w 0,18 sekundy. Zapytań do SQL: 13 | |
|
|