Just nu i M3-nätverket
Gå till innehåll

Hämta värde ur array


Rikard Nilsson

Rekommendera Poster

Rikard Nilsson

$qUser = "SELECT userID, firstName, lastName FROM $DBInfo->TblUsers";

$qUserResult = mysql_query($qUser);

$qUserRow = mysql_fetch_array($qUserResult);

 

Om jag nu vill skriva ut firstName och lastName för id 3... Hur bär jag mig åt?

 

print($qUserRow[3]["firstName"]["lastName"]) typ.

 

Jag får inte riktigt ihop hur jag skall få printat ut Förnamn och Efternamn där userID är X.

 

Jag är ute efter nåt liknande denna schema:

+--------+-----------+----------+

| userID | firstName | lastName |

+--------+-----------+----------+

| 1 | Rikard | Nilsson |

| 2 | Pella | Olsson |

| 3 | Kalle | Kaviar |

+--------+-----------+----------+

 

Då samma info skall visas på många ställen, så vill jag inte göra en ny fråga mot db för varje loop, utan bara hämta ut info med userID X.

 

Pointer eller lösning är välkommet.

 

[inlägget ändrat 2002-05-03 11:04:57 av Rikard Nilsson]

Länk till kommentar
Dela på andra webbplatser

När du använder funktonen mysql_fetch_array() så hämtar den aktuell rad, och flyttar sedan pekaren till nästa. Så för att få id 3 måste du använda funktonen 3 ggr. Ex:

$rad1 = mysql_fetch_array($qUserResult);

// Rad 1 = Rikard ...

$rad2 = mysql_fetch_array($qUserResult);

// Rad 2 = Pella

$rad3 = mysql_fetch_array($qUserResult);

// Rad 3 = Kalle

 

Vanligtvis använder man en while-sats för att hämta rader ur en fråga.

Ex.

while ($qUserRow = mysql_fetch_array($qUserResult)) {

// Skriv ut hela arrayen

print_r($qUserRow);

}

 

Testa ovanstående så förstår du hur det funkar. Den loopar igenom 3 ggr.

 

Om du bara vill ha ID 3 föreslår jag att du i SQL-frågan infogar "WHERE userID = 3". Ex:

"SELECT userID, firstName, lastName FROM $DBInfo->TblUsers WHERE userID = 3"

 

Om du har gjort frågan som du har i exemplet, kan du också hoppa till en specifik rad med funktonen mysql_data_seek()

Ex.

mysql_data_seek($qUserResult, 3)

Följt av:

$qUserRow = mysql_fetch_array($qUserResult)

Nu innehåller $qUserRow rad nr. 3.

 

Frågor?

 

//Cariad

 

Länk till kommentar
Dela på andra webbplatser

Rikard Nilsson

Jo, ja brukar använda mig av den while-slingan för att printa ut saker, men nu så skall jag matcha ett ID mot en annan tabell, och hämta ut namn och ville slippa att göra en ny fråga mot db vid varje loop, då ID är endast 3-4 olika.

 

kan man på nåt sätt

$i = "0";

while ($row = mysql_fetch_array($result)) {

 

$userFirstName[$i] = $row["firstName"];

$userLastName[$i] = $row["lastName"];

 

$i++;

}

 

och hämta ut rätt värde med print($userFirstName[2]); tex?

 

Eller e ja helt ute å cyklar?

Och hur länge håller $userLastName[X] sin info?

 

Tills all kod är körd eller tills sidan är laddad?

 

 

Jag vill undvika onödiga db-förfrågningar där det är möjligt för att få en sån snabb, stabil och lättjobbad kod som möjligt.

 

Jag skall labba lite under eftermiddan och se hur de går...

 

Tack så länge.

 

Länk till kommentar
Dela på andra webbplatser

Rikard Nilsson

Ok, jag har nu hittat en lösning som funkar som jag hade tänkt mig från början:

 

$qUser = "SELECT userID, firstName, lastName FROM $DBInfo->TblUsers";

$qUserResult = mysql_query($qUser);

 

while ($qUserRow = mysql_fetch_array($qUserResult)) {

$userFirstName[$qUserRow["userID"]] = $qUserRow["firstName"];

$userLastName[$qUserRow["userID"]] = $qUserRow["lastName"];

}

 

print($userFirstName[3] . " " . $userLastName[3]);

 

Den koden hämtar ut Förnamn och Efternamn med userid 3.

 

Tackar för hjälpen å ett poäng bör du hitta där...

Hoppas de kanske hjälper nån annan med liknande probs.

 

Länk till kommentar
Dela på andra webbplatser

Lösningen du valt funkar ju, men är inte optimal ;)

Du säger att du ska matcha värdet ur en annan tabell? Kan du inte tänka dig att använda en JOIN-sats i SQL-frågan då?

Då får du mycket bättre struktur och hastighet i skriptet.

Det är svårt att ge ett konkret exempel eftersom jag inte vet hur hela applikationen ser ut.

Jag hjälper dig gärna skapa en lite mer avancerad SQL-fråga om du vill.

 

Inget är mer upphetsande än effektivt skriven kod ;)

 

Länk till kommentar
Dela på andra webbplatser

Rikard Nilsson

Ok, skall försöka förklara hur de två tabellerna ser ut:

 

TblAF[afIF|afName|afAddress|afAddedBy]

TblUsers[userID|firstName|lastName]

 

 

Det som jag listar på sidan är:

Namn: (Skriver ut afName)

Adress: (skriver ut afAddress)

afAddedBy: (detta är ett nummer, tex 2 och detta nummer skall hämta 'firstName' 'lastName' från 'userID = 2' från TblUsers)

 

Det är de den skall göra.

Den skall hämta för och efternamn från userID X som matchar 'afAddedBy'

 

Har inte mixtrat nåt med joins eller aliases, pga dess komplexitet då jag inte har behövt de förrns nu...

 

Så, om du har några bra exempel så är jag mer än tacksam för länkar eller så.

 

PS. Mysql DOC's är mer förvirrande är hjälpande...

 

//Rikard

 

[inlägget ändrat 2002-05-05 18:07:12 av Rikard Nilsson]

Länk till kommentar
Dela på andra webbplatser

Testa följande SQL-fråga då:

SELECT * FROM TblAF LEFT JOIN TblUsers ON TblAF.afAddedBy=TblUsers.userID

 

Då får du en lista med alla poster i TblAF, med kolumnerna från TblUsers i också. Testa så förstår du.

 

Om du nu bara vill hämta alla poster som har laggts till av (afAddedBy) användare 3, så är det bara att infoga en WHERE-sats efter:

 

SELECT * FROM TblAF LEFT JOIN TblUsers ON TblAF.afAddedBy=TblUsers.userID WHERE afAddedBy = 3

 

PS. MySQLs dokumentation är väl inte direkt nåt underverk, men den fungerar.

 

Länk till kommentar
Dela på andra webbplatser

Rikard Nilsson

Kanon, de funkar som de var tänkt.

 

 

Om du har tid...

Vad har jag gjort?

Hur funkar det och varför?

 

 

 

Länk till kommentar
Dela på andra webbplatser

Tja, jag kan väl förklara, mot en poäng i betalning ;)

 

Det frågan gör är att den först hämtar allt ur TblAF:

SELECT * FROM TblAF

+------+--------+-----------+-----------+
| afIF | afName | afAddress | afAddedBy |
+------+--------+-----------+-----------+
| t1   | t1     | t1        |         3 |
| t2   | t2     | t2        |         3 |
+------+--------+-----------+-----------+

 

Nästa del är LEFT JOIN, som på den befintliga tabeller fäster, från vänster, an annan tabell:

LEFT JOIN TblUsers

+--------+-----------+----------+
| userID | firstName | lastName |
+--------+-----------+----------+
|      1 | a         | a        |
|      2 | b         | b        |
|      3 | c         | c        |
|      4 | d         | d        |
+--------+-----------+----------+

 

Sedan ON satsen, som visar vilka värden som ska matchas:

ON TblAF=TblUsers.userID

 

Så du har en fast tabell (den som du väljer först) och sedan dupiceras innehållet i LEFT JOIN tabellen så många gånger som den förekommer med matchningen ovan, och läggs till efter den befintliga:

+------+--------+-----------+-----------+--------+-----------+----------+
| afIF | afName | afAddress | afAddedBy | userID | firstName | lastName |
+------+--------+-----------+-----------+--------+-----------+----------+
| t1   | t1     | t1        |         3 |      3 | c         | c        |
| t2   | t2     | t2        |         3 |      3 | c         | c        |
+------+--------+-----------+-----------+--------+-----------+----------+

 

Om du har en post med afAddedBy = 4 i TblAF, men ingen med motsvarande i TblUsers, så får du tomma fält (eller fyllda med NULL).

 

Fält som bara finns i TblUsers, men inte i TblAF ignoreras helt enkelt.

 

[inlägget ändrat 2002-05-05 19:33:48 av Cariad]

Länk till kommentar
Dela på andra webbplatser

Rikard Nilsson

Ahh *nu börjar pengen sakta trilla ner*

 

Tackar än en gång.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...