Validieren | Absenden einer Form verhindern?

  • Ich validiere die form mit dem jQuery Validation Plugin, sollte man das eigentlich benutzen? Ich sehe auch online viele eigene Validierungen etc. oder wird das auch wohl häufig so genutzt?
    Nun zum eigentlichen Thema: Kann ich irgendwie verhindern, das die Form abgesendet wird, wenn die Daten falsch sind, also um bspw. mit JS dann halt auch direkt dort eine Meldung anzuzeigen? Ich will das konkret für ein Login Formular haben, damit sich die Seite nicht immer neuladen muss. Das ich die Meldung und Überprüfung mit PHP nicht entfernen sollte ist mir schon klar. ;)


    Kann man dann irgenwie den SubmitHandler modifizieren?

    Code
    submitHandler: function(form) 
    {       	
    
    },


    oder müsste ich dann schon konkret die PHP Funktion für das Login auslagern oder irgendwie sowas dergleichen? Wenn ich das so zu dem jQuery .validate hinzufüge, dann wird die Form nicht mehr abgeschickt aber ich bräuchte dann ja auch noch irgendwie etwas, um die dann bei der Eingabe der richigen Daten dann auch abzuschicken. :D
    Es muss ja schließlich echt nicht sein, das sich die Seite bei aktivietem js immer neulädt also wie kriege ich das hin, das die Seite bei falschen Login Daten nicht abgesendet wird?

  • JavaScript
    $( "button" ).click(function( event ) {
    if (!validate)
    {
      event.preventDefault();
    }
    }


    Damit die Standardaktion(absenden unterdrücken) :)

  • ja, das habe ich schon herausgefunden, das habe ich ja auch schon oben mit dem SubmitHandler erreicht aber darum geht es mir ja auch nicht, zumindest nicht im ganzem.
    Ich will ja dann auch irgendwie im PHP Teil, sozusagen JS irgendwie mitteilen, dass das Formular abgeschickt werden kann, wenn die Login Daten dann richtig waren, also wie erreiche ich das oder was muss ich dafür tun.


    Ich erkläre es noch einmal kurz:
    Mein Login Formular soll nicht abgeschickt werden, wenn die Login Daten nicht korrekt sind ABER es soll abgeschickt werden, wenn die Login Daten korrekt sind.

  • Es wird doch immer abgeschickt um dies zu überprüfen..
    Du kannst via ajax überprüfen ob korrekt oder nicht, wenn nicht ne meldung rausballern und wenn doch die Seite neu laden, abschicken brauchst du das form. dann ja nichtmehr


    Tutorial jQuery AJAX

  • Mh, stimmt. Da hatte ich einen kleinen Denkfehler.
    Ich habe das ganze jetzt mal soweit mit ajax aufgebaut.


    Die Login.php Datei, allerdings ein wenig gekürzt.



    und der jQuery part:


    Jetzt kriege ich immer die Meldung, das der ajax part erfolgreich durchlief, selbst wenn die Login Daten nicht richtig waren, was fehlt da noch? Müsste ich dem ajax teil jetzt nicht jetzt auch noch irgendwie mitteilen, das auch wirklich ein Benutzer mit diesen Daten gefunden wurde?

  • Naja, der Ajax-Aufruf war erfolgreich.
    Das Problem ist der Ablauf im PHP-Script.


    Mögliche Lösung (falls das PHP-Script NUR für diesen call via ajax genutzt wird)
    (btw: paar Änderungen/Vorschläge eingefügt)


    in der jquery func success prüfst Du nun

    JavaScript
    ...
                    success: function(data){
                        // weiß grad nicht wie jquery die daten schmeisst, solte aber passen:
                	    if(data && data["login"] && data["login"] === true){
                            // hier die meldung ausgeben, dass login ok war und weitergeleitet wird (weiterleitern dann per JS)
                        }
    // else -- wenn data["login"] === false, dann nicht eingeloggt, und wenn data["error"].length > 0 dann ist eine fehlermeldung vorhanden
            	},
    ...


    redirect mit js einfach mal "JS location redirect" suchen

  • @cotton
    Kann ich sowohl für den Ajax call, als auch für das PHP Login nich einfach dasselbe PHP Skript nehmen?
    Du sagtest ja, dass das dann nur für den Ajax call wäre?


    Das mit dem isset war übrigens ein kleiner Fehler, danke für den Hinweise! ;)
    Das hatte ich wohl irgendwie zweimal geschrieben oder kopiert, ist ja auch egal.


    Das mit dem sicherem Login wollte ich später machen, es ist schon klar, dass das alleine so auf gar keine Fall sicher ist aber es ist ja manchmal auch wirklich schwer, gute Anleitungen zu finden. Selbst in Büchern steht das ganze ja am Anfang zu "lernzwecken" falsch drin aber ebenfalls danke für den Hinweis.


    Ist dieses Tutorial eigentlich auch gut? Ich glaube, dass das Tutorials sogar noch um einiges umfangreicher ist.
    http://wiki.selfhtml.org/wiki/…ng_und_Praxis/Loginsystem


    Ich hätte auch noch mal eine kleine Frage nebeni und und zwar ob man eigentlich statt $_POST["Nachricht"] != "" lieber !empty($_POST["Nachricht]) nutzen sollte oder kann man das eigentlich alles mit isset($_POST["Nachricht]) ersetzen? isset prüft doch sowohl ob es die Variable gibt, als auch das diese gesetzt ist oder?

  • Dann musst Du mischen.


    Per ajax (POST sicherlich beim Login) sendest Du einen weiteren Schlüssel (Key) und der Value true.
    Damit kannst Du im Script erkennen, auch welche Art Du die Rückmeldung liefern musst.


    Wie gesagt - die success function von ajax/jquery springt ja an, wenn der Aufruf erfolgreich war.
    Ein Aufgerufenes Script kann das Wort "Hundehaufen" ausgeben - das ist für den ajax call ein success :D


    Das Tut hab ich mir nicht angesehen - ich mag die Seite generell nicht (persönlich).
    Was wolf und ich aber meinten ist das Generieren des Hashes.
    Der Ablauf des Logins kann dann auf 1000 verschiedenen Wegen passieren.


    isset und empty:
    isset() prüft ob eine var gesetzt ist (existiert und nicht null)
    empty pfrüft ob eine var "leer" ist. Leer ist aber auch 0, null, false, "0", ... -- also (mMn) zu schwammig.


    Prüfe auf das, was Du erwartest.
    Der Benutzername zB muss ja
    - gesetzt sein ( isset ),
    - nicht leer sein ( strlen )
    - eine bestimmte min Länge haben ( strlen ... >= x )
    - ein bestimmtes Format haben ( regex )

  • Also würdest du statt !empty einfach mit strlen arbeiten? Ist ja, jetzt wo du es auch mal gesagt hast auch im Prinzip dasselbe wie der test, den man mit isset sowieso immer machen sollte und dann die Überprüfung mit bspw. so macht strlen($_POST["User"]) >= 3. Also sollte der Wert auf jeden Fall schon einmal nicht 0 sein und größer gleich 3. ;)


    Ja, das Formular wird, wie du schon richtig bemerkt hast mit POST abgeschickt und ajax auch.
    Meinst du das denn mit dem zusätzlichem Key so?



    Seltsamerweise kriege ich jetzt aber auch immer die Fehlermeldung unten in dem .fail Teil ausgegeben, liegt das jetzt an dem zusätzlichem Key? Das Formular wird zudem trotzdem auch immer noch abgeschickt und der ajax Teil läuft auch noch, was ja nicht soll.


    Sollte man denn auch die anderen Ajax Fehlerfälle da überprüfen, es gibt ja glaube ich noch .failure und noch was anderes oder? Das mit der Fehlerprüfung bei dem success ist doch so richtig oder?
    Ist das mit dem abschicken denn dann eigentlich auch so okay, also nimmt der dann die Daten vom Formular selber oder muss ich sonst noch etwas bei data mitgeben? Irgendwie bin ich jetzt auch total verwirrt.


    Der PHP Teil sieht jetzt so aus:



    Um den sicheren Login kümmere ich mich nachdem ich das fertig habe, also bitte kein Kommentar dazu. ;)


    P.S: Wieso wird der Javascript Code eigentlich immer falsch eingerückt? Ich hatte das hier richtig eingefügt aber ein Teil des Codes ist irgendwie ein wenig verrutscht aber ich hoffe mal, das man das ganze trotzdem noch gut lesen kann, sow as hasse ich ja.

    3 Mal editiert, zuletzt von BlackFire () aus folgendem Grund: JS tag vergessen und Inhalt ergänzt

  • Du hast ganz schön viel verschlimmbessert. :D
    Alles nochmal zurück.
    Nutze am besten den zusätzlichen Key via GET:

    JavaScript
    url: "Backend/backend.php?ajaxLogin=true",


    Den Rest wie vorher, also vor Deinem letzen Post.


    Zum PHP:

    Zitat

    wird geben dem "angreifer" keinen hinweis, daher fällt das hier weg


    Beim Login sagst Du dem Nutzer nicht, dass der Name oder pw zu kurz war.
    Also brauchst Du auch keine bestimmte Länge prüfen. Sondern nur ob strlen() > 0.
    Du kannst auch weiterhin empty() nutzen. Ich find empty() nur irgendwie ecklig() :D
    Rest per Kommentare:

  • Sollte der dann nicht auch eigentlich oben beim Absenden stehen? Irgendwie sehe ich das nicht oben in der Adresszeile. Du hast aber recht, das ich wohl einiges irgendwie weggelassen habe, oh man ..
    Ich habe das ganze jetzt noch einmal ein wenig modifiziert:


    Das JS Skript:


    Das PHP Skript:


    Jetzt kriege ich auch wieder die Meldung, das der ajax Aufruf erfolgreich war aber die Weiterleitung und die Anzeige, das der Login erfolgreich war kommt immer noch nicht. Das mit dem strlen war auch eigentlich so Absicht, damit sich das ganze nicht so aufploppt aber ich habe es jetzt mal ganz dargestellt, ist das so okay? :D
    Das mit deiner Aussage mit der strlen verstehe ich aber nicht? Wenn ich sage, das der strlen > 3 ist, dann muss die strlen ja auch über 0 sein, also ist das doch dann gleichbedeutend mit !empty oder verstehe ich da was falsch? 0 wäre ja < 3, somit false,


    Was sollte man denn da beim Login noch prüfen, als? isset($result) and !empty($result) and is_array($result)?
    Das mit dem weglassen nach dem $smarty->display('pass.php); war auch übrigens Absicht, nur dass das exit; fehlt stimmte. Die pass.php ist jetzt meine Weiterleitungsdatei, von daher muss das da ja wohl nicht mehr stehen?

    Wieso ist eigentlich Select * schlecht, wenn man alles von der Tabelle braucht, wieso nicht?


    Noch einmal zu dem ajax Aufruf: Ich habe da jetzt auch noch einmal Method: 'POST' ergänzt aber das ist ja auch sowieso der normalfall, richtig?
    Sollte man denn auch die anderen Ajax Fehlerfälle da überprüfen. .Failure gibt es ja noch und noch was anderes oder?

  • Zitat

    Sollte der dann nicht auch eigentlich oben beim Absenden stehen?


    Du meinst sicherlich die action="" in der Form.
    Die wird ja gar nicht genutzt, denn Du nutzt doch

    JavaScript
    event.preventDefault();


    Also wird das absenden verhindert, damit Du per JS damit arbeiten kannst.

    Zitat

    Jetzt kriege ich auch wieder die Meldung, das der ajax Aufruf erfolgreich war aber die Weiterleitung und die Anzeige, das der Login erfolgreich war kommt immer noch nicht.


    Die weiterleitung per PHP greift ja auch nicht mehr.
    Die musst Du nun per JS anstupsen.


    Zum Verständnis hier mal der Ablauf:
    (erster Seitenaufruf)
    - Server (PHP) übergibt Seite an Browser
    - Nutzer sieht Seite
    - Nutzer klickt auf [SENDEN] in der Form
    - per JS verhinderst Du, dass die Form wirklich abgeschickt wird, damit Du damit arbeiten kannst
    - per JS sendest Du eine Request (Ajax) an den Server (PHP)
    - Server (PHP) führt das aufgerufene PHP-Script aus (Browser wartet geduldig =)
    - über die url hatten wir den Key "ajaxLogin" mitgegeben -> echo json_encode(...) und exit; (PHP ENDE)
    - Browser bekommt Daten (Ajax Antwort)
    - per JS stellst du fest: Nutzer Login === true -> muss Nachricht anzeigen und weiter leiten (ENDE)


    Was kann schief gehen:
    Ajax. :D
    Du hast recht - es gibt in jquery noch die Funktionen, die die Fehler abfangen.
    Aber mit jquery hab ichs nicht so. Steht aber alles im Tut: Tutorial jQuery AJAX

  • Mh, das hätte ich glaube ich ohne deinen Hinweis so nicht mitgekriegt, also verstehe ich das richtig?
    Das mit dem ajaxLogin oben in der URL sieht man dann einfach nicht aber es ist sozusagen dennoch da?


    Das Problem mit dem Login über ajax ist ja jetzt, das ich zwar wieder die Meldung kriege, das der ajax Aufruf erfolgreich war aber irgendwie scheint er in keine der beiden Bedingungen in das if-Statement reinzulaufen. So sieht das ganze ja jetzt bei mir aus:


    Die pass.php sollte dann ja auch eigentlich aufgerufen, wo ja auch ein wenig Design mit drin ist aber es passiert einfach gar nichts. Auch die Meldung mit dem error wird über dem footer nicht ausgegeben. Dadurch hätte ich das ganze doch dann sozusagen "angestupst"? Übrigens hatte ich mich geirrt, es gibt anscheinend doch nur diesen .fail Fehler, keine anderen. Wohl noch sowas wie success, always usw. ;)
    Wenn ich auch mal ein

    JavaScript
    alert(data["login"] + " " + data["error"]);


    einfüge, dann kriege ich die Meldung: undefined undefined.


    Wieso eigentlich das hier:

    JavaScript
    if(data && data["login"] && data["login"] == true)


    data bedeutet ja sowas wie isset, glaube ich? Aber wozu die letzten beiden, also data["login"] && data["login"] == true?
    Sind die beiden nicht äquivalent? data["login"] === data["login"] == true?

  • Mach mal ein
    console.log(data)
    in der success function (am Anfang).
    console.log() ist Benutzerfreundlicher als alert(). Wenn Du zB ein Array dort ausgibst (ich gehe von FF oder Chrome aus), dann stellen die Browser das dort auch komplett dar.
    (Rechtsklick auf die Seite, "element untersuchen", console)


    Per Ajax Login musst Du via Javascript alles machen, was Du sonst per PHP ($smarty->) gemacht hast.
    Soll heißen: $smarty kannst Du in dem Moment vergessen :D



    JavaScript
    if(
    data // einfach art um festzustellen, ob data nicht "undefined" ist (in etwa das gleiche wie in PHP:  if($data){} )
    && data["login"] // das gleiche mit data[ebene "login"], denn wir wissen ja noch nicht, was data ist (typ) und ob eine ebene "login" existiert
    && data["login"] == true // die eigentliche prüfung (würde ja === nutzen, aber weiß nicht ob jquery ein bool rausrückt)
    )
  • Tzz .. als wenn ich IE oder sowas benutze. Das erste was ich mit dem IE mache ist deinstallieren oder alle Links entfernen. :D
    Derzeit benutze ich Firefox und oft (mittlerweile) auch Chrome. ;)
    Das kriege ich, wenn ich console.log(data) mache:


    Code
    "<br /><b>Warning</b>:  include(config.ini.php): failed to open stream: No such file or directory in <b>/var/www/html/projekt/Backend/backend.php</b> on line <b>6</b><br /><br /><b>Warning</b>:  include(): Failed opening 'config.ini.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in <b>/var/www/html/projekt/Backend/backend.php</b> on line <b>6</b><br /><br /><b>Warning</b>:  include(initialisierung.php): failed to open stream: No such file or directory in <b>/var/www/html/projekt/Backend/backend.php</b> on line <b>7</b><br /><br /><b>Warning</b>:  include(): Failed opening 'initialisierung.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in <b>/var/www/html/projekt/Backend/backend.php</b> on line <b>7</b><br /><p style="text-align: center;">Loggen Sie sich bitte ein! Sie sind nicht autorisitert!</p><meta http-equiv="refresh" content="2; url=index.php?site=backend-login">"


    Das Problem ist ja warscheinlich, das er jetzt nicht mehr von der index.php asugeht?


    Hat sich grade erledigt, zumindest mit der Warnung oben. Ich hatte auch vergessen da bei der url

    JavaScript
    url: "Backend/backend.php?ajaxLogin=true"


    anstatt von

    JavaScript
    url: "index.php?site=backend-login&ajaxLogin=true"


    zu schreiben. ;)


    Bei dem console.log(data); erhalte ich jetzt

    Code
    ReferenceError: data is not defined


    War ein Fehler, siehe weiter unten.

  • Ups, da ist mir ein kleiner Fauxpas unterlaufen ...
    Ich habe irgendwie das eine console.log in dem success Teil übersehen und dann noch eins dahin geklatscht. Dies allerdings versehentlich über .ajax und das war dann das Reference Error. :D
    Sorry ....


    Ich habe das ganze jetzt mal wiederholt und jetzt kriege ich das Dokument ausgegeben, also die HTML Struktur etc.
    So sieht das aus aber das Dokument ist schon recht groß, von daher habe ich mal ein bisschen gekürzt.



    Ich habe auch mal ein console.log für data['login"] und data['error"] gemacht, allerdings kriege ich dabei für beide ein undefined ausgegeben.

  • Dann bekommst Du via Ajax die komplette Seite ausgegeben.
    Das sagt mir: Du hast die Seite schon VOR der login.php(?) teilweise ausgegeben,
    oder ein exit() vergessen.


    Du willst ja nur das json_encode( array() ) für den ajax-call returnen.
    Alles was ge-echo-d wird, "bekommt Ajax" als Daten.

  • Also ich sehe da nichts, was ich vergessen hätte. Das hatte ich ja auch schon nachgeguckt aber hier ist mal die ganze login.php


    oder übersehe ich da irgendwas?
    Das einzige, was ich sonst noch habe ist die index.php aber die inkludiert ja auch jeweils nur die Datei:



    Da fällt mir jetzt auch mal so nebenbei gesagt ein, das man da ja auch gut (in der index.php) die includes oben noch machen könnte oder? :D
    Ich habe nämlich jetzt sonst auch in jeder Datei include("initialization.php") stehen.


    Zudem könnte ich da auch meine config laden, allerdings ist es ja warscheinlich nicht so gut, wenn diese auch auf Seiten verfügbar ist, wo diese eh nie gebraucht wird oder macht das nicht unbedingt einen Unterschied?
    Kann man irgendwie evtl. sowas in PHP realisieren? In C# ging sowas hier:


    Code
    switch(value)
    {
    	case 1: case 2: case 3:      	
        	// Do Something
        	break;
    
    	default:
        	// Do Something
        	break;
    }


    Das ich das dann also so schreibe, damit die Settings auch nur da geladen werden, wo Sie auch wirklich gebraucht werden?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!