PDO en database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3

Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/10/2011 08:36:16
Quote Anchor link
Bartje Jansen op 11/10/2011 07:17:10:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT '1 appel' + '1 peer';

Volgens MySQL is komt hier "2" uit...


Het moet natuurlijk ook zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT CONCAT('1 appel', ' 1 peer');
 
PHP hulp

PHP hulp

16/04/2024 05:58:46
 
Bartje Jansen

Bartje Jansen

11/10/2011 08:52:49
Quote Anchor link
Ger van Steenderen op 11/10/2011 08:36:16:
Bartje Jansen op 11/10/2011 07:17:10:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT '1 appel' + '1 peer';

Volgens MySQL is komt hier "2" uit...


Het moet natuurlijk ook zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT CONCAT('1 appel', ' 1 peer');

Is dat zo? Twee strings aan elkaar plakken en een sommatie uitvoeren, dat zijn twee totaal verschillende dingen. Wanneer jij een bug in jouw code hebt zitten en per ongeluk twee strings bij elkaar probeert op te tellen, wil je hier echt geen concat toepassen. Wellicht is het een beter idee om twee integers bij elkaar op te tellen. Who knows?

concat() is trouwens zo'n functie die vele databases niet kennen omdat deze niet nodig is: Dubbele pipes || zijn de standaard in SQL om strings aan elkaar te plakken. Dit werkt ook in MySQL, mits je de juiste sql_mode gebruikt. PIPES_AS_CONCAT is de setting hiervoor.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/10/2011 09:59:56
Quote Anchor link
Bartje Jansen op 11/10/2011 08:52:49:
Dubbele pipes || zijn de standaard in SQL om strings aan elkaar te plakken.

Behalve in SQL Server
Ik houd me ook nog wel eens bezig met het schrijven van software en 'communiceer' dan rechtstreeks met de dll's van verschillende db engines. Als ik nu bijvoorbeeld in een SQL statement voor SQLite de veldnamen niet omsluit met [] dan krijg ik een foutmelding om mijn oren.
Dus is mijn vraag: handeld PDO dat af of moet je dat zelf doen?
 
Bartje Jansen

Bartje Jansen

11/10/2011 10:35:17
Quote Anchor link
Ger van Steenderen op 11/10/2011 09:59:56:
Bartje Jansen op 11/10/2011 08:52:49:
Dubbele pipes || zijn de standaard in SQL om strings aan elkaar te plakken.

Behalve in SQL Server

Typisch Microsoft, ze weten hier ook van. concat() gaat trouwens ook niet werken in SQL Server.

http://connect.microsoft.com/SQLServer/feedback/details/259291/support-iso-9075-standard-string-concatenation-double-pipe
Quote:
Ik houd me ook nog wel eens bezig met het schrijven van software en 'communiceer' dan rechtstreeks met de dll's van verschillende db engines.

Dat heeft dan niets met PDO te maken, PDO moet juist dit soort problemen oplossen.
Quote:
Als ik nu bijvoorbeeld in een SQL statement voor SQLite de veldnamen niet omsluit met [] dan krijg ik een foutmelding om mijn oren.

Dat is dan iets van de DDL en niet van PDO of welke connector dan ook. Dit is de eerste keer dat ik iemand hoor zeggen dat je blokhaken nodig hebt in SQLite.

Hier een tutorial waarin je ziet hoe e.e.a. werkt in SQLite:
http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html

En dus geen blokhaken in de SQL, die zijn niet nodig.
Quote:
Dus is mijn vraag: handeld PDO dat af of moet je dat zelf doen?

PDO vertaalt geen SQL naar het gewenste dialect, jij moet zorgen voor generieke SQL. En dus ook testen op de verschillende databases die jij wilt ondersteunen.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/10/2011 11:26:39
Quote Anchor link
Quote:
PDO vertaalt geen SQL naar het gewenste dialect, jij moet zorgen voor generieke SQL. En dus ook testen op de verschillende databases die jij wilt ondersteunen.

Jouw SQL mag dan wel generiek zijn maar niet foolproof. Stel nu dat je een database moet uitlezen die niet door jou is opgezet, maar door iemand die zich toevallig niet aan de regels houdt, door bv spaties in de veldnamen te zetten. Dan heb jij een boze klant, want jij gebruikt geen omsluitingen in je veldnamen.
Gewijzigd op 11/10/2011 11:33:36 door Ger van Steenderen
 
Bartje Jansen

Bartje Jansen

11/10/2011 13:50:31
Quote Anchor link
Ger van Steenderen op 11/10/2011 11:26:39:
Quote:
PDO vertaalt geen SQL naar het gewenste dialect, jij moet zorgen voor generieke SQL. En dus ook testen op de verschillende databases die jij wilt ondersteunen.

Jouw SQL mag dan wel generiek zijn maar niet foolproof. Stel nu dat je een database moet uitlezen die niet door jou is opgezet, maar door iemand die zich toevallig niet aan de regels houdt, door bv spaties in de veldnamen te zetten.

