webForumDet fria alternativet

Visa kontaktlista

Databaser & SQL

15 svar · 632 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Jag får inte till följande SQL-sats och funktion att fungera. Problemet är nästan identiskt med det problem där jag ville skriva ut länkbokstäver högst upp på sidan för samtliga medlemmar.

Nu ska jag lägga till denna funktion under "Mina kontakter". Då skall enbart de kontakter som är tillagda i databasen för en användare skrivas ut. Jag har försökt implementera substring(t1.friendusername FROM 1 FOR 1) = '".$letter."' i WHERE-villkoret. Dock får jag det inte att fungera. När jag trycker på någon av bokstäverna högst upp visas fortfarande samtliga medlemmar. Något är skumt. Misstänker att problemet ligger i substring()... och att friendusername inte är rätt länkat mot SELECT-satsen nivån ovanför...

Några idéer?

function listMyContacts($ID, $orderby='friendusername', $sort='ASC', $letter='all') {
	if ($letter == 'all') {
$sqlSelect = "SELECT DISTINCT (SELECT username FROM tblmember WHERE memberID = t1.friendID) AS friendusername, (SELECT memberID FROM tblmember WHERE memberID = t1.friendID) AS memberID, (SELECT DATE_FORMAT(last_visit, '%Y-%m-%d %H:%i') FROM tblmember WHERE memberID = t1.friendID) AS datetime, (SELECT memberID FROM tblonline WHERE memberID = t1.friendID) AS online, (SELECT activity FROM tblonline WHERE memberID = t1.friendID) AS activity FROM tblmyfriends AS t1, tblmember AS t2, tblonline AS t3 WHERE t1.memberID = $ID ORDER BY $orderby $sort"; 
} else if ($letter <> 'NULL') {
$sqlSelect = "SELECT DISTINCT (SELECT username FROM tblmember WHERE memberID = t1.friendID) AS t1.friendusername, (SELECT memberID FROM tblmember WHERE memberID = t1.friendID) AS memberID, (SELECT DATE_FORMAT(last_visit, '%Y-%m-%d %H:%i') FROM tblmember WHERE memberID = t1.friendID) AS datetime, (SELECT memberID FROM tblonline WHERE memberID = t1.friendID) AS online, (SELECT activity FROM tblonline WHERE memberID = t1.friendID) AS activity FROM tblmyfriends AS t1, tblmember AS t2, tblonline AS t3 WHERE t1.memberID = $ID AND substring(t1.friendusername FROM 1 FOR 1) = '".$letter."' ORDER BY $orderby $sort"; 
}	

$RSobj = mysql_query($sqlSelect) or die (mysql_error());
	
return $RSobj;
}
Medlem sedan dec. 200012 464 inlägg
#2
SELECT t2.username,t2.memberID,DATE_FORMAT(t2.last_visit, '%Y-%m-%d %H:%i'),t3.activity
  from  tblmyfriends AS t1 join tblmember AS t2
 on t1.friendId = t2.memberid
 left join tblonline AS t3 on t2.memberid = t3.memberid
WHERE t1.memberID = $ID 
ORDER BY $orderby $sort
Medlem sedan apr. 20041 597 inlägg
#3

Jag ska analysera ditt exempel nu Lars för jag inser när jag tittar på din sql-sats att det går att skriva de betydligt kortare än vad jag gör! (y)

Medlem sedan apr. 20041 597 inlägg
#4

LarsG skrev:

SELECT t2.username,t2.memberID,DATE_FORMAT(t2.last_visit, '%Y-%m-%d %H:%i'),t3.activity
  from  tblmyfriends AS t1 join tblmember AS t2
 on t1.friendId = t2.memberid
 left join tblonline AS t3 on t2.memberid = t3.memberid
WHERE t1.memberID = $ID 
ORDER BY $orderby $sort

Var kommer $letter-variabeln med i WHERE-satsen? Jag vill ju, om den är satt enbart visa alla användare som börjar med just den bokstaven.

Medlem sedan dec. 200012 464 inlägg
#5
$q = "SELECT t2.username,t2.memberID,DATE_FORMAT(t2.last_visit, '%Y-%m-%d %H:%i'),t3.activity " .
 " from  tblmyfriends AS t1 join tblmember AS t2 " .
 " on t1.friendId = t2.memberid " .
 " left join tblonline AS t3 on t2.memberid = t3.memberid " .
 " WHERE t1.memberID = " . $ID 
if  isset($letter)  $q .= "and t2.username = '" . $letter . "'"
$q .= " ORDER BY " . $orderby " " . $sort
Medlem sedan apr. 20041 597 inlägg
#6

Får felmeddelande på den fetmarkerade raden (394).

Parse error: parse error, unexpected T_IF in include.function.php on line 394

LarsG skrev:

$q = "SELECT t2.username,t2.memberID,DATE_FORMAT(t2.last_visit, '%Y-%m-%d %H:%i'),t3.activity " .
 " from  tblmyfriends AS t1 join tblmember AS t2 " .
 " on t1.friendId = t2.memberid " .
 " left join tblonline AS t3 on t2.memberid = t3.memberid " .
