webForumDet fria alternativet

Visa kontaktlista

15 svar · 632 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 687 inlägg
#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;
}
LarsGMedlem sedan dec. 200012 465 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
lillebrorMedlem sedan apr. 20041 687 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)

lillebrorMedlem sedan apr. 20041 687 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.

LarsGMedlem sedan dec. 200012 465 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
lillebrorMedlem sedan apr. 20041 687 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
LarsGMedlem sedan dec. 200012 465 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;
lillebrorMedlem sedan apr. 20041 687 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)

@ndersMedlem sedan juni 200026 914 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 " ".
lillebrorMedlem sedan apr. 20041 687 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.

@ndersMedlem sedan juni 200026 914 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

lillebrorMedlem sedan apr. 20041 687 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.

@ndersMedlem sedan juni 200026 914 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å.

lillebrorMedlem sedan apr. 20041 687 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
lillebrorMedlem sedan apr. 20041 687 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.

@ndersMedlem sedan juni 200026 914 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 . "%'" ;
....
Genererad på 380 ms · cache AV · v20260730165559-full.f96bc7eb