PDO-Anmeldeskript, das immer auf Header-Seite umleitet

9
%Vor%

Wie Sie oben sehen können, hat mein Code zwei header() -Methoden, von denen eine auf die eingeloggte Seite umleitet, während die andere auf die Fehlerseite umleitet.
Ich glaube nach bestem Wissen, dass mein Skript nach meiner Eingabe auf die eingeloggte Seite umleiten sollte, was korrekt ist, aber es verhält sich in einer unerwarteten Weise.
Es wird auf die Fehlerseite statt auf die eingeloggte Seite umgeleitet. Bitte schauen Sie und sagen Sie mir den Grund, warum es nicht funktioniert? Vielen Dank! Auch, wenn Sie irgendwelche Fehler in meinem Code sehen, fühlen Sie sich frei, etwas Kritik einzureichen, wie ich mich selbst verbessern möchte. Vielen Dank.

    
Abandoned Account 20.04.2014, 05:50
quelle

2 Antworten

44
  

Ich werde etwas posten, das hoffentlich ein wenig nützlicher ist als die obigen Posts. Es gibt mehrere Best Practices, die hier zum Einsatz kommen können, um Ihr Leben beim Codieren zu erleichtern. nachdem du den Kopf natürlich um sie gelegt hast.

In erster Linie sieht das so aus, als ob Sie einen Authentifizierungsteil der Anwendung versuchen würden. Wenn der Benutzer einen korrekten Benutzernamen und ein Passwort eingibt, möchten Sie die richtige Seite anzeigen. Ich habe keine Ahnung vom Umfang Ihrer Bewerbung, deshalb werde ich keine massiven Änderungen vorschlagen.

Autoloading

Es sieht so aus, als würden Sie Ihre Dateien manuell einbinden. PHP hat spl_autoload_register , das, wenn Sie PSR-0 (und Sie sollten sich das wirklich ansehen) bedeutet, dass Sie Ihre Verzeichnisstruktur Ihrer Klassenhirachie 1 zuordnen können: 1 und lassen Sie Klassen automatisch für Sie gelöst werden, wenn Sie danach fragen. Wenn du also new Object oder sogar (in deinem Fall) extends Config sagst, wird deine Config -Klasse auf der obersten Ebene deiner Heirachy automatisch gefunden und verwendet. Dies beinhaltet das Erlernen von Namespaces .

Sobald Sie verstanden haben, wie Namespaces funktionieren und wie das automatische Laden Sie retten kann Entwicklungszeit (und ich meine auf lange Sicht bedeutsame Zeit), können Sie dann auf ein Dependency Management Tool wie Komponist wechseln. Composer ist im Grunde ein Skript, das Sie ausführen, das Ihren Autoloader für Sie generiert. Dann müssen Sie am Anfang Ihrer Anwendung nur require_once __DIR__ . "/vendor/autoload.php" eingeben. Aber ernsthaft, werfen Sie einen Blick auf einige Autoloading-Tutorials - sobald Sie sie verwenden, werden Sie nie wieder gehen und Im Grunde werden Sie sie in jeder einzelnen Anwendung verwenden, die Sie in Zukunft schreiben.

Sie müssen auch niemals include mehr als einmal eingeben - was übrigens nur eine Warnung auslöst, wenn die Datei, die Sie einfügen möchten, nicht gefunden wird. Es sieht so aus, als ob diese Datei die Konfigurationsdatei benötigt , daher sollten Sie stattdessen in diesem Fall require_once verwenden - was bedeutet, dass Ihr Code Fatal ist, wenn diese Datei nicht gefunden wird es scheint, was du willst).

OOP

Was ist los mit class Users extends Config ? Gut gemacht, zumindest für eine gute Namenskonvention (Caps für Klassennamen). Grundsätzlich bedeutet extends eine is-a Beziehung. Sie nicht nur erweitern, um zusätzliche Funktionalität zu gewinnen - das ist ein Code-Geruch. Sie sagen hier, dass ein User ein Config ist. Dies ist nicht der Fall, und wenn Sie diesen Code in Zukunft an andere Entwickler weitergeben würden, wären sie wie "Warten, WTF". Hoffentlich auf eine schönere Art und Weise.

Ihr Ziel ist: Konfigurationsvariablen in einer Klasse zu haben . Also, übergib sie stattdessen in die Klasse . Ich kann nicht sagen, was in Ihrer Config -Klasse ist, aber Sie sollten sich das Dependency Injection-Muster ansehen; Hier ist ein Tutorial . Im Grunde würden Sie Ihr Config -Objekt via DI (über den Konstruktor) übergeben, was Ihren Code dann entkoppelt , so dass Sie jedes Objekt einzeln auf seine eigenen Vorzüge testen und stattdessen die anderen Objekte mokieren können . Testbarer Code Abhängigkeitsspritze. Google es.

