echo $begrüßung;
Ich nehme an, was Du mir damit sagen willst ist, daß bei der Prozedur mit den prepared Statements keine SQL Injection passieren kann, weil sich das System automatisch um das Escapen kümmert? Das habe ich schon verstanden.
Nicht ganz. Wenn du ein Statement zu Fuß zusammenbaust, bringst du dabei einzufügende Daten in den SQL-Satement-Kontext. Dafür ist eine kontextgerechte Behandlung erforderlich. Bei P.S. gehen Statement und Daten getrennte Wege. Die Daten werden also nicht in das SQL-Statement eingebettet werden, und müssen demzufolge auch nicht dafür behandelt werden.
Auf welche Art und Weise die Übertragung wirklich erfolgt, kann uns egal sein. Die Daten müssen in Rohform an die dafür vorgesehene Funktion übergeben werden und der Rest ist Blackbox.
Ich hab das mit der kontextbezogenen Behandlung schon auf die Ausgaben bezogen. Oder war Deine Antwort anders gemeint?
Du hast aber auch einen Kontextwechsel, wenn du Daten direkt in ein SQL-Statement einfügst.
Alle SQL-Statements, nicht nur diese vier, werden gleich behandelt, was den Weg zum DMBS hin betrifft.
Was willst Du mir _damit_ sagen?
Es gibt keinen Unterschied ob du einen Wert in ein SELECT- oder INSERT- oder Sonstwas-Statement einfügst. Ebenso müssen für alle Arten von Statements die Übertragungsbedingungen auf gleiche Weise berücksichtigt werden, was hier heißen soll, dass die Kodierung immer eine Rolle spielt und explizit ausgehandelt werden sollte.
- Alle Datensätze der Tabelle ausgeben mit mysqli:
echo "<p>".htmlspecialchars(stripslashes($id))." ==> ".htmlspecialchars(stripslashes($name))." aus ".htmlspecialchars(stripslashes($ort))." ist ".htmlspecialchars(stripslashes($geburtsjahr))."geboren.</p>\n";
Wenn du hier stripslashes() verwendest, weil du sonst ungewollte \ in der Ausgabe hast, dann hast du ein Problem mit den Magic Quotes, das du aber an ganz anderer Stelle lösen musst.
Ich verstehe Dich einfach nicht!!! Wenn man über das Formular zB beim Namen Hans eingibt und davor und danach ein Anführungszeichen schreibt, dann landet das als "Hans" in der DB. Aber nicht, weil ich mich darum gekümmert habe, sondern weil das durch das mysqli und den prepared Statements automatisch passiert, oder??
Du hast hier einen Nebenkriegsschauplatz, der durch das PHP-Feature Magic Quotes entsteht.
Hier geht es jetzt rein um die _Ausgabe_. Natürlich will ich die Stripslashes loswerden davor! Aber deswegen hab ich doch mit nichts Probleme??!
Na doch, dass es ein Problem ist, zeigt sich daran, dass du es behandeln musst, weil du sonst ungewollte Backslashes bekommst. Das Problem hätte nicht sein müssen, wenn das Feature Magic Quotes dir es nicht stillschweigend aufgetischt hätte.
Magic Quotes waren gedacht, um SQL-Injection-Probleme zu lösen. Doch dieses Feature wirkt auf alle Eingabedaten, nicht nur auf die, die in ein SQL-Statement eingebaut werden und auch auf die, die aufgrund von P.S. aus Prinzip kein SQL-Injection-Problem haben.
Hier geht es doch um keine Eingabedaten, hier gebe ich was _aus_!
Ja, das Problem entstand aber schon, offensichtlich ohne von dir bemerkt zu werden, beim Einfügen der Daten in das DBMS. Magic Quotes wollte für Sicherheit sorgen, hat aber stattdessen deine Daten ungewollt und unnötig verändert.
Wenn bei dir die Magic Quotes eingeschaltet sind, bekommst du nun fehlerhafte Daten in dein DBMS, weil der \ als ganz normales Zeichen angesehen wird. Sorge dafür, dass die Magic Quotes generell deaktiviert oder einmalig am Script-Anfang deren Auswirkungen rückgängig gemacht werden.
Mir wurde doch letztens extra erklärt, wenn ich diese moderne Form (also das mysqli) nehme, dann brauche ich keine Angst vor SQL Injections haben und mich auch nicht davor schützen, weil das das System automatisch macht. Und jetzt muß ich mich _doch_ plötzlich wieder um Dinge wie Magic Quotes kümmern?
Ein eingeschaltetes Magic Quotes behandelt vorsorglich vor dem Scriptstart sämtliche GPC-Daten (GET, POST, Cookie) mit addslashes(). Das ist (nicht nur) in deinem Fall kontraproduktiv, weil du dich selbst darum kümmerst, beziehungsweise es nicht brauchst, weil das Injection-Problem mit P.S. nicht relevant ist.
Dachte, das betrifft mich nur, wenn ich die althergebrachten Methoden verwende?
M.Q. interessiert sich nicht dafür, ob du P.S. verwendest, oder die Daten gar nicht in einen SQL-Kontext gelangen. Du brauchst M.Q.s nicht, also deaktiviere sie generell oder entferne nach dem Scriptstart die überflüssigen Zeichen.
Bei jeglicher Kommunikation mit dem DBMS sollte die Verbindungskodierung ausgehandelt werden, ansonsten wird ein System-Default-Wert verwendet. MySQL kodiert die Felddaten in die Verbindungskodierung um, wenn diese eine andere als die Feldkodierung ist. Das willst du nicht, wenn dein Default-Wert Latin1 ist, denn du willst ja mit UTF-8 weiterarbeiten. Außerdem gehen die Zeichen verloren, die nicht in Latin1 enthalten sind.
Aha. Bin zwar jetzt schon so verwirrt, daß ich gar nichts mehr verstehe, aber ich gebe es wieder dazu, lasse das also IMMER dabei.
Die Verbindungskodierungskonfiguration sorgt einerseits dafür, dass MySQL deine Statements und (P.S.-)Daten mit der angegebenen Kodierung interpretiert, andererseits, dass es seine Rückgabewerte in dieser Kodierung ausliefert.
2B) Ausgabe von Datensätzen unter einer Bedingung mit mysqli:
$sql = 'SELECTid
,name
,ort
,geburtsjahr
FROMtabelle1
WHEREort
='.$\_POST['ortsuche'].'
ORDER BYid
';
$ergebnis = $db->prepare( $sql );
Integriere den Parameter so in dein Statement, wie du das bereits bei 1) getan hast. Du verwendest P.S., also brauchst du keine Daten händisch in das Statement einzubauen.
Wie meinst Du das? BITTE schreib mir doch die Zeile so hin, wie es richtig wäre.
$sql = 'SELECT id
, name
, ort
, geburtsjahr
FROM tabelle1
WHERE ort
=? ORDER BY id
';
$kommando = $db->prepare($sql);
$kommando->bind_param('s', $_POST['ortsuche']);
// execute() usw.
Du möchtest wechselnde Daten in ein SQL-Statement einfügen. Es gibt keinen Unterschied zwischen Daten, die in die DB eingetragen werden sollen und solchen, die ein Suchkriterium darstellen. Für alle veränderlichen Daten kannst du einen Platzhalter notieren und anschließend eine Variablen-Bindung vornehmen.
echo "$verabschiedung $name";