Gå til innhold

[løst]Sliter med loop i loop


Anbefalte innlegg

Hei,

 

skal skrive ut en liste med nummer, melding og dato.

Dette går fint i seg selv. Men når jeg prøvde å lage en sjekk som sjekker om nummer er i kontaktlista mi og bytte ut nummer med navn så kødder den. Den innerste loopen blir kun kjørt engang.

 

har lest litt rundt på dette, men kan ikke si at jeg blir helt klok. Håper dere kan hjelpe meg litt..

 

   echo "<table valign=\"top\" width='400'><tr valign=\"top\" align='center'>";
   echo "<td>Til</td><td width=\"200\">Melding</td><td >Tidspunkt</td></tr>";
   while($row = mysql_fetch_array($result)) {
   
   	echo "<tr align='center'><td>";
   	
   	while($rowc = mysql_fetch_array($rescontact)) {
     if($rowc['contactnumber'] == $row['til']){
     echo $rowc['contactname'];
     }
     else{
     echo $row['til'];
     }
   	}
   	
   	echo "</td>";  
   	
   	echo "<td >".$row['melding']."</td>";
   	echo "<td>".$row['sendt']."</td>";
   }
   

   echo "</tr>";
   echo "</table>"; 


Endret av Wabby
Lenke til kommentar
Videoannonse
Annonse

Det finnes egentlig to løsninger på dette som jeg kan komme på farta:

 

Den ene er å hente ut alle konktene fra $rowc ut i et array. Noe slik

 

PHP

while($rowc= mysql_fetch_array($rescontact))

{

$brukere[$rowc['contactnumber']] = $rowc['contactname'];

}

 

 

echo "<table valign="top" width='400'><tr valign="top" align='center'>";

echo "<td>Til</td><td width="200">Melding</td><td >Tidspunkt</td></tr>";

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

echo "<tr align='center'><td>";

echo $brukere[$'row['til']];

echo "</td>";

echo "<td >".$row['melding']."</td>";

echo "<td>".$row['sendt']."</td>";

}

echo "</tr>";

echo "</table>"; 

Utestet. Men tror det skal fungere.

 

Den andre blir å kjøre en JOIN i spørringen. Er ikke helt stabil på dette. Men er garantert noen andre her som kan hjelpe deg med det :)

Lenke til kommentar

www.php.net/in_array i stedet for å sjekke med "if".

Noe sånt:

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

$tlfNr[] = $row['til'];

}

 

