Beste leden,
Hierbij een korte maar i.m.o. krachtige uitleg over het gebruik van PDO.
Gebruikte SQL:
De PHP-code waarin alle uitleg verwerkt staat:Code:-- -- Tabel structuur voor tabel `timetable` -- CREATE TABLE IF NOT EXISTS `timetable` ( `timetable_id` smallint(5) NOT NULL auto_increment, `name` varchar(25) NOT NULL, `last_update` datetime NOT NULL, PRIMARY KEY (`timetable_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -- Gegevens worden uitgevoerd voor tabel `timetable` -- INSERT INTO `timetable` (`timetable_id`, `name`, `last_update`) VALUES (1, 'Sitedeals', '2008-12-24 17:38:01'), (2, 'Webdevelopment', '2008-12-24 17:38:01');
Fouten voorbehouden.PHP Code:
<?php
/**
* @author Ivo van Beek
* @copyright 2008
*/
/**
* Bestaat de class PDO?
*/
if (class_exists('PDO')) {
/**
* Is de MySQL driver voor PDO beschikbaar?
*/
if (in_array('mysql', PDO::getAvailableDrivers())) {
/**
* Try block.
*/
try {
/**
* Probeer een verbinding te maken met de database.
* De eerste parameter is de DSN, de data source name, hierin staan de drivernaam, de host, de databasenaam en de poort.
* De tweede parameter is de gebruikersnaam van de database.
* De derde parameter is het wachtwoord van de database.
*/
$oPDO = new PDO('mysql:host=localhost;dbname=sitedeals;port=3307', 'username', 'password');
/**
* Geef aan dat de "Exceptions" willen gebruiken.
* PDO maakt gebruik van PDOException.
*/
$oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/**
* De MySQL driver van PDO kan beter, vandaar dat we 2 instellingen veranderen.
*/
$oPDO->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$oPDO->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
/**
* PDO kent veel mogelijkheden, ik ga enkel "gewone" queries en prepared statements uitleggen.
*/
/**
* Ik begin hier met de methode PDO->exec().
* Deze methode is handig als je gaat updaten en deleten, deze methode retouneert namelijk het aantal "affected rows", de rijen die door de UPDATE of DELETE query "geraakt" zijn.
* Deze methode gebruik ik niet vaak, daarover meer bij het prepared statements gedeelte.
*/
$iTimetablesUpdated = $oPDO->exec("
UPDATE
timetable
SET
last_update = NOW()
");
echo 'Er zijn ' . $iTimetablesUpdated . ' rijen geupdate.
<hr />';
/**
* Nu kom ik bij de query methode.
* Deze methode is vooral handig als je dingen gaat selecteren.
* Deze methode gebruik ik niet vaak, daarover meer bij het prepared statements gedeelte.
*/
$aGetLastTimetable = $oPDO->query("
SELECT
*
FROM
timetable
ORDER BY
last_update
DESC
LIMIT 1
")->fetch(PDO::FETCH_ASSOC);
if ($aGetLastTimetable) {
echo 'Laatste timetable:
<br />
ID: ' . $aGetLastTimetable['timetable_id'] . '
<br />
Naam: ' . $aGetLastTimetable['name'] . '
<br />
Laatste update: ' . $aGetLastTimetable['last_update'] . '
<hr />';
} else {
echo 'Geen laatste timetable gevonden.
<hr />';
}
/**
* Snelle, vieze oplossing om te zorgen dat het voorbeeld hieronder altijd goed werkt.
*/
$_GET['name'] = (isset($_GET['name']) ? $_GET['name'] : '');
/**
* Prepared statements, iets wat ik gigantisch veel gebruik.
* Prepared statements zijn handig vanwege de overzichtelijkheid, veiligheid, en snelheid(Vooral als je ze meerdere keren wil uitvoeren met steeds verschillende parameters).
*/
$oSelectTimetables = $oPDO->prepare("
SELECT
timetable_id,
last_update
FROM
timetable
WHERE
name = :name
LIMIT 1
");
/**
* Wat we hier doen is de parameter name binden, we geven :name een waarde, namelijk $_GET['name'].
* $_GET['name'] zal door bindParam direct onschadelijk worden gemaakt, SQL injection is niet meer mogelijk.
*/
$oSelectTimetables->bindParam(':name', $_GET['name'], PDO::PARAM_STR);
/**
* We geven groen licht, de prepared statement mag uitgevoerd worden.
*/
$oSelectTimetables->execute();
/**
* Een soort van num_rows, tel het aantal rijen.
*/
if ($oSelectTimetables->rowCount() == 1) {
/**
* Fetch de gevonden data, PDO::FETCH_ASSOC geeft aan dat we ASSOC willen gebruiken, een array met key's die de naam van de kolommen bevatten en values met de waardes van de opgevraagde kolommen.
*/
$aTimetableInfo = $oSelectTimetables->fetch(PDO::FETCH_ASSOC);
echo 'Timetable gevonden:
<br />
ID: ' . $aTimetableInfo['timetable_id'] . '
<br />
Name: ' . htmlentities($_GET['name'], ENT_QUOTES) . '
<br />
Laatste update: ' . $aTimetableInfo['last_update'] . '
<hr />';
} else {
echo 'Geen resultaten gevonden die voldoen aan uw zoekopdracht.
<hr />';
}
}
/**
* Vang de fouten op die in het try-block "gegooid" worden.
*/
catch(PDOException $e) {
/**
* De uitgebreide foutmelding met alle benodigde informatie.
* Dit is niet iets wat "normale" bezoekers mogen zien, gebruik dit als je aan het debuggen bent of log deze gegevens.
* Kan veel netter natuurlijk, maar dit is meer om te laten zien wat er allemaal kan.
*/
echo '<pre>'. $e->getMessage() . '<br />' . print_r($e->getTrace(), true). '</pre>';
}
} else {
// MySQL driver voor PDO niet beschikbaar.
}
} else {
// PDO niet beschikbaar.
}
Mvg, Ivo
- PDO in een notendop
-
24-12-2008, 17:38 #1Ondernemer
- Berichten
- 209
- Lid sinds
- 18 Jaar
PDO in een notendop
Laatst aangepast door Ivo van B. : 24-12-2008 om 17:46
-
In de schijnwerper
Backlinks plaatsen op websites met echte content én bezoekers?AdvertentieruimteTransparant je linkbuilding uitbesteden? Equote.nl helpt je verder!LinkpartnersOnline Cursus Zelfvertrouwen (.nl) is te koop | Met SEO waardeDomein te koopComplete domeinnamen portfolio te koop wegens voorlopig stoppenDomein te koop
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic