PDO en database
Bartje Jansen op 11/10/2011 07:17:10:
Het moet natuurlijk ook zijn:
Ger van Steenderen op 11/10/2011 08:36:16:
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.
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?
Ger van Steenderen op 11/10/2011 09:59:56:
Behalve in SQL Server
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.
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
Ger van Steenderen op 11/10/2011 11:26:39:
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.
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.
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);
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 ".
Ger van Steenderen op 11/10/2011 08:36:16:
Volgens PHP ook 2.
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?
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";
Dankjewel voor de uitleg.
Kan ik al deze informatie toevallig ergens terugvinden in een duidelijke (niet al te technische) tutorial?