while($rowc = mysql_fetch_array($rescontact)) {

 if(in_array($rowc['contactnumber'], $tlfNr){

 echo $rowc['contactname'];

 }

 else{

 echo $row['til'];

 }

}

Lenke til kommentar

Hah såg på film mest eg skreiv. To stykken før meg :p

 

Kvar blir $rescontact og $result definert? Hugs at første gang du looper $rescontact så tømmer du den og neste gang er blir den ikkje loopa.

 

Ein bedre løsing er å loope $rescontact før du looper $result, og putte alle nummra i ein array ($contacts). Og så gjør du if(array_key_exists($row['til'], $contacts)) echo $contacts[$row['til']];

Endret av Runar0
Lenke til kommentar

Dette er ikke en optimal løsning med tanke på ressursbruk.

Kan du ikke løse dette med kun en sql spørring mot flere tabeller samtidig ?

 

F.eks noe slikt vil være en bedre løsning, men blir litt vanskelig å si noe konkret uten av jeg vet noe om tabell definisjonene dine og hvordan informasjonene blir lagret.

SELECT t1.melding, t1.dato, t2.navn FROM meld_tabell t1, bruker_tab t2
WHERE t1.id = t2.fid

Lenke til kommentar

problemet der med din spørring er at den ville kun hentet ut de SMSene som var sendt til folk som jeg hadde lagret i Contacts. Saken er at den skal hente ut hele lista og dersom nummeret eksisterer i Contacts så skal den erstattes med navn. eks:

 

Jan Teigen - bla bla bla - 12.08.07 - 14:35

997733231 - hei hei bla - 12.08.07 - 14:22

Per Christian Foss - hest er best - 12.08.07 - 14:12

47474747 - mer blabla - 11.08.07 - 11:42

 

Men vil jo tro at den blir tung i det lange løp. Allerede nå så henter den opp 150 SMS i historikken.

 

Slik er koden nå:

while($rowc= mysql_fetch_array($rescontact))
   {
   $brukere[$rowc['contactnumber']] = $rowc['contactname'];
   }


   while($row = mysql_fetch_array($result)) {
   echo "<tr align='center'><td>";
   if ($brukere[$row['til']] == null or $brukere[$row['til']] == ''){
   echo $row[til];
   }
   else{
   echo $brukere[$row['til']];
   }

   echo "</td>";  
   echo "<td >".$row['melding']."</td>";
   $tid = $row['sendt'];
   
   echo "<td>".$row['sendt']."</td>";
   }

 

SQL'en

    
Select smsnr,fra,til,melding,date_FORMAT(sendt, '%e %M %Y - %H:%i:%s') as sendt FROM sms where fra like '$username' order by smsnr desc
  
Select * FROM mycontacts where contactowner like '$username'

Endret av Wabby
Lenke til kommentar

Da tror jeg du bør se på hvordan du lagrer informasjonen, og kanskje vurdere om ikke du må endre litt på strukturen i databasen din slik at du ikke har en haug med unødvendigeoppslag, spesielt hvis du skal lagre mange forekomster.

Hvis du finner ut at du bør gjøre noen endringer, så kan denne artikelen kanskje være greit å ta en titt på: Database Normalization And Design Techniques

 

Hvilket felter i har du i mycontacts tabellen. (Og bruk kun SELECT * FROM ... når du trenger absolutt alle feltene, hvis ikke så spesifiser kun de du trenger.)

 

Du kan gjøre en hel haug med sql og subqueries o.l, men dette er ikke det jeg kan mest om (enda?), så jeg tror det skal være mulig å optimalisere koden din.

Endret av crowly
Lenke til kommentar

Jeg kan egentlig gjøre det så enkelt at jeg lager en kolonne til i SMS der jeg har contactname, og kjøre en isnull(contactname,smsnr) om det finnes i mysql da.

 

Jeg er egentlig en MS SQL mann :p Det jeg jobber daglig med.

 

Siden er i utgangspunktet brukt for å lære meg litt PHP og ting blir laget sånn litt etter litt... Oi nå vil jeg lage en sms side...

humm... kanskje lagre SMSene og

ja, nå vil jeg også lage en SMShistory side.

hummm... nå er jeg lei av å skrive nummerene, nå lager jeg contactliste.

 

siden blir liksom laget ettersom jeg gidder, og da blir det rot :p

Endret av Wabby
Lenke til kommentar
og kjøre en isnull(contactname,smsnr) om det finnes i mysql da.
ser slikt ut ISNULL(expr)

 

Jeg er egentlig en MS SQL mann  Det jeg jobber daglig med.

Da burde jo dette være ganske grei skuring for deg ... er mest kjent med Oracle Forms/SQL og Pl/Sql selv, så overgangen til PHP var ikke så veldig vanskelig, da det storsett bare er syntax'en som er forskjellig.

 

siden blir liksom laget ettersom jeg gidder, og da blir det rot

Er en kjedelig jobb, men man bør jo ta seg tid til å rydde opp i gamle synder. Men det kommer vel også litt ann på hvor ofte systemet blir brukt, hva slags system det blir kjørt på og hvor mye annet som evt blir kjørt på samme system samtidig. Er ikke sikkert at kode optimalisering trenger å være så høyt prioritert, men det skader ikke å venne seg til å kode skikkelig med en gang, så man ikke legger til stygge uvaner.

Endret av crowly
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...