PHP: Bedingung wird nie erfüllt
bearbeitet von
Hi(gh)!
> Moin Yadgar,
> Das ist so keine gute Idee, weil das eine astreine *SQL-Injection*-Lücke ist. Man braucht dein Script nur mit dem URL-Parameter `?edit=' or ''='` aufrufen und es wird einfach mal alles `SELECT`iert. Du möchtest Escaping oder besser
> _prepared statements_ verwenden!
Nein, das möchte ich in diesem Fall nicht, denn:
https://forum.selfhtml.org/self/2021/oct/14/php-bedingung-wird-nie-erfullt/1792511#m1792511
> Das _Stichwort_ möchte wohl ein [`label`](https://wiki.selfhtml.org/wiki/HTML/Elemente/label) sein.
Ja, das macht man heutzutage wohl so...
> * Wenn die Bedingung einmal erfüllt ist, wird `$zusatz` gesetzt, es wird aber nie zurückgesetzt, falls die Bedingung nicht mehr erfüllt ist.
Stimmt, das ist ein Fehler!
> * `$zeile2[0]` ist vermutlich ein Skalar, `$entry1` ist ein Array.
Yep!
> * `$zeile2[0]` wird unbehandelt in den HTML-Kontext gesetzt. Damit besteht die Gefahr von *Cross Site Scripting*.
>
s. o.
> `$entry2` wird unbehandelt in den HTML-Kontext gesetzt. Damit besteht die Gefahr von *Cross Site Scripting*.
s. o.
> Vermutlich ist der Vergleich eines Skalars mit einem Array `false`.
Ist er, ich hatte nicht bedacht, dass fetch_array() auch im Falle eines einzigen Feldeintrags als Ergebnis dieses immer in doppelter Ausführung (mit numerischem und Label-Index) und damit natürlich als Array raushaut...
Also korrigierte ich den Code:
~~~
<select name="stichwort">
<?php
while ($zeile2 = $res2->fetch_array())
{
echo $zeile2[0]."<br>";
if (!empty($_GET["edit"]) && $zeile2[0] == $entry1[0]) // jetzt mit Index!
{
echo "Bedingung erfüllt!<br>"; // Kontrollausgabe
$zusatz = " selected";
}
else
{
$zusatz =""; // auf Leerstring zurückgesetzt falls Bedingung unwahr
}
echo "<option".$zusatz.">".$zeile2[0]."</option>\n";
}
?>
</select><br>
~~~
...und jetzt funktioniert es! Danke für die Hinweise!
Bis bald im Khyberspace!
Yadgar