MYSQL - Få ut rader med samma värde?

Permalänk

MYSQL - Få ut rader med samma värde?

Jag har för ett par dagar sen börjat pilla lite med MYSQL, och känner inte till många ord än.
Jag har provat att söka här och på google men inte hittat nått, så jag trådar istället:

Jag har en vill få ut alla rader som har "statuscheck" "1" som värde, i en tabell som ser ut såhär:

username: userpassword: mail: statuscheck:
Etta........ blabla.............bla......1
nolla........ blabla.............bla......0
nollb........ blabla.............bla......0
nollc........ blabla.............bla......0
Ettb......... blabla.............bla......1
Ettc........ blabla..............bla......1

jag har gjort en for-sats som kollar hur många som har en etta, och kör en sån här varje gång:

${"strang" . $i} = $db_data['username'];
$langd=$langd . ${"strang" . $i} . " Och ";

och när det inte finns fler printar jag ut denna:

print "&myUsers=" . $langd;

Då får jag bara ut detta i "&myUsers":

Etta Och Etta Och Etta Och

När jag vill ha ut det här:
Etta Och Ettb Och Ettc Och

Jag kan också säga att db_data ser ut såhär:
$db_data=mysql_fetch_assoc(mysql_query("SELECT * FROM $tbl_name WHERE statuscheck='1'"));

Hur löser jag det? Det borde ju inte vara så svårt...

Permalänk
Medlem

Hur ser din for-sats ut? jag tror du glömmer att hoppa fram i arrayen? vad är förövrigt den här koden tänkt att göra?

${"strang" . $i} = $db_data['username']; $langd=$langd . ${"strang" . $i} . " Och ";

Ska du bara slå ihop allt till en sträng borde det under fungera

$langd = ""; foreach($db_data as $db_rad) { $langd .= $db_rad["username"] ." och "; }

Permalänk

Min for-sats ser ut såhär:

for ($i = 1; $i <= mysql_num_rows($fetch); $i++) {

"$fetch" ser ut såhär:

$fetch = mysql_query("SELECT * FROM $tbl_name WHERE statuscheck='1'") or die(mysql_error());

vad är "$db_rad" i detta fallet? vad ska en ges för värde? är det samma som jag har "fetch" eller?

Koden är till en flash-chatt och just detta skriptet kollar om user=1, isåfall är den online och ska printas ut i ett textfält i flash som heter "usersOnline" eller något. Flashen skickar att usern=1 en gång i minuten.

Jag har dock inget skript som sätter usern till 0 om den inte skulle vara online, men jag ser det som ett senare problem

Tack för svar!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av dennis_canis
Min for-sats ser ut såhär:

for ($i = 1; $i <= mysql_num_rows($fetch); $i++) {

isåfall borde du skriva om
${"strang" . $i} = $db_data['username'];
till
${"strang" . $i} = $db_data[$i]['username'];

Om vi tar det från början så är $db_data en tvådimensionell array, där $i kommer representera en träff/rad från din databas.

$db_data[0]['username'] kommer ge Etta
$db_data[1]['username'] kommer ge Ettab
osv

foreach koden jag skrev bryter egentligen bara ner den här tvådimensonella arrayen. och $db_rad kommer vara $db_data[0] första rundan den körs. och $db_data[1] andra gången.

Har du använt funktionen var_dump() någon gång?. den är välldigt bra om man vill se hur data ser ut i en variabel ser ut för stunden, skriv ut

var_dump($db_data)

så får du se hur datan är lagrad

Permalänk

Tack, det var det jag letade efter. Något som definierade raden som den skulle läsas från... har bara programmerat i AS 2.0 innan så php och allt det där är lite nytt för mig.

Det verkar dock inte som om det funkar, här är hela raden:

$fetch = mysql_query("SELECT * FROM $tbl_name WHERE statuscheck='1'") or die(mysql_error()); $u=1; $langd=""; for ($i = 1; $i <= mysql_num_rows($fetch); $i++) { $db_data=mysql_fetch_assoc(mysql_query("SELECT * FROM $tbl_name WHERE statuscheck='1'")); $u++; ${"strang" . $i} = $db_data[$i]['username']; $langd .= ${"strang" . $i} . " Och "; print "&myUsers=" . ${"strang" . $i}; if($u > mysql_num_rows($fetch)){ print "&myUsers=" . $langd; } }

Jag kan inte se vad som är fel :S

Permalänk
Medlem

Vad är grejen med ${"strang" . $i}? Det ser ut som om du skapar en ny variabel med dynamiskt namn för varje iteration av $i, men varför? $langd antyder för mig iaf att den ska innehålla längden eller antalet rader i query-resultatet. Det kan du räkna ut samtidigt som du bearbetar raderna, eller så gör du det i med ett COUNT()-direktiv i SQL. En annan sak är att du kör queryn på nytt för varje rad i loopen.

Här är ett enkelt (och otestat) exempel på hur man kan göra.

$result = mysql_query("SELECT * FROM $tbl_name WHERE statuscheck='1'") or die(mysql_error()); $out = ''; $langd = 0; while ($row = mysql_fetch_assoc($result)) { $name = $row['username']; $out .= $name . ' Och '; $langd++; } echo $out, '=', $langd;

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Works like a charm Tack så jättemycket!

Som sagt, jag är nybörjare på php mysql etc etc så jag hittar på egna ful-lösningar än så länge Koden du skickade var helt klart mer effektiv.

Nu när detta fungerar, någon som har förslag på hur man nollställer ettorna?

Såhär händer:
SWF (flash)-filen har en timer på X antal sekunder, när timern pulserar skickas en variabel till mysql som säger att inloggnings-namnet är online (alltså "1").

Finns det något skript som kan köras i mysql utan att man använder filerna, så man kan nollställa dom om den variabeln inte skulle skickas i tid (dvs om webbläsarfönstret är stängt och flashen inte körs)?

Eller någon som har något förslag på en sådan lösning? Tack

Permalänk
Medlem

Hmm, man loggar alltså in för att komma åt spelen? Då föreslår jag att du inte håller koll på inloggade användare med databasen. Använd sessioner istället och den superglobala variabeln $_SESSION. Googla på PHP session för mer info.

edit: vet inte var jag fick "spelen" ifrån. Skyller på att jag käkat för mycket socker :\

Visa signatur

Kom-pa-TI-bilitet