Alexander (HH): Frage zu Prepared Statement

Beitrag lesen

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".