Also, nicht erweitern Config . Übergeben Sie stattdessen Ihre Konfiguration:

%Vor%

Sehen Sie sich auch die phpdoc-Syntax an, mit der Sie kommentierten Code schreiben können, den andere Entwickler leicht verstehen und parsen können. p>

Transaktionen

Sie verwenden auch Transaktionen, die Sie wirklich nicht für SELECT verwenden müssen. Warum nicht? Weil Transaktionen Ihnen erlauben, entweder commit oder rollback - aber wenn Sie eine Auswahl treffen, ändern Sie nicht Daten . Es macht also keinen Sinn, eine Transaktion durchzuführen. Entfernen Sie diese und versuchen Sie einfach, die Daten über SELECT abzurufen.

Ihr Header-Code

Jede Klasse, jedes Objekt sollte einen Grund haben, sich zu ändern. Eine Aufgabe, die es tut, und das war's. Wenn Sie Code haben, der aus der Datenbank liest, einige Zeichenfolgen vergleicht und in einer Datei speichert, dann sollten Sie mindestens 3 Klassen haben: eine, die aus Ihrer Persistenz liest, eine, die den Vergleich durchführt und eine, die in einer Datei speichert. Dies wird als Prinzip der einfachen Verantwortlichkeit bezeichnet, über das Sie lesen und googeln können.

Aus diesem Grund sollte diese einzelne Klasse nicht für das Senden von Kopfzeilen verantwortlich sein.Geben Sie entweder true oder false zurück und lassen Sie stattdessen die Klasse, die diese Klasse verwendet. Es ist nicht die Verantwortung dieser Klasse - dies sollte nur mit Authentifizierung zu tun haben.

Wenn Sie ein Framework ausgewählt haben, würden Sie dies entweder in Ihrem Controller oder in Ihrem View tun, je nachdem, wie nahe Sie dem MVC Muster - was im eigentlichen Sinne nicht wirklich für Web-Anwendungen möglich ist (ich sage das da für die Anal-Leute da draußen), aber wirklich - Sie sollte Ihre Bedenken trennen und zumindest SRP in Ihrer Codebasis eingehalten haben.

Sicherheit

Ich bin keineswegs ein Sicherheitsexperte, aber was Sie nicht tun, ist, dass Sie sowohl Ihren Benutzernamen als auch Ihr Passwort an die Datenbank weitergeben. Wenn Sie Ihre Passwörter hashen, sollten Sie die User nur über den Benutzernamen aus der Datenbank abrufen, dann berechnen, ob das Passwort mit dem Hash innerhalb Ihres PHP-Codes übereinstimmt oder nicht. Auf diese Weise senden Sie Ihr Passwort nicht an die Datenbank und dies hilft (wenn auch nur wenig) gegen SQL-Injektion . PHP 5.5 enthält einige wirklich nützliche password_ * Funktionen, um Ihnen in dieser Hinsicht zu helfen, aber wie Sie ' Verwenden Sie PHP 5.5 wahrscheinlich nicht, besuchen Sie die password_compat Bibliothek.

Was ist SQL-Injektion? Es gibt weitere Informationen von Bobby Tables , und auch dieses wirklich nützliche Bild unten.

Fazit

Dies sind nur ein paar Hinweise, damit Sie in die richtige Richtung zu einem besseren Code gelangen, den Sie an andere Entwickler weitergeben können, die sie verstehen und auf die Sie stolz sein können. Sehen Sie sich ein Framework wie Symfony an, damit Sie sich nicht um Authentifizierung, Autoloading und ähnliches kümmern müssen - alles ist für Sie erledigt. Der Komponist ist definitiv ein Muss. Sie müssen den Code Zeile für Zeile debuggen, var_dump() by var_dump() , bis Sie etwas sehen, das nicht Ihren Erwartungen entspricht. Debugging 101 hilft Ihnen und hilft uns auch, Ihnen mehr zu helfen.

    
Jimbo 20.04.2014, 17:48
quelle
-2

Tatsächlich ist dieser Code nur ein fantastischer Eintopf aus verschiedenen Aberglauben, Code-Schnipsel und Wahnvorstellungen. Es ist in vielerlei Hinsicht falsch, dass es kaum gerettet werden kann.

Fast jede Zeile enthält einige wesentliche architektonische Fehler. Um einige von ihnen zu skizzieren

  • Benutzer sollte config
  • nicht erweitern
  • Es gibt keine Verwendung für Transaktionen
  • es gibt absolut keinen Nutzen in Commit nach Skriptbeendigung
  • eine Ortskopfzeile, während der Block besonders scharf aussieht
  • sollte es keinen Versuch Block
  • geben
  • Es sollte keine Verlagerung direkt aus dem Methodentext
  • geben
  • nirgendwo kann der eigentliche Anrufcode gesehen werden
Your Common Sense 20.04.2014 06:49
quelle

Tags und Links