fetch en fetchAll
Ik heb een vraagje. In PDO kun je 1 rij fetchen door gebruik te maken de fetch() mehthod, en je kunt meerdere rijen fetchen door gebruik te maken van fetchAll().
Als mijn query als volgt is:
SELECT * from PRODUCTS
zal ik bij fetch() alleen het 1e product terugkrijgen, en bij fetchAll alle producten.
Nu vraag ik me wel iets af. De query is in beide gevallen exact hetzelfde. Betekent dit dat wanneer ik fetch() gebruik, stiekem toch gewoon alle rijen worden opgehaald in de recordset?
Gewijzigd op 02/06/2013 00:53:52 door Ozzie PHP
Controls the contents of the returned array as documented in PDOStatement::fetch(). Defaults to value of PDO::ATTR_DEFAULT_FETCH_MODE (which defaults to PDO::FETCH_BOTH)
Ik denk dat het heel wat duidelijk maakt als je een query loslaat en deze eenkeer met fetch en een keer met fetchAll bewerkt. gooi daar allebei is een var_dump() en je zult verschil zien.
SELECT * from PRODUCTS
dan krijg ik met fetch() 1 resultaat terug en met fetchAll krijg ik alle resultaten terug.
MAAAAAAAAAR....
Ik ben er inmiddels achter dat als ik fetch() gebruik, ook gewoon alle rijen worden opgehaald, alleen hij laat er telkens maar eentje zien. Ik dacht in 1e instantie dat ie er ook echt maar 1 ophaalde, maar dat is niet zo. Als ik fetch() meerdere keren achter elkaar uitvoer, dan toont hij telkens de volgende rij. Ik dacht dus dat door fetch() te gebruiken er maar 1 resultaat uit de database wordt gehaald, maar dat is dus niet zo. Daarom kun je (vind ik) beter gewoon altijd fetchAll() gebruiken in plaats van fetch().
En uiteraard gewoon een LIMIT meegeven. Ook als er maar 1 resultaat kan worden verwacht.
Eddy E op 02/06/2013 19:59:32:
En uiteraard gewoon een LIMIT meegeven. Ook als er maar 1 resultaat kan worden verwacht.
Ook in deze situatie een LIMIT meegeven?
SELECT name, description FROM products WHERE id = 12345
Hier verwacht je ook maar 1 resultaat, maar daar hoeft dan toch geen LIMIT bij? Of wel?
Ozzie PHP op 02/06/2013 20:06:38:
Hier verwacht je ook maar 1 resultaat, maar daar hoeft dan toch geen LIMIT bij? Of wel?
Zou niet nodig moeten zijn, maar waarom niet meegeven? Noem eens een andere reden dan minder typewerk...
Omdat het volledig overbodig is ....
Ger van Steenderen op 04/06/2013 07:26:37:
Omdat het volledig overbodig is ....
Dit dus... als je maar 1 resultaat kunt terugkrijgen dan is het niet gebruikelijk om daar een LIMIT bij te zetten. Ik heb dit nog nooit eerder gezien.
Bij ->query() wordt de query uitgevoerd en krijg je ergens een resource. Die resource wordt ergens in het pdo object bijgehouden (zou ik eens moeten nakijken hoe dat precies zit).
Of je die resource verder fetcht, en hoe, maakt niets uit what so ever. De resource is wat ->query() terug geeft
Tweede vraag:
Voor zover ik weet, is mySQL zo geoptimaliseerd dat bij "WHERE id = ... " een LIMIT 1 niet helpt. mySQL begrijpt spontaan dat het slechts 1 record moet vinden.
Kris Peeters op 04/06/2013 14:12:38:
Tweede vraag:
Voor zover ik weet, is mySQL zo geoptimaliseerd dat bij "WHERE id = ... " een LIMIT 1 niet helpt. mySQL begrijpt spontaan dat het slechts 1 record moet vinden.
Voor zover ik weet, is mySQL zo geoptimaliseerd dat bij "WHERE id = ... " een LIMIT 1 niet helpt. mySQL begrijpt spontaan dat het slechts 1 record moet vinden.
Bedoel je dan alleen bij "WHERE id = ... " en bijv. niet bij "WHERE name = ... "? Anders gezegd... reageert MySQL op het keyword "id"?
Kris Peeters op 04/06/2013 14:12:38:
Dat is juist: als je er een EXPLAIN van maakt, zie je dat de oplossingsstrategie bij MySQL hetzelfde is.Tweede vraag:
Voor zover ik weet, is mySQL zo geoptimaliseerd dat bij "WHERE id = ... " een LIMIT 1 niet helpt. mySQL begrijpt spontaan dat het slechts 1 record moet vinden.
Voor zover ik weet, is mySQL zo geoptimaliseerd dat bij "WHERE id = ... " een LIMIT 1 niet helpt. mySQL begrijpt spontaan dat het slechts 1 record moet vinden.
Echter... de id moet natuurlijk wel een primaire sleutel zijn of een unieke index hebben. Is het een willekeurige andere id, dan wordt een MySQL-query namelijk wél sneller met LIMIT 1.
Offtopic weetje, voor de aardigheid: Rasmus Lerdorf, de bedenker van PHP, heeft die LIMIT 1 ook verzonnen. Voor SQL-puristen is het een overbodige aanvulling.
Ik bedoel inderdaad dat id in dat geval de primary key is.
Uiteraard mag je gelijk welk veld "id" noemen (met informatie die niet uniek is).
en kan je als primary ook een veld "name" noemen.
Oké, duidelijk ;-)
Ozzie, misschien nog een dingetje voor een nieuw topic... Ik denk dat het niet altijd handig en verstandig is om MySQL-specifieke SQL-code uit te voeren via PDO. Je verliest dan namelijk mogelijk een van de sterkste pluspunten van PDO: de onafhankelijkheid van een databaseplatform. Het SQL-dialect van MySQL krijgt, soms terecht, soms onterecht, wel vaker kritiek.
Ward, wat bedoel je precies? Kun je een voorbeeldje geven?
PDO geeft je een interface waarmee je elegant en liefst zelfs onzichtbaar MySQL kunt verruilen voor bijvoorbeeld PostgreSQL. Als je PDO of een daarop gebaseerde databaseklasse vervolgens voert met SQL-queries die uitsluitend werken in het SQL-dialect van MySQL, verlies je die onafhankelijkheid. In een OOP-framework introduceer je daarmee indirect ook een afhankelijkheid die je er misschien liever niet in wilt terugzien. Die afhankelijkheid is niet meteen een reden om PDO te laten varen, maar wel iets om rekening mee te houden.
Ah oké... ik snap wat je bedoelt. Maar ik ben niet bekend met die dialecten dus ik zou ook niet weten hoe ik er op moet anticiperen. Voorlopig laat ik het maar gewoon zo.
Thanks... voorlopig ben ik echt niet van plan om met andere database interfaces te gaan werken, dus het zal wel goed komen ;)