fetch en fetchAll

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

02/06/2013 00:00:48
Quote Anchor link
Ola,

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
 
PHP hulp

PHP hulp

17/11/2024 19:59:21
 
Reshad F

Reshad F

02/06/2013 10:20:34
Quote Anchor link
ik denk het wel, volgens mij zit het verschil in hoe hij het teruggeeft.

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.
 
Ozzie PHP

Ozzie PHP

02/06/2013 14:51:29
Quote Anchor link
Als ik dit doe:

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().
 
Eddy E

Eddy E

02/06/2013 19:59:32
Quote Anchor link
En uiteraard gewoon een LIMIT meegeven. Ook als er maar 1 resultaat kan worden verwacht.
 
Ozzie PHP

Ozzie PHP

02/06/2013 20:06:38
Quote Anchor link
Eddy, thanks voor je reactie.

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

Ozzie PHP

04/06/2013 01:17:53
Quote Anchor link
* bump *

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?
 
Eddy E

Eddy E

04/06/2013 06:06:15
Quote Anchor link
Zou niet nodig moeten zijn, maar waarom niet meegeven? Noem eens een andere reden dan minder typewerk...
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/06/2013 07:26:37
Quote Anchor link
Omdat het volledig overbodig is ....
 
Ozzie PHP

Ozzie PHP

04/06/2013 13:51:23
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

04/06/2013 14:12:38
Quote Anchor link
Wat de originele vraag betreft: het antwoord is ja. En daar gebeurt niets stiekem.
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.
 
Ozzie PHP

Ozzie PHP

04/06/2013 14:18:47
Quote Anchor link
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.

Bedoel je dan alleen bij "WHERE id = ... " en bijv. niet bij "WHERE name = ... "? Anders gezegd... reageert MySQL op het keyword "id"?
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 14:23:17
Quote Anchor link
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.
Dat is juist: als je er een EXPLAIN van maakt, zie je dat de oplossingsstrategie bij MySQL hetzelfde is.

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.
 
Kris Peeters

Kris Peeters

04/06/2013 14:35:12
Quote Anchor link
Ja, precies.
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.
 
Ozzie PHP

Ozzie PHP

04/06/2013 14:41:35
Quote Anchor link
Oké, duidelijk ;-)
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 14:47:18
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

04/06/2013 14:50:34
Quote Anchor link
Ward, wat bedoel je precies? Kun je een voorbeeldje geven?
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 14:59:46
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

04/06/2013 15:03:33
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 15:10:51
Quote Anchor link
Het MySQL-dialect van ANSI SQL is gedocumenteerd, als je het zekere voor het onzekere wilt nemen:

http://dev.mysql.com/doc/refman/5.0/en/extensions-to-ansi.html
 
Ozzie PHP

Ozzie PHP

04/06/2013 15:12:48
Quote Anchor link
Thanks... voorlopig ben ik echt niet van plan om met andere database interfaces te gaan werken, dus het zal wel goed komen ;)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.