Bekijk Volledige Versie : simpel php vraagje
Ik heb een vraagje over het ophalen van een record d.m.v. een PHP query.
Op de volgende manier gaat het wel, maar hij lijkt me wat omslachtig omdat er toch maar 1 waarde in de database zit (hij haalt slechts de waarde van de naam op van het record met 1 bepaald uniek id):
<?php $huidigecat = mysql_query("SELECT naam FROM categorie WHERE cat_id='$cid'"); ?>
<?php
while($row = mysql_fetch_array($huidigecat))
{
echo $row['naam'];
}
?>
Waarschijnlijk is het heel makkelijk maar ik ben aan het overstappen van ColdFusion en ASP naar PHP en ik kan het niet uitstaan dat het mij niet lukt. Met ColdFusion was bijvoorbeeld deze variabele #huidigecat.naam# direct geldig om de naam te krijgen. Met PHP zou deze variabele dan $huidigecat.naam moeten heten, maar dat werkt dus niet. Weet iemand hoe je deze variabele in PHP schrijft, of zit ik toch altijd aan die while loop vast?
eXtreme Service
16/09/08, 03:30
<?php
while($row = mysql_fetch_array($huidigecat))
{
echo $row['naam'];
}
?>
Weet niet echt wat je wil bereiken maar misschien hetvolgende ?
<?php
$row = mysql_fetch_array($huidigecat);
echo $row['naam'];
?>
Dan zit je niet aan die while loop vast.
Is dit wat je wilt hebben ?
Ramon Fincken
16/09/08, 09:25
als je een LIMIT 1 toevoegt ( maar ook zonder ;) ) kun je je while door een if veranderen, of inderdaad
$row = mysql_fetch_array($huidigecat);
doen
<?php
$sql_huidigecat = "SELECT naam FROM categorie WHERE cat_id='".intval($cid). "' LIMIT 1";
// TODO: gaan we de DIE nog aanpassen?
$result_huidigecat = mysql_query($sql_huidigecat) or DIE();
if(mysql_num_rows($result_huidigecat) > 0)
{
$row_huidigecat = mysql_fetch_array($result_huidigecat);
echo $row_huidigecat['naam'];
}
else
{
echo 'Deze categorie bestaat niet meer';
// TODO: redirect naar homepage?
}
?>
Aha, okee bedankt. mysql_fetch_array heb je dus altijd nodig om iets uit een query te bekijken.
En dat laatste voorbeeld zal ook goed van pas gaan komen.
:)
Je krijgt van de query een result handle terug. Misschien handiger om die ook zo te noemen dan. Je moet altijd een tweede functie aanroepen om iets met die handle te doen.
D. ter Horst
16/09/08, 12:24
Of nog beter:
$query = mysql_query("SELECT naam FROM categorie WHERE cat_id=" . intval($cid));
$resultaat = msql_result($query, 0, 'naam');
echo $resultaat;
dreamhost_nl
16/09/08, 12:54
Ik mis toch wel wat :
$query = mysql_query('SELECT naam FROM categorie WHERE cat_id='.(int)$cid.' limit 0,1',$link);
//foutafhandling query komt hier
$val = mysql_result($query, 0, 0); // eerste waarde
echo $val;
Vooral de link naar de DB zou ik niet vergeten. Als je een tweede link krijgt, zie je anders door de bomen het bos niet meer.
D. ter Horst
16/09/08, 15:27
Ik mis toch wel wat :
$query = mysql_query('SELECT naam FROM categorie WHERE cat_id='.(int)$cid.' limit 0,1',$link);
//foutafhandling query komt hier
$val = mysql_result($query, 0, 0); // eerste waarde
echo $val;
Vooral de link naar de DB zou ik niet vergeten. Als je een tweede link krijgt, zie je anders door de bomen het bos niet meer.
Het lijkt me toch niet de bedoeling dat we een compleet script gingen schrijven? Daarnaast heeft hij het over 1 record dat bijgewerkt moet worden, foutcontrole kan maar is geen vereiste hier. Daarnaast hoeft de link niet meegegeven te worden wanneer men maar 1 database gebruikt, en werkt 0,0 ipv 0, 'veldnaam' net zo goed. Ook het getal als (int) casten is een slechtere oplossing dan intval gebruiken. Enige punt wat discutabel is de foutafhandeling wat mij betreft.
Ramon Fincken
16/09/08, 15:29
@daniel, ok werkt ook, maar vind ik persoonlijk lelijk, al was het maar dat je de query direct in een mysql_query gooit
@dreamhost: waarom eerste waarde?, ok we hebben nu een select naam ... maar stel we veranderen wat in de DB tabel structure ... dan wil je dit niet zo doen en al zeker niet als je meer wil selecten dan enkel een naam.
D. ter Horst
16/09/08, 15:36
Ramon,
Is een kwestie van smaak. Technisch gezien maakt het totaal geen verschil of je het nou wel of niet in een variabele zet en meegeeft aan mysq_query. Query's worden in de meeste gevallen niet aangepast, en heeft het dus geen zin om dubbelop te doen.
Overigens, door het in een variable te zetten reserveer je geheugen. Ook al is dit in dit geval een minimale hoeveelheid, in een loop kan dit wel degelijk een verschil maken voor de performance. Dan praten we wel over micro-optimalisatie, maar waarom zou je iets 'fout' aanleren.
Ik zou variabelen gewoon gebruiken waar ze voor zijn, en dat is voor variabele waarden ;)
Ramon Fincken
16/09/08, 15:39
ja klopt helemaal, maar voor debugging bijvoorbeeld is het net effe lekkerder om een echo $sql; te doen voor je $result=mysql_query($sql); dan zitten klooien in die ene regel. En ook dat is zeker een kwestie van smaak :)
Vergeet niet dat TS een beginner is :)
Wel leerzaam dit allemaal. :)
D. ter Horst
16/09/08, 16:34
ja klopt helemaal, maar voor debugging bijvoorbeeld is het net effe lekkerder om een echo $sql; te doen voor je $result=mysql_query($sql); dan zitten klooien in die ene regel. En ook dat is zeker een kwestie van smaak :)
Vergeet niet dat TS een beginner is :)
Daar heb je een punt ;) Al zou ik persoonlijk in een applicatie nooit direct mysql_query aanroepen voor een query als het aan mij lag, maar een Database Abstraction Layer implementeren.
We weten beiden wel waar we over lullen, en beide oplossingen zijn goed. Ik denk dat de TS het idee wel krijgt :P Mijn reactie was in eerste instantie ook niet op jou gericht, maar op Dreamhost_NL, welke wijzigingen in mijn code aangaf welke (op 1 na) niet correct waren.
Ramon Fincken
16/09/08, 16:37
amen :)
Nu we toch bezig zijn, nog even 1 belangrijk ding: mysql_close
Op 1 pagina doe ik wel eens een stuk of 5 verschillende queries. In ColdFusion hoefde ik nooit de connectie te sluiten. Maar met PHP moet dat wel lees ik op verschillende tutorials. Is het verstandig om helemaal onderaan elke PHP-pagina de connectie met mysql_close te sluiten? Want ik kan me voorstellen dat het 5x openen en sluiten per pagina het doel voorbijstreeft i.v.m. de overhead die dat kost?
systemdeveloper
16/09/08, 19:42
Nu we toch bezig zijn, nog even 1 belangrijk ding: mysql_close
Op 1 pagina doe ik wel eens een stuk of 5 verschillende queries. In ColdFusion hoefde ik nooit de connectie te sluiten. Maar met PHP moet dat wel lees ik op verschillende tutorials. Is het verstandig om helemaal onderaan elke PHP-pagina de connectie met mysql_close te sluiten? Want ik kan me voorstellen dat het 5x openen en sluiten per pagina het doel voorbijstreeft i.v.m. de overhead die dat kost?
Het is niet meer dan netjes, maar bij het beeindigen van het script wordt de connectie sowieso geclosed. Je doet over het algemeen 1 x een connect/open, n x een query en dan optioneel een close.
In bepaalde gevallen (slave dbservers, meerdere database servers, meerdere users) kun je gemakkelijk 5 connects hebben, maar dat zie je niet vaak.
Ramon Fincken
16/09/08, 20:22
ik heb er geen harde specs over, maar ik zelf sluit de connectie altijd.
@John, ja klopt al heb ik hier ergens gelezen dat dat ook een serverinstelling is en dus niet binnen 1 seconde automatisch gebeurt.
Triloxigen
16/09/08, 20:36
Zover ik weet wordt het direct bij het einde van het uitvoeren automatisch gesloten (tenzij dus gebruik wordt gemaakt van pconnect)
D. ter Horst
16/09/08, 20:37
Boys, niet zo moeilijk doen, de uitleg staat haarfijn op php.net:
Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.
Je maakt persistent connecties met mysql_pconnect, mysql_connect doet dat niet, en hoef je het dus niet af te sluiten volgens de php documentatie.
Ramon Fincken
16/09/08, 20:45
Kijk Daniel, ik heb gezien dat het meer dan significant in de laadsnelheid scheelt als je het afsluit ( bij de gewone connect ).
Ik zoek nu die discussie hier even op.
Triloxigen
16/09/08, 20:45
Maar documentatie is verreweg van heilig ;)
Ramon Fincken
16/09/08, 20:46
update: gevonden:
http://www.webhostingtalk.nl/technische-vragen-van-beginners/139469-mysql-automatisch-closen.html
systemdeveloper
16/09/08, 21:01
ik heb er geen harde specs over, maar ik zelf sluit de connectie altijd.
@John, ja klopt al heb ik hier ergens gelezen dat dat ook een serverinstelling is en dus niet binnen 1 seconde automatisch gebeurt.
True, pconnect() is in bepaalde gevallen handig en performance verhogend, maar je hebt idd. te maken met serverinstellingen, timeouts e.d.
Maar een close() wordt automatisch gedaan dus echt nodig is het niet. Al ben ik wel zeer voorstander van 'Wat je opent, dat sluit je ook'. MySQL is hier redelijk tolerant in, maar doe dit niet met gewone filehandles ;)
Nog een vraag voor een variant op mijn eerste topic:
Stel, ik loop over de results van een tabel met artikelen. Dan wil ik tijdens de loop per artikel ook een query doen om de eerste foto van het artikel op te halen uit een tussentabel (of eventueel alle foto's met een extra loop). Ik dacht, ik doe het als volgt maar de variabele $row['id'] wordt niet geaccepteerd in de fotoresult query.
<?php
$result = mysql_query("SELECT id,naam FROM artikel");
while($row = mysql_fetch_array($result))
{
echo $row['id'] . " " . $row['naam'];
$fotoresult = mysql_query("SELECT foto FROM artikelfoto WHERE artikel_idfk='$row['id']'");
$fotorow = mysql_fetch_array($fotoresult);
echo $fotorow['foto'];
}
?>
Heb ik ergens een syntaxfout gemaakt of kan dit niet zo in PHP? Ik ben zoals gezegd ColdFusion gewend en daarbij werkt het probleemloos op deze manier.
Ramon Fincken
16/09/08, 21:55
aangenomen dat ..
artikel_idfk gelijk is aan een categorie ( noem het liever cat_id ) en je een enkele foto wil hebben...
$sql_foto = "SELECT foto FROM artikelfoto WHERE foto != '' AND artikel_idfk='".$row['id']."' LIMIT 1";
echo dit eens en gooi het in phpmyadmin, kijken wat ie je teruggeeft ?
systemdeveloper
16/09/08, 22:16
aangenomen dat ..
artikel_idfk gelijk is aan een categorie ( noem het liever cat_id ) en je een enkele foto wil hebben...
$sql_foto = "SELECT foto FROM artikelfoto WHERE foto != '' AND artikel_idfk='".$row['id']."' LIMIT 1";
echo dit eens en gooi het in phpmyadmin, kijken wat ie je teruggeeft ?
In phpmyadmin krijg je dan een foutmelding :)
Maar in denk dat je dit wil hebben:
$fotoresult = mysql_query("SELECT foto FROM artikelfoto WHERE artikel_idfk='".$row['id']."'");
Ramon Fincken
16/09/08, 22:23
leuke "laatst gewijzigd" ;)
Thanks, dat tussen extra ". ." zetten was het!
Joepie eerste pagina is vertaald van ColdFusion naar PHP. Nu de rest nog :)
Mijn dank is groot voor deze beginnerscursus mannen!
D. ter Horst
17/09/08, 11:17
Ramon, thanks voor de link. Ik maak er uit op dat het niet echt uitmaakt voor de performance van MySQL zelf, wel voor het aantal connecties dat open kan blijven staan. Meer een kwestie van een juiste configuratie, maar ik moet toegeven, dat van die timeout wist ik niet ;)
Ik ben stiekem wel voorstander van een topic met zulke puntjes, waar men kan discussieren over dit soort punten welke niet onder beginnersvragen vallen of basiskennis zijn, maar wel impact kunnen hebben op een PHP script. Op het tweakers.net forum is ook al zo'n topic, maar dan hebben we het over PHP, C, Perl, Python, noem het maar, alles door elkaar. Een topic voor PHP hierover op WHT ben ik wel voor in.
...
Een topic voor PHP hierover op WHT ben ik wel voor in.
Ik ook! :thumbup: