Schlechtes Script
Poison of the Cursed
- php
Hallo Zusammen,
ich habe mal eine allgemeine Frage zu PHP-Scripten. Ich habe ein Problem mit einem Login-Script, welches seit dem 09.01.2011 online ist. Sporadisch tritt immer wieder der Fehler auf, dass der If-Zweig einer Anweisung anscheinend übersprungen wird. Zumindest wird das ECHO in diesem If-Zweig nicht angezeigt. Anhand einer Punkteliste ist aber nachzuvollziehen, das eine Gutschrift von Punkten trotzdem erfolgt. Das Script funktioniert also bis auf das ECHO ok.
Seltsam ist nur, 10 Tage lang funktioniert alles gut, dann tritt der Fehler auf und einen Tag später funktioniert es wieder einwandfrei.
Hier mal der Teil des Scripts der Probleme macht:
//hier steht ein header
if(isset($_GET["login"]) AND !empty($_GET["login"]))
{
$abfrage = "SELECT COUNT(id) FROM nachrichten
WHERE an='" . mysql_real_escape_string($_SESSION["username"]) . "' AND status=0";
$ergebnis = mysql_query($abfrage);
$mengeid = mysql_fetch_row($ergebnis);
$mengeid = $mengeid[0];
if($mengeid == 0)
{
$nachrichten = 'Du hast keine neuen Nachrichten.';
}
else if($mengeid == 1)
{
$nachrichten = 'Du hast <b>1</b> neue Nachricht.';
}
else
{
$nachrichten = 'Du hast <b>'.$mengeid.'</b> neue Nachrichten.';
}
$abfrage = "SELECT gutschrift FROM steckbrief WHERE nickname='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
$eingeloggt = date("Y-m-d H:i:s");
$datum = date ("Y-m-d");
if($row->gutschrift < $datum)
{
$aendern = "UPDATE steckbrief Set eingeloggt='" . mysql_real_escape_string($eingeloggt) . "',
punkte=punkte+2, gutschrift='" . mysql_real_escape_string($datum) . "'
WHERE nickname='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
//dieser Teil wird manchmal übersprungen
echo '<p>Hallo <b>'.htmlspecialchars($_SESSION['username']).'</b>, schön das Du da bist!<br>
Für Deinen heutigen Besuch werden Dir 2 Punkte gutgeschrieben.</p>';
}
else
{
$aendern = "UPDATE steckbrief Set eingeloggt='" . mysql_real_escape_string($eingeloggt) . "'
WHERE nickname='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
echo '<p>Hallo <b>'.htmlspecialchars($_SESSION['username']).'</b>, schön das Du da bist!</p>';
}
}
Zum Verständnis:
Die "Weiterleitung" per header habe ich nur eingefügt um eine Art auffrischen der Seite zu erreichen, damit in der Navigationsleiste der Link Login gegen den Link Logout gewechselt wird, ohne dass der Besucher zuerst eine andere Seite aufrufen muss. Es geschah nicht, um irgendwelche Fehler im Script zu vertuschen, wie mir in einem anderen Forum unterstellt wurde.
Nun wurde mir gesagt, mein Script wäre absolute sch... und ich sollte statt der Echo-Ausgaben im Script (ich hatte das Ganze auch schon mit EVA, also Variablen $error/$output mit Ausgabe am Ende gemacht) jedesmal eine html-Datei includieren, so dass am Ende eine separate PHP-Datei übrig bleibt, in der nur noch PHP steht und alles, was html betrifft in separaten Dateien eingebunden wird. Nach diesem include, also beispielsweise der Meldung, dass der Nickname nicht eingegeben wurde oder das Passwort nicht korrekt ist, sollte dann das Script mit "exit" beendet werden.
Das würde in diesem einen Fall 9 Dateien für eine Login-Seite bedeuten.
Macht jemand von euch das auch so? Ist das nicht unheimlich aufwendig?
Versteht mich bitte nicht falsch, wenn diese Art zu programmieren, das absolute ultimo ist, mache ich das so. Ich möchte schließlich gute Scripte schreiben. Ich hätte nur gern gewusst, ob das wirklich der Fall ist, bevor ich jetzt alle meine Scripte umschreibe. Ich habe nämlich Seiten, bei denen ich bestimmt noch mehr wie 9 zusätzliche html-Dateien brauche, die ich sonst für keine weiteren Scripte mehr verwenden kann, weil bei mir keine Seite bzw. keine Ausgabe gleich ist.
Wäre super, wenn sich jemand melden würde.
Gruß
Poison
Hallo,
ok, ich habe eine Beispiel bekommen, wie so ein Script mit includierten Dateien aussehen könnte:
<?php
// Pfad für XAMPP und HOSTER nach Bedarf definieren
If (($_SERVER["DOCUMENT_ROOT"] == "C:/xampp/htdocs") ? $rootpath = "C:/xampp/htdocs" : $rootpath = "/www/htdocs/HOSTER");
$inc_path = $rootpath."/scripts/";
/* ******* wichtig zum debuggen >>echo "<br> erg - ".mysql_errno(). ": " . mysql_error()."<br>"; ******* */
/*** einzubindende Dateien ***/
include_once ($inc_path."session.inc.php" ); // Charset = UTF-8, Erzwingen Session-Cookies, Session starten
include_once ($inc_path."common.inc.php" ); // serverabh. Parameter, error_reporting, Konstanten, DB, Crypt/Decrypt
// include_once ($inc_path."functions.inc.php"); // weitere nicht immer benötigte Funktionen
// include_once ($inc_path."validate.inc.php" ); // Validierungsroutinen
// include_once ($inc_path."login_func.inc.php" ); // Funktionen für den Login-Vorgang
/* lokale Parameter für HTML, Zielfile für Submit im Formular */
$head_titel = 'ss Mail'; // Anzeige Browser-TAB
$ueberschrift = 'Out'; // Überschrift der Seite
$_SESSION['action_tag'] = "ss_mail.val.php"; // Zielfile für Submit im Formular
include_once ($inc_path."check_user.inc.php" ); // User-check, DB öffnen - immer für gesicherte Seite notwendig
{ // Überprüfung der Rechte gergab JA, nur dann den HTML Teil ausgeben,
// bei NEIN erfolgte vorher eine Umlenkung auf die Loginseite
if (!isset($_SESSION['ss_mailsubject'])) $_SESSION['ss_mailsubject'] = '';
if (!isset($_SESSION['ss_mailtext'])) $_SESSION['ss_mailtext']= '';
/*** -- Main -- ***/
include_once ($inc_path."html_header.inc.php" ); // HTML-Kopf, Header, Navigation, Titel
include_once ($inc_path."message.inc.php" ); // Meldungen ausgeben
include_once ("ss_mail.form.php" ); // Mailformular anzeigen
include_once ($inc_path."html_footer.inc.php" ); // HTML-Ausklang
/*** -- Main -- ***/
} // ende 'Rechte: JA'
?>
Macht das jemand von Euch so oder ähnlich?
Bin dankbar für jeden Tipp/Anregung, wie ich diese Art zu programmieren auf mein Script (sorry, dass ich beim letzten Mal nur einen Auszug mitgeben konnte) anwenden könnte.
Liebe Grüße
Poison
Nur ganz kurz zu Deiner allgemeinen Frage:
Ich includiere nur Dinge, die ich an verschiedenen Stellen benötige (also z.B. Menüs oder Funktionen). Dinge, die ich eh nur auf einer Seite bzw. innerhalb einer Datei benötige, brauche ich auch nicht auslagern und dann includieren. Das macht's nur unübersichtlicher... Auf der anderen Seite brauch ich nicht an 5 Stellen das gleiche schreiben, wenn ich es einmal tun kann und dann 5x includiere...
Ich bin aber auch kein Programmier-Profi bzw. halte mich nicht unbedingt immer an alle "ultimos"... Allerdings bin ich i.d.R. auch der einzige, der mit meinem Code klarkommen muss ;)