login  Naam:   Wachtwoord: 
Registreer je!
 Nota's op tutorial:

Tutorials > MySQL > MySQLi extensie
Pagina:

Reacties op de tutorial MySQLi extensie


Offline  Thomas
Gepost op: 16 mei 2014 - 17:23
Moderator

Beschouw een _set_charset($charset) aanroep als "dit is de charset waarin ik mijn data wil weergeven". Je database-tabellen hoeven niet per sé deze charset te hebben, maar dit verdient wel de (sterke) voorkeur.

Stel bijvoorbeeld dat je website wordt weergegeven in utf-8 (door middel van een PHP header() en/of een <meta> tag). Je zou dan dus altijd _set_charset('utf8') moeten gebruiken, simpelweg omdat dat de charset is waarin je alles weergeeft. Ongeacht of je database-tabellen of -kolommen utf8, latin1 (of iets anders) als charset hebben. MySQL verzorgt deze vertaling automatisch (naar beste vermogen, uiteraard). Wel moet de data in je database altijd op de wijze geëncodeerd zijn zoals de kolom- of tabel-definitie voorschrijft, anders gaan er ongetwijfeld zaken mis. Er is dan namelijk een grote kans dat MySQL data op de verkeerde manier omzet.

Als MySQL karakters niet kan vertalen wordt een karakter als "?" (vraagteken) geretourneerd. Stel bijvoorbeeld dat je een website hebt waarin je alles weergeeft in ISO-8859-1(5), en je database(-tabellen) hebben de utf8-charset dan connect je dus (nog steeds) met _set_charset('latin1'). MySQL probeert dan utf8-data terug te vertalen naar ISO-8859-1(5)... voor zover dat gaat, utf8 "ondersteunt" namelijk veel meer karakters dan latin1. De kans is dan dus ook groot dat er vraagtekens in opgehaalde database-data zit.

Het beste is nog altijd als alles (header, meta, _set_charset, database-tabellen en -kolommen) overeenstemt.

meer over conversie naar / werken met utf8

Offline  Thomas
Gepost op: 04 juli 2014 - 13:26
Moderator

Het is waar dat je voor PDO maar één set aan aanroepen hoeft te kennen (de methodes van de klasses PDO, PDOStatement en PDOException), onafhankelijk van de database die je gebruikt, maar daar zit de moeilijkheid ook helemaal niet!

De leercurve en de valkuilen zitten in het (in de eerste plaats) instellen en gebruiken van een database-specifieke driver.

Je kunt met PDO wel meteen aan de slag gaan met het gebruiken ervan, maar de kans is dan groot dat je ook heel snel weer vastloopt of geconfronteerd wordt met (schijnbaar) onverklaarbaar database-gedrag.

Je moet het zo zien: PDO zelf (de PDO-klasse waarmee je een connectie opbouwt) is op zichzelf niet te gebruiken voor een specifieke database, hiervoor zijn de eerdergenoemde database-specifieke drivers. De consequentie hiervan is dus dat PDO niet (per definitie) (goed) is geconfigureerd voor gebruik van een specifieke database(-driver)!

Hiertoe zul je je dus moeten verdiepen in de werking van de specifieke database-driver(s) die je gebruikt.

Daarnaast is PDO-land volop (?) in beweging. Er kunnen (grote) verschillen zitten in de werking van stukken PDO-functionaliteit tussen verschillende PHP-versies. Dit kan ook inhouden dat bepaalde delen compleet anders werken of niet (meer) werken. Ook werken bepaalde stukken functionaliteit gewoon niet in combinatie met bepaalde database-drivers. Dit kan dus resulteren in een hoop zoek- en testwerk met als eindresultaat dat iets gewoon niet werkt of niet ondersteund wordt.

Offline  Thomas
Gepost op: 05 augustus 2014 - 16:39
Moderator

mysqli_real_escape_string() is geen wondermiddel, als je invoer gebruikt die geen quotes bevat (denk aan 1 OR 1=1) dan wordt dit gewoon ongewijzigd in je SQL toegevoegd (mysqli_real_escape_string() escaped niets omdat er niets te escapen valt). Zie ook de reacties in dit topic op StackOverflow.

Naast (output) escaping blijft (input) filtering nodig (zo niet noodzakelijk). Als je een getal verwacht: controleer hier op en doe anders niets. Typecasting via (int) lijkt mij overigens, zoals eerder al aangehaald, niet zo'n strak plan.

Offline  Thomas
Gepost op: 13 maart 2015 - 16:39
Moderator

Naast de gebruikte extensie is het ook interessant om eens naar de driver (of connector) te kijken die je (bewust of onbewust) gebruikt.

Zo heeft de mysqlnd (MySQL Native Driver) een aantal voordelen ten opzichte van libmysql.

Via phpinfo() kun je onder het kopje "mysql" zien welke "client API version" je gebruikt.

Zie ook dit interessante artikel.

Pagina:

Enkel aanvullende informatie is welkom. Geen prijzende of afkeurende reacties.
 
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.014s