Moin Moin!
ich hab nun endlich diese Prepared Statements Geschichte verstanden, also, ich krieg statt errormeldungen nun das Gewünschte Resultat.
Aber ich bin noch etwas verunsichert, insbesondere wegen SQL-Injection, daher die Frage:
Wie übergebe ich $_SERVER arrays und Usereingaben an das verarbeitende Script?
Es geht um folgendes Schnippsel:
[code lang=php]
$myquery = $_SERVER['REQUEST_URI']; // muss ich hier Escapen?
Nein, denn die nächste Zeile überschreibt die Variable sofort wieder.
$myquery = $_GET['kategorie']; // muss ich hier Escapen?
Nein, verifizieren: #1039
Wenn der Kategorieparameter ein positivier Integer sein soll, dann prüfe das z.B. so (Perl-Syntax): $myquery=~/^\d+$/ or die "Hack mich nicht!";
$stmt = $verbindung->stmt_init();
if ($stmt->prepare("
SELECT
mein_menu.haupt_gruppe
FROM
mein_menu
WHERE
mein_menu.haupt_gruppe = ?
")) {
// warum bin ich der einzige, der mit . seine Tabellen verknüpfen muss?
Mußt Du ja nicht. Das ist in diesem Stückchen Code vollkommen überflüssig, es sei denn, Du machst sehr exotische Sachen mit der Datenbank.
$stmt->bind_param("s", $myquery);
$stmt->execute();
$stmt->bind_result($haupt_gruppe);
$stmt->fetch();
Boah, ist das umständlich. Kann PHP das nicht eleganter? Perl's DBI kommt ohne bind_result aus, stattdessen liefert eine von mehreren fetch-Funktionen direkt ein Array, eine Array-Referenz oder eine Hash-Referenz zurück. Das bind()en von Ausgabeparametern geht natürlich auch, macht aber mehr Tipparbeit.
printf("%s Title %s\n", htmlspecialchars($myquery), $haupt_gruppe);
// wie baue ich aus dem Resultat ein array?
Wiederhole fetch, bis es kein Ergebnis mehr liefert. Bei jedem Durchlauf wird $haupt_gruppe mit der nächsten Ergebniszeile überschrieben. Ich denke, fetch() dürfte einen entsprechenden Rückgabewert haben => RT(F)M.
$stmt->close();
Erst nachdem fetch nichts mehr liefert oder dich der Rest der Ergebnisse nicht mehr interessiert.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".