webForumDet fria alternativet

"WHERE IN-problem"

22 svar · 580 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 597 inlägg
#1

Jag får inte följande uttryck att fungera:

if($_SESSION["uid"] <> '') { 
	$inline = "(SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"; 
	} else { 
	$inline = 1;
	}

	$sqlSelect = "SELECT title, forumID FROM tblforum AS t1 WHERE categoryID = $ID AND visible = 1 AND usergroupID IN ".$inline."";

Vad är galet?! Borde det inte fungera men "IN"?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Och vad menas med inte fungera?

lillebrorMedlem sedan apr. 20041 597 inlägg
#3

Beroende på om besökaren är inloggad eller inte plockar den första if-satsen ut alla de medlemsgrupper som en användare är med i (de styr vilka forum som visas). I SQL-satsen nedanför hämtas titel och forumID för forum som har visible = 1 och där categoryID = $ID samt slutligen där usergroup-fältet för ett visst forum matchar något/någon av de grupper som en medlem är medlem i.

I nuläget misstänker jag att felet ligger i usergroup ID ".$inline."";. Jag är osäker på vilka värden som jag igentligen får med mig i den nästlade SQL-satsen.

Enligt den bifogade bilden så ska forumet "Utveckling och idéer" vara dolt i den select-lista som visas. Men i detta så är den fullt synligt. Hur felsöker jag?

forum.jpg
LarsGMedlem sedan dec. 200012 464 inlägg
#4

Börja med att eka ut din fråga och testa den separat.

lillebrorMedlem sedan apr. 20041 597 inlägg
#5

Detta får jag ut i den nästlade satsen (bifogad bild)

Resultatet talar ju om vilka grupper som en medlem (jag i detta fallet) är med i. 1,2 och 3 innebär att jag kan ta del av samtliga forum. Felet verkar ju nu ligga i huvudsatsen. Jämför inte SQL-satsen usergroupID-fältet i tblforum med det resultat som kommer från tblmemberusergroups?

usergroupID.jpg
Peter SMedlem sedan dec. 20025 483 inlägg
#6

Vad får du med

echo $sqlSelect;

?

Red./ Sedan bör väl else-satsen se ut så här

else { 
	$inline = "(1)";
	}
lillebrorMedlem sedan apr. 20041 597 inlägg
#7

Peter S skrev:

Vad får du med

echo $sqlSelect;

?

Se bifogad bild.

usergroupID.jpg
Peter SMedlem sedan dec. 20025 483 inlägg
#8

Om du kör den direkt mot MySQL får du resultatet i inlägg #5?

lillebrorMedlem sedan apr. 20041 597 inlägg
#9

Hur menar du nu? :OO

Peter SMedlem sedan dec. 20025 483 inlägg
#10

Eftersom Lars gav rådet att testa den separat trodde jag att du kanske gjort just det. Om så inte var fallet är det bara att sätta igång :)

@ndersMedlem sedan juni 200032 969 inlägg
#11

Parenteser är bra.

.... IN (1,2,3)
lillebrorMedlem sedan apr. 20041 597 inlägg
#12

Peter S skrev:

inlägg #5?

Jag menade vad du syftade på när du sa "inlägg #5". Jag har ju en select-ruta där det slutgiltiga resultatet presenteras och där finns inget inlägg :)

@ndersMedlem sedan juni 200032 969 inlägg
#13

Jag tror att detta är inlägg #5... :o

Peter SMedlem sedan dec. 20025 483 inlägg
#14

@nders skrev:

Jag tror att detta är inlägg #5... :o

Ja, just det (y)

lillebrorMedlem sedan apr. 20041 597 inlägg
#15

Peter S skrev:

Om du kör den direkt mot MySQL får du resultatet i inlägg #5?

Jag fick hjärnsläpp och fattade inte vad du syftade på :e

Svaret i inlägg # 5 fick jag när jag körde direkt mot MySQL-databasen.

lillebrorMedlem sedan apr. 20041 597 inlägg
#16

Så ser den dagsaktuella varianten av funktionen ut med "IN". Får det fortfarande inte att fungera:

function showShortcutForumList($ID) {

	if($_SESSION["uid"] <> '') { 
	$inline = "(SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"; 
	} else { 
	$inline = 1;
	}

	$sqlSelect = "SELECT title, forumID FROM tblforum AS t1 WHERE categoryID = $ID AND visible = 1 AND usergroupID IN (".$inline.")";

	$RSobj = mysql_query($sqlSelect) or die (mysql_error());
	
	#$row = mysql_fetch_array($RSobj);	

	return $RSobj;
}

I den bifogade bilden syns nu enbart det forum som har ett usergroupID = 3. Alla de andra forumen har usergroupID = 1. Dessa världen verkar inte följa med från...

$inline = "(SELECT MAX(usergroupID) FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"; 
	} else { 
	$inline = 1;
}
usergroupID.jpg
Peter SMedlem sedan dec. 20025 483 inlägg
#17

lillebror skrev:

I den bifogade bilden syns nu enbart det forum som har ett usergroupID = 3. Alla de andra forumen har usergroupID = 1. Dessa världen verkar inte följa med från...

$inline = "(SELECT MAX(usergroupID) FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"; 
	} else { 
	$inline = 1;
}

Det är för att max() returnerar ett värde (3 i det här fallet).

Sedan borde det väl se ut så här:

function showShortcutForumList($ID) {

	if($_SESSION["uid"] <> '') { 
	$inline = [b]"SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"];[/b] 
	} else { 
	$inline = 1;
	}

	$sqlSelect = "SELECT title, forumID FROM tblforum AS t1 WHERE categoryID = $ID AND visible = 1 AND usergroupID IN (".$inline.")";

	$RSobj = mysql_query($sqlSelect) or die (mysql_error());
	
	#$row = mysql_fetch_array($RSobj);	

	return $RSobj;
}

Vad får du för resultat med

SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"];

?

lillebrorMedlem sedan apr. 20041 597 inlägg
#18

Jag missade att korrigera på den del jag hade kopierat och klistrat in i inlägget. MAX() är alltså borttaget i min nuvarande variant.

När jag kör sql-frågan utan MAX() får jag ut 1,2,3. Det är märkligt att jag sedan inte kan matcha det resultatet mot respektive usergroupID för varje forum :OO

Peter SMedlem sedan dec. 20025 483 inlägg
#19

Det kan inte vara

categoryID = $ID AND visible = 1

...som ställer till det? Vad får du t ex med

"SELECT title, forumID FROM tblforum AS t1 WHERE usergroupID IN (SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"

...respektive

"SELECT title, forumID FROM tblforum AS t1 WHERE visible = 1 AND usergroupID IN (SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"
lillebrorMedlem sedan apr. 20041 597 inlägg
#20

Peter S skrev:

Det kan inte vara

categoryID = $ID AND visible = 1

Undersöker saken nu...categoryID = $ID behöver jag för i en while-slinga i php-filen matar jag funktionen function showShortcutForumList($ID) med categoryID som varje forum tillhör. Den behöver jag nog ha kvar.

<SELECT class="select" name="forumshortcutID" size="1" onchange="f(this)">
<?php while($forumcategory = mysql_fetch_array($RSobj_forum_category)) {
$RSobj_shortcut = showShortcutForumList($forumcategory['categoryID']); ?>

Peter S skrev:

"SELECT title, forumID FROM tblforum AS t1 WHERE usergroupID IN (SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"

När jag kört denna sql-sats med mitt användarID på sidan (jag tillhör både grupp 1,2,3) så får jag 18 träffar (dvs samtliga forum visas för mig) medan en "vanlig" användare med behörighet 1 endast får 17 träffar. Då verkar det stämma för det finns enbart 1 forum som kräver behörighet 3.

Peter S skrev:

"SELECT title, forumID FROM tblforum AS t1 WHERE visible = 1 AND usergroupID IN (SELECT usergroupID FROM tblmemberusergroups WHERE memberID = ".$_SESSION["uid"].")"

För mig som tillhör samtliga grupper får jag upp samtliga forum (17 st) där visible = 1. Ett forum har visible = 0. Då stämmer resultatet så här långt när jag fyller i sql-frågan med mitt användarID. Användare med enbart behörighet 1 får upp 16 st forum.

Den sista av de två föreslagna sql-satserna fungerade fint. Sedan provade jag att lägga till categoryID = 1 för att få alla forum under den sektionen. Då fick jag error. CategoryID återfinns i tabellen tblforum. Det verkar vara här felet uppstår.

133 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)