" WHERE t1.memberID = " . $ID 
[B]if  isset($letter)  $q .= "and t2.username = '" . $letter . "'" $q .= " ORDER [/B] BY " . $orderby " " . $sort
Medlem sedan dec. 200012 464 inlägg
#7

Jaha ja, det skall vara ; i slutet i PHP.

" WHERE t1.memberID = " . $ID  ;
if  isset($letter)  $q .= "and t2.username = '" . $letter . "'" ;
 $q .= " ORDER  BY " . $orderby " " . $sort;
Medlem sedan apr. 20041 597 inlägg
#8

Nu får jag följande fel:

Parse error: parse error, unexpected T_ISSET, expecting '(' in /xxx/include.function.php on line 394

if  isset($letter)  $q .= "and t2.username = '" . $letter . "'" ;
 $q .= " ORDER  BY " . $orderby " " . $sort;

Det blir fortfarande fel på rad 394 (isset($letter)...osv)

Medlem sedan juni 200032 967 inlägg
#9

Två saker:

  1. Villkor skall vara inom parentes när du använder php.
if (isset($letter)) ...
  1. Du saknar en punkt mellan $orderby och " ".
Medlem sedan apr. 20041 597 inlägg
#10

Nu försvinner felmeddelandet men SQL-satsen som sådan gör inte det jag hade tänkt.

Det jag vill åstadkomma var att kunna högst upp under "Mina kontakter" först skriva ut begynnelsebokstäverna i form av länker för de användare jag har i min kontaktlista. Det har vi löst sedan tidigare.

Det som inte fungerar nu är att när jag trycker på en bokstav (länken ser ex. ut så här "http://www.flygfyren.nu/myprofile_contacts.php?list=F"). Då får jag fortfarande upp samtliga mina kontakter. Jag borde enbart få upp samtliga användare vars användarnamn börjar med "F".

Så här ser funktionsanropet ut:


function listMyContacts($ID, $orderby='friendusername', $sort='ASC', $letter='all') {
KOD KOD
}

$letter-variabeln är satt till "all" i funktionen när php-sidan öppnas första gången.

Medlem sedan juni 200032 967 inlägg
#11

Exakt hur ser SQL-frågan ut när du klickat på bokstavslänken för att få ut de som börjar på ex. F?

mvh

Medlem sedan apr. 20041 597 inlägg
#12
$q = "SELECT t2.username,t2.memberID,DATE_FORMAT(t2.last_visit, '%Y-%m-%d %H:%i'),t3.activity " .
 " from  tblmyfriends AS t1 join tblmember AS t2 " .
 " on t1.friendId = t2.memberid " .
 " left join tblonline AS t3 on t2.memberid = t3.memberid " .
" WHERE t1.memberID = " . $ID  ;
if  (isset($letter))  $q .= "and t2.username = '" . $letter . "'" ;
 $q .= " ORDER BY " . $orderby . " " . $sort;

Jag vill få ut....

- Användarnamn, användarID, tid för senaste aktivitet.

Medlem sedan juni 200032 967 inlägg
#13

Jag vill se den färdiga SQL-frågan, det där går ju inte att förstå någonting utav.

echo($q) alltså.

Medlem sedan apr. 20041 597 inlägg
#14

Sorry...

Här kommer svaret...

SELECT t2.username,t2.memberID,DATE_FORMAT(t2.last_visit, '%Y-%m-%d %H:%i'),t3.activity 
FROM tblmyfriends AS t1 join tblmember AS t2 on t1.friendId = t2.memberid left join tblonline AS t3 on t2.memberid = t3.memberid 
WHERE t1.memberID = 1 AND t2.username = 'all' ORDER BY friendusername ASC
Medlem sedan apr. 20041 597 inlägg
#15

Jag tror jag ser felet...

I WHERE-villkoret står det att alla användarnamn som är likka med "ALL" skall vara med. Men det finns ju knappast någon användare som börjar med "ALL".

Jag anser att jag måste ha med substring(t1.friendusername FROM 1 FOR 1) = '".$letter."' som jag hade i en tidigare funktion för att visa medlemmarna bokstavsvis. Denna sql-funktion plockar ut begynnelsebokstaven för alla de medlemmar som är registrerade och grupperas svaret bokstavsvis.

Här måste jag göra på ett liknande sätt. Plocka ut enbart de användare som i det här fallet börjar på en viss bokstav som bestäms av variabeln $letter.

Medlem sedan juni 200032 967 inlägg
#16

I WHERE-villkoret står det att alla användarnamn som är likka med "ALL" skall vara med. Men det finns ju knappast någon användare som börjar med "ALL".

Nej, du får göra en if-sats i PHP-koden som bara lägger till den delen av WHERE-satsen om värdet är något annat än all. Ändra alltså ditt isset-villkor.

Här måste jag göra på ett liknande sätt. Plocka ut enbart de användare som i det här fallet börjar på en viss bokstav som bestäms av variabeln $letter.

För att göra sökningar är det bara att använda operatorn LIKE och wildcardet %.

....
"and t2.username LIKE '" . $letter . "%'" ;
....
260 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)