Daar hebben ze dus de dubbele quotes " voor uitgevonden, nog zo'n standaard SQL dingetje. Ook dat werkt in MySQL, mits je de juiste sql_mode gebruikt. De verschillende sql_mode's in MySQL kun je hier vinden:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_sql_mode

En ja, dubbele quotes werken ook in PostgreSQL, Oracle, SQL Server, SQLite en Firebird.

Quote:
Dan heb jij een boze klant, want jij gebruikt geen omsluitingen in je veldnamen.

Dus i.p.v. een boze klant, heb je een domme bug in je code zitten die door een slecht geïnformeerde programmeur is gemaakt. Het is de fout van de programmeur, niet van PDO. Hou je aan de standaarden, dat voorkomt heel veel problemen. Zorg er dus ook voor dat je deze standaarden kent!

En ga testen op de verschillende databases, te beginnen met de database die zich het beste aan de standaarden houdt. PostgreSQL en Firebird vallen in deze categorie, en zijn gratis. MySQL test je als laatste, dat mag echt nooit het begin zijn omdat deze zich heel slecht aan de standaarden houdt.
 
Ozzie PHP

Ozzie PHP

11/10/2011 14:29:44
Quote Anchor link
Bartje, mijn bedoeling is om een database class te maken die de PDO class extend. Ik ben van huis uit geen programmeur en heb niet zo veel technische (database) kennis als jij. Mijn idee was om een eigen database class te schrijven met wat handige functies daarin (select, update, insert, delete, from, where) die ik makkelijk kan aanroepen middels chaining, zodat ik geen volledige queries hoef te schrijven.

Bijvoorbeeld: $row = $database->select('brand')->from('cars')->where('id', 20);

Nu zal ik voornamelijk met MySQL werken, maar mijn gedachte was dus dat als ik een ander database-type wil gebruiken dat ik dan alleen de connection hoef te veranderen en dat dit dan nog steeds werkt:

$row = $database->select('brand')->from('cars')->where('id', 20);
 
Bartje Jansen

Bartje Jansen

11/10/2011 14:47:09
Quote Anchor link
Zorg er dan wel voor dat de tabelnaam cars en kolomnaam brand tussen dubbele quotes komt te staan: "cars". Waarom? Omdat Oracle een lowercase cars als iets anders beschouwt dan de uppercase CARS. In SQL is het gebruik van UPPERCASE de standaard, maar hier wijkt bv. PostgreSQL al weer vanaf met lowercase. Zet de database objecten (schema's, tabelnamen, kolomnamen, etc.) dus altijd tussen dubbele quotes ".

Zorg er dus ook voor dat MySQL zich gedraagt als een standaard SQL database, dan kan ook MySQL hier mee uit de voeten.

Dit soort SQL moet je genereren:
SELECT "brand" FROM "cars" WHERE "id" = '20';

Let dus goed op de quotes ' en dubbele quotes ".
 
- SanThe -

- SanThe -

11/10/2011 15:17:53
Quote Anchor link
Offtopic:

Ger van Steenderen op 11/10/2011 08:36:16:
Bartje Jansen op 11/10/2011 07:17:10:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT '1 appel' + '1 peer';

Volgens MySQL is komt hier "2" uit...


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '1 appel' + '1 peer';
?>


Volgens PHP ook 2.
 
Ozzie PHP

Ozzie PHP

11/10/2011 15:29:36
Quote Anchor link
Dankjewel Bart. Ik begrijp dit niet helemaal "Waarom? Omdat Oracle een lowercase cars als iets anders beschouwt dan de uppercase CARS."

Als ik gewoon de tabelnaam gebruik zoals die is... dus als de tabelnaam cars is en ik gebruik in m'n query cars dan zou het toch goed moeten zijn. Net als wanneer de tabelnaam CARS is.. dan moet ik in m'n query ook CARS gebruiken. Of is dat niet wat je bedoelt?
 
Bartje Jansen

Bartje Jansen

11/10/2011 17:10:18
Quote Anchor link
Wanneer jij in Oracle de tabel hebt aangemaakt met:
CREATE TABLE "cars"(
"id" int,
"brand" char(10)
);

Dan kun je niet met:
SELECT brand FROM cars;

de data ophalen. Oracle zal de query uitvoeren als:
SELECT BRAND FROM CARS;
en deze tabel- en kolomnaam bestaat niet. Dus altijd dubbele quotes gebruiken om problemen met casing te voorkomen:
SELECT "brand" FROM "cars";
 
Ozzie PHP

Ozzie PHP

11/10/2011 17:19:28
Quote Anchor link
Ah oké :-)
Dankjewel voor de uitleg.

Kan ik al deze informatie toevallig ergens terugvinden in een duidelijke (niet al te technische) tutorial?
 

Pagina: « vorige 1 2 3



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.