- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Convertire query per mysql4 vs mysql5
-
Secondo me non è un errore della 5 ma di una variabile non valorizzata.
Prova a fare l'echo della query e postarla per capire meglio.
-
Innanzitutto grazie infinite per la risposta
Ho pensato fosse un problema di versione di mysql poichè nel server vecchio il forum girava con mysql4 ed il problema non si poneva, mentre sul server su cui mi sono trasferita e che supporta mysql5 viene visualizzato il warning.
Comunque ecco questo test:
mettendo nel codice questa cosa:
[php]echo $user_info[query_see_board]; [/php]
ottengo per il mio utente (aministratore del forum) il valore 1
per rispettivamnete un guest ed un utente normale ottengo:FIND_IN_SET(-1, b.memberGroups) (FIND_IN_SET(0, b.memberGroups) OR FIND_IN_SET(4, b.memberGroups))
Premesso che i test sulla query incriminata e relativi errori li effettuo con utente admin, quindi valore 1 della variabile.
Adesso mi rimetto a te perchè le mie conoscenze di PHP e mysql vsono così basilari da non permettermi di venirne a capo
-
Prova a fare questa echo prima della query, così vediamo cosa lanci di preciso:
echo " SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? " (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ", IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM ({$db_prefix}categories AS c, {$db_prefix}boards AS b) LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? " LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER) LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . " LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE $user_info[query_see_board] " . isset($_REQUEST['catogid']) ? " AND c.ID_CAT = {$_REQUEST['catogid']}" : '' . " AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder";
-
Perdonami, non avevo capito
Ecco il risultato:
AND c.ID_CAT =
-
???
Di tutta quella echo ti fa vedere solo 10 caratteri?
Oppure solo della riga interessata?Se della riga interessata allora sembra che $_REQUEST['catogid'] sia settata ma vuota, mentre tu controlli solo se è settata.
Prova a modificare così, non dovrebbe dare più errore:
$result_boards = db_query(" SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? " (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ", IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM ({$db_prefix}categories AS c, {$db_prefix}boards AS b) LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? " LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER) LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . " LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE $user_info[query_see_board] " . (isset($_REQUEST['catogid']) && $_REQUEST['catogid'] != "") ? " AND c.ID_CAT = {$_REQUEST['catogid']}" : '' . " AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder", __FILE__, __LINE__);
-
Ciao!
Scusa se non ti ho più risposto, sono stata via per due giorni.Ho fatto l'echo che mi hai suggerito, dunque di tutta la query, ed il risultato era solo quella cosa lì.
Ho provato questo ultimo codice e l'errore è: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 'AND c.ID_CAT = 8' at line 1 File: /home/... ...[/forum/Sources/BoardIndex.php](http://daoc.clans.it/forum/Sources/BoardIndex.php) Linea: 85
Come detto la cosa che mi insospettisce è come mai sul vecchio server con mysql4 non avevo problemi, e adesso con mysql5 sì?
Forse devo modificare l'ordine di qualcosa nella query? Forse devo mettere delle parentesi in più, come a volte è richiesto per mysql5?
Io sono troppo ignorante per riuscire a capire cosa devo fareTanto per la cronaca ti posto il codice che al momento tengo sul forum, funzionante, ma che nn fa la selezione di una categoria (lo scopo del codice che non mi funziona):
[php] $result_boards = db_query("
SELECT
c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description,
b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(m.posterTime, 0) AS posterTime,
IFNULL(mem.memberName, m.posterName) AS posterName, m.subject, m.ID_TOPIC,
IFNULL(mem.realName, m.posterName) AS realName," . ($user_info['is_guest'] ? "
1 AS isRead, 0 AS new_from" : "
(IFNULL(lb.ID_MSG, 0) >= b.ID_MSG_UPDATED) AS isRead, IFNULL(lb.ID_MSG, -1) + 1 AS new_from,
c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed") . ",
IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG,
IFNULL(mods_mem.ID_MEMBER, 0) AS ID_MODERATOR, mods_mem.realName AS modRealName, b.passwd
FROM {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}categories AS c ON (c.ID_CAT = b.ID_CAT)
LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG)
LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER)
LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . "
LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD)
LEFT JOIN {$db_prefix}members AS mods_mem ON (mods_mem.ID_MEMBER = mods.ID_MEMBER)
WHERE $user_info[query_see_board]" . (empty($modSettings['countChildPosts']) ? "
AND b.childLevel <= 1" : ''), FILE, LINE);[/php]Questo codcie qui va, senza problemi, solo che non fa quello che serve a me, ma mostra tutte le categorie indistintamente.
Speriamo di venirne a capo... ho chiesto sul forum ufficiale di SMF, ma quelli che mi rispondono non mi hanno saputo dare indicazioni utili. Continuano a dirmi di aggiornare il mio forum all'ultima versione, poichè la mia è quella precedente, ma 1) non posso attualmente fare questo aggiornamento poichè ho moddato e modificato il codice così tanto per scopi personali che un aggiornamento sarebbe possibile solo eseguito a mano, con un diff file per file per non perdere tutte le mie modifiche; 2) non funzionerebbe nemmeno con l'ultima versione, poichè questa cosa qui della selezione della categoria è un MOD, non è codice della versione ufficiale. Riapplicando lo stesso mod alla nuova versione sarei punto e a capo.Grazie per la pazienza e l'aiuto Aspetto tuoi consigli!
-
Davvero il risultato di questa echo è solo quei pochi caratteri???
[LEFT]echo " SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName," . (!$user_info['is_guest'] ? " (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead') . ", IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM ({$db_prefix}categories AS c, {$db_prefix}boards AS b) LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? " LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER) LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : '') . " LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE $user_info[query_see_board] " . isset($_REQUEST['catogid']) ? " AND c.ID_CAT = {$_REQUEST['catogid']}" : '' . " AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder";[/LEFT]
Stento davvero a crederci.
Riprova a farla e poi guarda il sorgente della pagina (HTML) e posta quello che ti scrive lì.
-
Riprovato (ovviamente pongo l'echo dopo la definizione delle variabili, ecc, sennò non troverebbe i valori):
nel DOM ho in effetti delle righe vuote, ma son cmq vuote:
AND c.ID_CAT = 8
-
Incredibile! Comunque proviamo a scomporre la stringa che hai generato:
[LEFT]**echo " SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName,"; echo (!$user_info['is_guest'] ? " (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead'); echo ", IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM ({$db_prefix}categories AS c, {$db_prefix}boards AS b) LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)"; echo (!$user_info['is_guest'] ? " LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER) LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : ''); echo " LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE $user_info[query_see_board] "; echo isset($_REQUEST['catogid']) ? " AND c.ID_CAT = {$_REQUEST['catogid']}" : ''; echo " AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder"; **
Dimmi questa volta cosa vedi![/LEFT]
-
Intanto lasciati dire che sei incredibilmente gentile!
Hai una pazienza infinita Io solitamente, quando qualcuno mi chiede supporto sui forum, dopo un poco rispondo quasi "arrangiati"Allora, ho provato, ecco il risultato (DOM):
SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName, (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed, IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM (smf2_categories AS c, smf2_boards AS b) LEFT JOIN smf2_messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN smf2_members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER) LEFT JOIN smf2_log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = 1) LEFT JOIN smf2_collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = 1) LEFT JOIN smf2_moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN smf2_members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE 1 AND c.ID_CAT = 8 AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder
-
Grazie, spero che almeno possa servire a risolvere il tuo problema.
Cmq a vedere il risultato adesso sembra corretto (a parte i < che potrebbe essere dovuto a un copia incolla). Ti consiglio di modificare la tua query così:$qry .= " SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName,"; $qry .= (!$user_info['is_guest'] ? " (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed" : ' 1 AS isRead'); $qry .= ", IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM ({$db_prefix}categories AS c, {$db_prefix}boards AS b) LEFT JOIN {$db_prefix}messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)"; $qry .= (!$user_info['is_guest'] ? " LEFT JOIN {$db_prefix}log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = $ID_MEMBER) LEFT JOIN {$db_prefix}collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = $ID_MEMBER)" : ''); $qry .= " LEFT JOIN {$db_prefix}moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN {$db_prefix}members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE $user_info[query_see_board] "; $qry .= (isset($_REQUEST['catogid']) ? " AND c.ID_CAT = {$_REQUEST['catogid']}" : ''); $qry .= " AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder"; echo $qry . "\n"; $result_boards = db_query($qry);
Questo consiglio è valido sempre, se la query la costruisci prima diventa più leggibile (e puoi mettere dei commenti su quello che intendi fare) e più debuggabile (puoi mettere un echo subito prima per capire se è corretta).
Intanto vediamo così cosa fa e cosa fa vedere.
-
Grandissimo!!!!
Hai risolto il problema!! Dunque non era legato a mysql5? solo una diversa presentazione del codice?Tanto per la cronaca l'echo restituisce:
[php]SELECT c.name AS catName, c.ID_CAT, b.ID_BOARD, b.name AS boardName, b.description, b.numPosts, b.numTopics, b.ID_PARENT, IFNULL(mem.memberName, m.posterName) AS posterName, m.posterTime, m.subject, m.ID_TOPIC, IFNULL(mem.realName, m.posterName) AS realName, (IFNULL(lb.logTime, 0) >= b.lastUpdated) AS isRead, c.canCollapse, IFNULL(cc.ID_MEMBER, 0) AS isCollapsed, IFNULL(mem.ID_MEMBER, 0) AS ID_MEMBER, m.ID_MSG, IFNULL(mem2.ID_MEMBER, 0) AS ID_MODERATOR, mem2.realName AS modRealName FROM (smf2_categories AS c, smf2_boards AS b) LEFT JOIN smf2_messages AS m ON (m.ID_MSG = b.ID_LAST_MSG) LEFT JOIN smf2_members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER) LEFT JOIN smf2_log_boards AS lb ON (lb.ID_BOARD = b.ID_BOARD AND lb.ID_MEMBER = 1) LEFT JOIN smf2_collapsed_categories AS cc ON (cc.ID_CAT = c.ID_CAT AND cc.ID_MEMBER = 1) LEFT JOIN smf2_moderators AS mods ON (mods.ID_BOARD = b.ID_BOARD) LEFT JOIN smf2_members AS mem2 ON (mem2.ID_MEMBER = mods.ID_MEMBER) WHERE 1 AND c.ID_CAT = 8 AND b.ID_CAT = c.ID_CAT AND b.childLevel <= 1 ORDER BY c.catOrder, b.childLevel, b.boardOrder[/php] e le categorie del forum finalmente si vedono separate a seconda dell'id:
http://daoc.clans.it/forum/index.php?action=forum;catogid=1No so davvero come ringraziarti, farò pubblicità al tuo sito (quello in firma ed anche questo) sui miei forum in cui si parla di programmazione
-
Grazie, evidentemente era un problema di creazione della query.
Ciao e buon lavoro!