lillebrorMedlem sedan apr. 20041 687 inlägg
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;
}
LarsGMedlem sedan dec. 200012 465 inlägg
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
lillebrorMedlem sedan apr. 20041 687 inlägg
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)
lillebrorMedlem sedan apr. 20041 687 inlägg
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.
LarsGMedlem sedan dec. 200012 465 inlägg
$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
lillebrorMedlem sedan apr. 20041 687 inlägg
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
LarsGMedlem sedan dec. 200012 465 inlägg
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;
lillebrorMedlem sedan apr. 20041 687 inlägg
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)
@ndersMedlem sedan juni 200026 914 inlägg
Två saker:
- Villkor skall vara inom parentes när du använder php.
if (isset($letter)) ...
- Du saknar en punkt mellan $orderby och " ".
lillebrorMedlem sedan apr. 20041 687 inlägg
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.
@ndersMedlem sedan juni 200026 914 inlägg
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
lillebrorMedlem sedan apr. 20041 687 inlägg
$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.
@ndersMedlem sedan juni 200026 914 inlägg
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å.
lillebrorMedlem sedan apr. 20041 687 inlägg
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
lillebrorMedlem sedan apr. 20041 687 inlägg
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.
@ndersMedlem sedan juni 200026 914 inlägg
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 . "%'" ;
....