• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Prepared Statement, kleines HowTo

__struct

Jonagold
Registriert
11.04.13
Beiträge
20
Hi,

gerade Neulinge im Bereich sql & php scheitern häufig an prepared Statements. Vermutlich da mit Klassen gearbeitet wird. ObjektOrientiert.

Im Grunde ist es recht simple und bringt verschiedene Vorteile.

1. Prepared Statements macht den Einsatz von Input Sanitation Verfahren {"unter vorbehalten"} in erster Instanz unnötig.
- klassische Methoden zum Vorbereiten von Queries wären z.B. MySqlRealEscapestrings | Addslashes | StripTags und vergleichbares
- im Paradigma der Prepared Statements wird das automatisiert und man kann seine Daten ungefiltert abschicken.

2. Prepared Statements sind ideal um viele Queries hintereinander abzuschicken bei denen sich lediglich die Werte ändern.


Um es kurz zu machen:

Man erstellt eine openDB.php.inc Datei. Wie gewohnt deren Inhalt wie folgt aussieht:

Code:
<?php
$datenbanknutzer = 'dbnutzer'; 
$nutzerpasswd    = 'passwd';

// Objekt erzeugen 
$dbh    = new PDO("mysql:host=127.0.0.1;dbname=dbname", $user, $passwd);

?>


Bei Bedarf wird die Datei eingebunden:

Code:
require_once '/inc/openDB.php.inc';


Weitere Vorbereitungen sind nicht nötig und man kann direkt loslegen.


Code:
$id = '10';
$parent = '2';

$sth = $dbh->prepare('SELECT * FROM XY WHERE id = ? and parent = ?'); 
$sth->execute(array($id,$parent));

/*
*
* das Beispiel wäre eindeutig (id) und gibt nur eine Zeile zurück
*
*/ 

$result = $sth->fetch();
$id = $result['0'];
$xy = $result['1'];

/* etc. */


Werden mehrere Zeilen angesprochen lassen sich die Ergebnisse in einem foreachloop auslesen:

Code:
$sth = $dbh->prepare('SELECT * FROM xy WHERE x LIKE ? AND y = ?'); 
$sth->execute(array('%'.$xsearch.'%',$Ykriterium)); 
foreach($sth as $result){    
   $id = $result['0'];
   $columnB = $result['1'];
 }

/* etc. */



Feuert man eine query mit unterschiedlichen Werten mehrfach hintereinander sähe das z.B. so aus:

Code:
$sth = $dbh->prepare('SELECT * FROM xy WHERE id = ?');

for($i = 0;$i <= 100;++$i){
$sth->execute(array($i));
$result = $sth->fetch();
var_dump($result);
}


Zum schließen der Verbindung:

Code:
$dbh = NULL;
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Bierhefe