Moin!
Mit der Code-Analyse von Zend bin ich nicht zufrieden, denn:
Du hast schräge Erwartungen.
$erg = mysql_query("SELECT * FROM tb");
while($row = $erg) { } //Bug: Zuweisung in BedingungDas ist absolut so gewollt, würde ich meinen. Zuweisungen in while-Bedingungen sind jedenfalls häufiger, als du glaubst, und sie gehören dort auch absolut hin.
Es ist aber sehr nervig, wenn man evt. 10 bis 20 MySQL-Abfragen in einem Script hat.
Wenn ich mehr als eine MySQL-Abfrage in einem Skript habe, dann schreibe ich mir dafür mindestens mal eine Funktion, die mir die gesamten nervigen Low-Level-Handlungen abnimmt.
Bei größeren Projekten schreibe ich mir aber lieber gleich eine komplette Datenbank-Klasse, deren Konstruktor automatisch die Verbindung zur DB herstellt,und dessen weitere Methoden explizit mit in dieser Klasse definierten SQL-Abfragen auf den anfallenden Informationsbedarf ausgerichtet sind und mit einem genormten Interface (meist ein schlichtes Array mit allen DB-Ergebnissen) die Ergebnisse an das Hauptskript zurückmelden.
Und wenn ich so eine Array-Liste dann ausgeben lassen will, dann schicke ich dieses Array direkt zur Template-Klasse, welche aus dem Array und dem Template dann automatisch eine komplette Liste fertigt.
So halte ich mein Hauptskript frei von nervigen Detailarbeiten und behalte auch dort den Überblick. Und zusätzlich begrenze ich den Einfluß von schädlichen Variablen, die mir ein eventuelles register_globals=on einschleppen könnte, denn innerhalb von Funktionen und Klassen gelten diese globalen Variablen schließlich nicht.
Außerdem erkennt es keine Variablen die per Include geladen werden.
Bps:
<?php
include("db_verbindung.inc.php");
mysql_query("DELETE FROM tb",$verbindung);
?>Da $verbindung in dem Script nicht deklariert wurde, aber in db_verbindung.inc.php, erhält man bei jedem MySQL-Query eine Meldung. Und wenn man viel mit ausgelagerten Variablen/Konstanten arbeitet, z.B. auf Grund von Sprach-Dateien (Pharsen), kann man so schon mal an die 30 Meldungen und mehr Fehler für "nicht deklarierte Variablen" erhalten.
Ich benutze gar keinen Code-Analysator. Deine Probleme mit existierenden Modellen kann ich absolut nicht nachvollziehen.
Dein hier dargestelltes Problem würde aber mit einer Datenbankklasse entfallen. Da gäbe es dann nur noch eine delete-Methode in der Klasse, und das ganze MySQL-Geraffel wäre ebenfalls im Include-File untergebracht. Und schon kann der Analysator auch nicht mehr meckern.
Mir scheint einfach, dass du noch nicht den richtigen Quelltext-Stil entwickelt hast. Analysatoren müssen natürlich von gewissen Richtlinien ausgehen, die sie als gut erkennen sollen, und Abweichungen davon dann als schlecht. Und es kann in meinen Augen nicht gut sein, wenn ein Skript eine Variable benutzt, deren Existenz in einem ganz anderen Skript erst sichergestellt wird. Zu leicht werden diese zwei Dateien - ggf. unabsichtlich - getrennt und funktionieren einzeln dann nicht mehr wie geplant.
Und das Notice erhält man auch nicht immer:
Bsp:
<?php
if(!isset($db_verbindung))
$fehler = "Keine Verbindung zur DB";//Paar weitere Zeilen Code
echo $fehler;
?>Dort wäre ja mit register_globals = On eine XSS-Attacke möglich.
Die übliche Vorgehensweise wäre, zu Beginn
$fehler = "";
Dann die ganzen Prüfungen, die ggf. in $fehler Meldungen eintragen.
Und am Ende dann meinetwegen ein
echo $fehler;
Wahrscheinlicher aber ein
if (strlen($fehler)>0)
{
echo $fehler;
}
- Sven Rautenberg
My sssignature, my preciousssss!