PHP/MYSQL !!!???!!!

Tags:    php

Jeg sidder i øjeblikket og flår i mit hår.

Jeg har forgæves prøvet at lære hvordan de to ting hænger sammen, men uden held.

Jo jeg kan da godt tage og copy/paste et eksempel, og det virker udemærket, men problemet er at problemerne altid er forud defineret uden nogen dybere forklaring på hvad der egentlig sker.

fx for at 'hente' al data i tabelen personer skriver jeg:
$query = mysql_query("SELECT * FROM personer");
Det giver meget god mening, men jeg har ingen idé om hvad $query egentlig indeholder, kun at jeg skal bruge endnu en funktion som fx. mysql_fetch_assoc($query), for at få fat i dataerne, men jeg har ingen idé om hvad den gør og jeg kan ikke finde ud af at benytte den til andet end i den forud deffinerede eksempel, hvor funktionen ydermere bliver brugt i forbindelse med et while loop på en måde som heller ikke er særlig forståeligt.

Lad mig slå det helt fast at jeg er en rimmelig inteligent fyr der i i flere år både har leget med html, css, php, c/c++ etc., men her hvor man tager 2 forskellige "sprog" og kombinerer dem og så uden nogen ordenlig forklaring, bliver jeg altså fustreret.

Jeg har brug for en ORDENLIG guide og jeg håber ved gud at der er en eller anden der kender til en. Jeg har snart ikke mere hår tilbage...

På forhånd tak.



Indlæg senest redigeret d. 04.11.2007 20:59 af Bruger #4414
mysql_query returnere en resourse så $query er denne resource, ved SELECT, ved select har den resource en intern pointer der peger på en række i resultatet.

funktionerne mysql_fecth_assoc tager den række som denne pointer peger på og returnere den på et associativ array hvor indeksnes i arrayet svarer til felternes navne i resourcen,derefter rykker funktion pointeren til den næste række i resultatet. Hvis pointeren ikke peger på nogen række returneres false. Derfor virker while løkken:

while($row=mysql_fetch_assoc($query)){
--
}
ved at den bliver ved at for hver iteration tildele $row et associativ array der passer til en række i resultatet. Og da mysql_fetch_assoc rykker den interne pointer for hvert kald vil den tilsidst pege på ingen ting og returnere FALSE hvad gør at $row er false som så stopper løkken.
så koden inde i løkken bliver udført 1 gang for hver række i resultatet i $query og $row vil have det være et associativ array for den pågældende række.




Det vil så sige... tror jeg... at $query slet ikke indeholder data fra databasen, men pointere til hvor i databasen dataerne er placeret. Og så kan man derefter bruge fetch til at hente dataerne?

Jeg synes ærlig talt det lyder lidt ånsvagt.

Ikke desto mindre fik jeg ihvert fald while løkken på plads og det var da en start.



Et par eksempler :

$query = mysql_query("SELECT * FROM personer") or die mysql_error());
$row = mysql_fetch_array($query);

$navn=$row['navn'];//giver den første værdi i 'navn'

while($row = mysql_fetch_array($query)){
$navn[$i++]=$row['navn']);//giver alle værdier i 'navn' indekseret med $i
}

//her skrives navn og alder ud i en tabel (hvis de findes i DB)
$query = mysql_query("SELECT * FROM personer") or die mysql_error());
while($row = mysql_fetch_array( $query)) {
echo "<tr><td>";
echo $row['navn'];
echo "</td><td>";
echo $row['alder'];
echo "</td></tr>";
}

Håber det er en hjælp :|



Det er jo endnu et af de eksempler der florerer på nettet, men tak for det.



det er da ikke så åndsvagt igen, hvis du skulle have den ud som en eller anden php data type skulle, mysql_query jp selv køre hele resultatet igennem og lave data typen. Og hvis du så ville gøre noget for hver række som f.eks. udskrive den skulle du kører den returneret data igennem igen. Ved at lade dig kører resourcen igennem sparer man et helt gennemløb af dataene.
Men hvis du ikke vil have det sådan er det jo bare at lave nogle functioner der simulere det andet.

f.eks noget i retning af:
Fold kodeboks ind/udKode 




så kan jeg tilgå dataerne som fx. "$a[n]['navn']"?
Det kunne være smart.



det ville du kunne(forudsat jeg skrev rigtigt og n er et tal og er i mellem 0 og antallet af rækker), men det er ikke særligt smart for som jeg sagde koster det en hel gennemkørsel af resultatet for queryen.



t