Tutorials
mysql_fetch_x
Verschil tussen bepaalde manieren van data uit een mysql database in een array te zetten. De functies die behandeld worden zijn: mysql_fetch_array(), mysql_fetch_assoc(), mysql_fetch_row() en mysql_fetch_object().
Pagina 1
Waarom deze tutorial?
Je komt het zo vaak tegen: De vraag wat precies het verschil is tussen bepaalde manieren van mysql_fetch_x, wat de werking hiervan is en welke bijvoorbeeld het snelste is.
Daarom dacht ik bij mezelf, ik ga de les wiskunde niet volgen, maar ik schrijf snel even deze tutorial.
Allereerst maken we onderscheid, tussen de vier verschillende manieren, waarop je een database resultaat in een array kan zetten.
mysql_fetch_array();
mysql_fetch_assoc();
mysql_fetch_row();
mysql_fetch_object();
Voor de voorbeelden nemen we even de tabel Users:
Nota Bene: Zorg dat je bij je eigen database je wachtwoorden versleuteld, door bijvoorbeeld md5 encryptie.
Daarom dacht ik bij mezelf, ik ga de les wiskunde niet volgen, maar ik schrijf snel even deze tutorial.
Allereerst maken we onderscheid, tussen de vier verschillende manieren, waarop je een database resultaat in een array kan zetten.
mysql_fetch_array();
mysql_fetch_assoc();
mysql_fetch_row();
mysql_fetch_object();
Voor de voorbeelden nemen we even de tabel Users:
id | naam | wachtwoord | email
1 | Pietje | post | [email protected]
2 | Japie | krekel | [email protected]
3 | Keesje | IlovePHP | [email protected]
Nota Bene: Zorg dat je bij je eigen database je wachtwoorden versleuteld, door bijvoorbeeld md5 encryptie.
Pagina 2
mysql_fetch_array()
mysql_fetch_array():
Werking: mysql_fetch_array zet de database resultaten in een array. Deze kunnen worden aangeroepen door middel van een row (rij) of doormiddel van een associerende (bijbehorende) sleutelnaam.
Een voorbeeldje zegt meer dan 1000 worden, dus hier een simpel voorbeeld:
<?PHP
$qrySql = "SELECT * FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_array($qryRes)){
echo 'Naam:' . $aRow[1] . ' | ';
echo 'Id:' . $aRow['id'] . '<br/>';
}
// Output:
// Naam: Pietje | Id: 1
// Naam: Japie | Id: 2
// Naam: Keesje | Id: 3
?>
Zoals je ziet kun je de uitkomst van mysql_fetch_array() zowel op een geindexeerde als op een geassocieerde manier benaderen. Bij een geassocieerde benadering wordt de kollomnaam als sleutel gebruikt.
(Geindexeerd: $aRow[nummer] / Geassocieerd: $aRow['kollomnaam'])
Werking: mysql_fetch_array zet de database resultaten in een array. Deze kunnen worden aangeroepen door middel van een row (rij) of doormiddel van een associerende (bijbehorende) sleutelnaam.
Een voorbeeldje zegt meer dan 1000 worden, dus hier een simpel voorbeeld:
<?PHP
$qrySql = "SELECT * FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_array($qryRes)){
echo 'Naam:' . $aRow[1] . ' | ';
echo 'Id:' . $aRow['id'] . '<br/>';
}
// Output:
// Naam: Pietje | Id: 1
// Naam: Japie | Id: 2
// Naam: Keesje | Id: 3
?>
Zoals je ziet kun je de uitkomst van mysql_fetch_array() zowel op een geindexeerde als op een geassocieerde manier benaderen. Bij een geassocieerde benadering wordt de kollomnaam als sleutel gebruikt.
(Geindexeerd: $aRow[nummer] / Geassocieerd: $aRow['kollomnaam'])
Pagina 3
mysql_fetch_assoc()
mysql_fetch_assoc():
Hierbij wordt de kollomnaam als sleutel gebruikt. Het werkt hetzelfde als mysql_fetch_array, alleen kan je met deze functie de arraywaarden niet geindexeerd opvragen.
Voorbeeldje:
<?PHP
$qrySql = "SELECT naam,wachtwoord FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_assoc($qryRes)){
foreach($aRow as $sleutel => $waarde){
echo Ucfirst($sleutel) . ': ' . $waarde . ' | ';
}
echo '<br/>';
}
// Output:
// Naam: Pietje | Wachtwoord: post |
// Naam: Japie | Wachtwoord: krekel |
// Naam: Keesje | Wachtwoord: IlovePHP |
?>
Hierbij wordt de kollomnaam als sleutel gebruikt. Het werkt hetzelfde als mysql_fetch_array, alleen kan je met deze functie de arraywaarden niet geindexeerd opvragen.
Voorbeeldje:
<?PHP
$qrySql = "SELECT naam,wachtwoord FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_assoc($qryRes)){
foreach($aRow as $sleutel => $waarde){
echo Ucfirst($sleutel) . ': ' . $waarde . ' | ';
}
echo '<br/>';
}
// Output:
// Naam: Pietje | Wachtwoord: post |
// Naam: Japie | Wachtwoord: krekel |
// Naam: Keesje | Wachtwoord: IlovePHP |
?>
Pagina 4
mysql_fetch_row()
mysql_fetch_row():
Dit is de geindexeerde manier van waarden in een array zetten. mysql_fetch_row() gebruikt in tegenstelling tot mysql_fetch_assoc() alleen de geindexeerde manier van mysql_fetch_array(). In feite kun je stellen dat mysql_fetch_array() in principe een samenstelling is van mysql_fetch_assoc() en mysql_fetch_row();
Een een voorbeeld en daarna iets meer uitleg.
<?PHP
$qrySql = "SELECT naam,wachtwoord FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_row($qryRes)){
echo 'Naam:' . $aRow[0] . ' | ';
echo 'Pass:' . $aRow[1] . '<br/>';
}
// Output:
// Naam: Pietje | Pass: post
// Naam: Japie | Pass: krekel
// Naam: Keesje | Pass: IlovePHP
?>
Het voordeel van mysql_fetch_row() is dat hij de snelste is van alle functies, maar hier ga ik later op in.
Een nadeel van mysql_fetch_row() is dat je met een groot aantal kollomen je een beetje in de kluts raakt met wat nou eigenlijk welke kollom was.
Vaak wordt echter mysql_fetch_array() om zijn veelzijdigheid of mysql_fetch_assoc() om zijn snelheid + duidelijkheid gekozen.
Er valt alleen wel op te merken dat zeker bij kleinere databases, het verschil tussen alle manieren te verwaarlozen is.
Maar toch ben jij misschien wel iemand die een ontzettend groot webproject op touw gaat zetten en hierbij de meest efficiƫnte manier van fetchen wil gebruiken. Daarom is er ook een snelheids testje inclusief toelichting inbegrepen bij deze tutorial, maar eerst verder naar de laatste manier van mysql_fetchen:
Dit is de geindexeerde manier van waarden in een array zetten. mysql_fetch_row() gebruikt in tegenstelling tot mysql_fetch_assoc() alleen de geindexeerde manier van mysql_fetch_array(). In feite kun je stellen dat mysql_fetch_array() in principe een samenstelling is van mysql_fetch_assoc() en mysql_fetch_row();
Een een voorbeeld en daarna iets meer uitleg.
<?PHP
$qrySql = "SELECT naam,wachtwoord FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_row($qryRes)){
echo 'Naam:' . $aRow[0] . ' | ';
echo 'Pass:' . $aRow[1] . '<br/>';
}
// Output:
// Naam: Pietje | Pass: post
// Naam: Japie | Pass: krekel
// Naam: Keesje | Pass: IlovePHP
?>
Het voordeel van mysql_fetch_row() is dat hij de snelste is van alle functies, maar hier ga ik later op in.
Een nadeel van mysql_fetch_row() is dat je met een groot aantal kollomen je een beetje in de kluts raakt met wat nou eigenlijk welke kollom was.
Vaak wordt echter mysql_fetch_array() om zijn veelzijdigheid of mysql_fetch_assoc() om zijn snelheid + duidelijkheid gekozen.
Er valt alleen wel op te merken dat zeker bij kleinere databases, het verschil tussen alle manieren te verwaarlozen is.
Maar toch ben jij misschien wel iemand die een ontzettend groot webproject op touw gaat zetten en hierbij de meest efficiƫnte manier van fetchen wil gebruiken. Daarom is er ook een snelheids testje inclusief toelichting inbegrepen bij deze tutorial, maar eerst verder naar de laatste manier van mysql_fetchen:
Pagina 5
mysql_fetch_object()
mysql_fetch_object():
Gezien de vorige drie manieren van 'fetchen' zou je misschien kunnen verwachten dat deze manier van 'fetchen' op de vorige lijkt, maar als je dat verwacht, zit je goet foud!
mysql_fetch_object() is eigenlijk ook niet waarden in een array zetten, maar in een object.
Misschien heb je wel eens met classes gewerkt, en weet je misschien een beetje hoe het werkt met het aanroepen van waarden. Voor diegenen die dat niet weten, volgt een klein voorbeeldje:
<?PHP
$qrySql = "SELECT naam,email FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_object($qryRes)){
echo 'Naam:' . $aRow->naam . ' | ';
echo 'Mail:' . $aRow->email . '<br/>';
}
// Output:
// Naam: Pietje | Mail: [email protected]
// Naam: Japie | Mail: [email protected]
// Naam: Keesje | Mail: [email protected]
?>
Zoals je ziet stopt mysql_fetch_object() de waarden van de kollomen in een object, in dit geval $aRow. De kollomnaam wordt hierbij ons aanspreekpunt van deze waarde.
Het object echo je bijvoorbeeld door:
<?PHP
echo($aRow->kollomnaam);
?>
Een nadeel hiervan is dat dit mini OOP functie er een beetje lang over doet om alles op orde te hebben. Dit blijkt uit een aantal tests die op de volgende bladzijde van deze tutorial zal vinden.
Gezien de vorige drie manieren van 'fetchen' zou je misschien kunnen verwachten dat deze manier van 'fetchen' op de vorige lijkt, maar als je dat verwacht, zit je goet foud!
mysql_fetch_object() is eigenlijk ook niet waarden in een array zetten, maar in een object.
Misschien heb je wel eens met classes gewerkt, en weet je misschien een beetje hoe het werkt met het aanroepen van waarden. Voor diegenen die dat niet weten, volgt een klein voorbeeldje:
<?PHP
$qrySql = "SELECT naam,email FROM users ORDER BY id";
$qryRes = mysql_query($qrySql);
while($aRow = mysql_fetch_object($qryRes)){
echo 'Naam:' . $aRow->naam . ' | ';
echo 'Mail:' . $aRow->email . '<br/>';
}
// Output:
// Naam: Pietje | Mail: [email protected]
// Naam: Japie | Mail: [email protected]
// Naam: Keesje | Mail: [email protected]
?>
Zoals je ziet stopt mysql_fetch_object() de waarden van de kollomen in een object, in dit geval $aRow. De kollomnaam wordt hierbij ons aanspreekpunt van deze waarde.
Het object echo je bijvoorbeeld door:
<?PHP
echo($aRow->kollomnaam);
?>
Een nadeel hiervan is dat dit mini OOP functie er een beetje lang over doet om alles op orde te hebben. Dit blijkt uit een aantal tests die op de volgende bladzijde van deze tutorial zal vinden.
Pagina 6
Wat moet jij gebruiken?
Met dank aan Jan Koehoorn
Men neme een MyISAM tabel met 200.000 records gevuld met random waarden
Velden: id (INT4),cijfer (INT4), tekst (VARCHAR 255), datum (DATE), tijd1 (TIME), tijd2 (TIME)
Testcode:
<?php
require('db_config.php');
function get_microtime()
{
list($usec, $sec) = explode(" ", microtime());
return((float)$usec + (float)$sec);
}
$sql = "
SELECT cijfer, tekst, datum, tijd1, tijd2
FROM phphulp";
if (!($res = mysql_query($sql))) {
trigger_error(mysql_error());
}
else {
$start = get_microtime();
while ($row = mysql_fetch_assoc($res)) {
// deze steeds aangepast
}
$stop = get_microtime();
$tijd = $stop - $start;
echo 'Tijd: ' . $tijd;
}
?>
Resultaten:
mysql_fetch_array:
Tijd: 1.04317808151
Tijd: 1.02631306648
Tijd: 1.03138113022
Tijd: 1.01798200607
Tijd: 1.01716589928
mysql_fetch_object():
Tijd: 1.35628700256
Tijd: 1.38205504417
Tijd: 1.38648200035
Tijd: 1.37615299225
Tijd: 1.39009308815
mysql_fetch_assoc():
Tijd: 0.750518083572
Tijd: 0.665653944016
Tijd: 0.712239027023
Tijd: 0.701236963272
Tijd: 0.705749034882
mysql_fetch_row():
Tijd: 0.53831410408
Tijd: 0.535464048386
Tijd: 0.53640294075
Tijd: 0.540419101715
Tijd 0.544956922531
Hier uit kun je concluderen dat mysql_fetch_row() de snelste is van eerdergenoemde manieren. Zelf vind ik dit niet de handigste manier, omdat ik zelf altijd een beetje duizellig wordt van al die nummertjes.
Het liefst gebruik ik zelf mysql_fetch_array(). Ik weet niet precies waarom, maar ik voel mij goed bij het idee dat het niet uitmaak hoe ik de waarden aanroep(geindexeerd of geassocieerd).
Ik hoop dat je wijzer bent geworden van deze tutorial, verder raad ik je aan alles wat ik heb gezegt nog even te proberen, zodat wanneer ik een foutje gemaakt heb in deze tutorial, of als er iets onduidelijk is, je een beetje achtergrond kennis hebt :)
Men neme een MyISAM tabel met 200.000 records gevuld met random waarden
Velden: id (INT4),cijfer (INT4), tekst (VARCHAR 255), datum (DATE), tijd1 (TIME), tijd2 (TIME)
Testcode:
<?php
require('db_config.php');
function get_microtime()
{
list($usec, $sec) = explode(" ", microtime());
return((float)$usec + (float)$sec);
}
$sql = "
SELECT cijfer, tekst, datum, tijd1, tijd2
FROM phphulp";
if (!($res = mysql_query($sql))) {
trigger_error(mysql_error());
}
else {
$start = get_microtime();
while ($row = mysql_fetch_assoc($res)) {
// deze steeds aangepast
}
$stop = get_microtime();
$tijd = $stop - $start;
echo 'Tijd: ' . $tijd;
}
?>
Resultaten:
mysql_fetch_array:
Tijd: 1.04317808151
Tijd: 1.02631306648
Tijd: 1.03138113022
Tijd: 1.01798200607
Tijd: 1.01716589928
mysql_fetch_object():
Tijd: 1.35628700256
Tijd: 1.38205504417
Tijd: 1.38648200035
Tijd: 1.37615299225
Tijd: 1.39009308815
mysql_fetch_assoc():
Tijd: 0.750518083572
Tijd: 0.665653944016
Tijd: 0.712239027023
Tijd: 0.701236963272
Tijd: 0.705749034882
mysql_fetch_row():
Tijd: 0.53831410408
Tijd: 0.535464048386
Tijd: 0.53640294075
Tijd: 0.540419101715
Tijd 0.544956922531
Hier uit kun je concluderen dat mysql_fetch_row() de snelste is van eerdergenoemde manieren. Zelf vind ik dit niet de handigste manier, omdat ik zelf altijd een beetje duizellig wordt van al die nummertjes.
Het liefst gebruik ik zelf mysql_fetch_array(). Ik weet niet precies waarom, maar ik voel mij goed bij het idee dat het niet uitmaak hoe ik de waarden aanroep(geindexeerd of geassocieerd).
Ik hoop dat je wijzer bent geworden van deze tutorial, verder raad ik je aan alles wat ik heb gezegt nog even te proberen, zodat wanneer ik een foutje gemaakt heb in deze tutorial, of als er iets onduidelijk is, je een beetje achtergrond kennis hebt :)
Reacties
0