hm, da muss jemand für jquery noch mal ran -- ich müsste selbst googlen =)
wolf ?!
Beiträge von cottton
-
-
Nein, wieso. Wenn &page nicht reinkommt, dann will/soll Nutzer doch sicherlich auf die Seite 1 von guestbook.
Ja, hab da nicht aufgepasst und das and ... in isset() geschrieben
ZitatDas gibt doch einen Fehler, wenn da kein int steht?
oO? Wo steht kein int?Ja, das ist PDO. Ich komme manchmal durcheinander wer waqs hatte und nutze ... =)
mysqli_ ist ja "auch PDO" -- genauer: mysqli_ baut auf der von PHP vordefinierten Klasse PDO:: auf
(...und verwirrt nur unnötig mMn mit vielen vielen Funktionen und ... egal - nicht das Thema hier
)ZitatIst es nicht sonst auch eigentlich eher unnötig?
Naja ... wenn Du mich fragst: nein
Sobald Du den Code updaten willst, und dort auf einmal einen Platzhalter brauchst, dann schreibst Du wieder alles um.
Aber - wie immer - Ansichtssache.Zitatbrauche ich denn auch noch ein or die()
Nein, das die() wird doch meistens nur in Beispielen verwendet.
Allerdings wird echo '' . $e; nicht funktionieren.
Wenn Du eine Exception (in diesem Fall eine Erweiterte Exception mit dem Namen "PDOException") fängst,
dann hast Du ein Object.
Du kannst ja zB mal beim Login der db mit Absicht ein Fehler einbauen (zB falsche pw) und dann fängst Du die Exception (PDOException)
und gibst sie mit var_dump($e) aus. Dann siehst Du, was da drin steckt.
Siehe auch: http://php.net/manual/de/class.pdoexception.php
So bekommst Du zB die Fehlermeldung:PHP{ ... } catch(PDOException $e) { echo $e->getMessage(); // $e ist ein objekt der klasse "PDOException" und wir rufen dessen methode ->getMessage() auf } getMessage->prepare() wirft (im Normalfall) keine Exception.
Aber:PHP
Alles anzeigen// prepare error if( !( $stmt=$dbh->prepare($query) ) // gleich mal als bsp wie man zuweisungen in ifs nutzen kann ){ // achtung: wenn ->prepare() fehlschlägt, dann ist $stmt false, // ES SEI DENN man ändert das error handling (siehe http://php.net/manual/de/pdo.error-handling.php) // um im normalfall den aufgetretenen fehler (code oder meldung) zu bekommen, // müssen wir and das objekt $dbh (oder wie auch immer die var genannt wurde) var_dump( $dbh->errorInfo() ); // http://php.net/manual/de/pdo.errorinfo.php } // execute error if( !$stmt->execute() ){ // hier nutzen wir das objekt $stmt var_dump( $stmt->errorInfo() ); // http://php.net/manual/de/pdostatement.errorinfo.php } -
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
JavaScriptif( 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) ) -
Zitat
wieso willst du die expressions aus ner DB holen oO
ich auch gedenkt =)
Schreib das Object (also die expr) via PHP in die Seite beim Seitenaufruf.
=) -
Zu Link: ja.
Zu else if:
oO?PHP$site = isset($_GET["page"]and (int)$_GET["page"] > 0) ? (int)$_GET["page"] : 1; // mysql_real_escape_string lass ich absichtlich weg =)
Ich glaube das wolltest Du erreichen - dass site nicht kleiner als 1 sein kann?Zu PDO
Mir fällt gerade ein - ich glaub Du hattest mysqli_... genutzt.
Dann wird das anders gehandhabt.
bsp mysqli_PHP// http://php.net/manual/de/mysqli-stmt.bind-param.php $stmt = $mysqli->prepare("SELECT ... LIMIT ?,?"); // mysqli_ kann nur mit "?"-platzhaltern umgehen $stmt->bind_param('ii', $start, $entrysAPage); // "ii" gibt an, dass 2 integer an stelle der platzhalter eingefügt werden // info: jedes zeichen zählt für den jeweiligen platzhalter. // bsp: $stmt->bind_param('isd', $integer, $string, $double_which_if_also_float);
bsp PDO::PHP
Alles anzeigen$stmt = $dbh->prepare("SELECT ... LIMIT :start, :entriesAPage"); $stmt->bindParam(':start', $start, PDO::PARAM_INT); $stmt->bindParam(':entriesAPage', $entrysAPage, PDO::PARAM_INT); // info: // mögliche typen: //PDO::PARAM_STR //PDO::PARAM_BOOL //PDO::PARAM_NULL //PDO::PARAM_INT // btw - PDO::PARAM_FLOAT gibt es nicht. dafür wandelt man die float value in einen string und nutzt PDO::PARAM_STR $stmt->bindParam($key, (string)$val, PDO::PARAM_STR);
Es geht hier als nicht um den Typ, den die Variable hat, sondern darum,
als was für ein Typ der Wert der Variable an die Stelle des Platzhalters geschrieben wird.Wenn Du nun mysqli_ nutzt, dann sollte man egtl "i" fpr integer nutzen, wenn man eine Ganzzahl zuweisen will.
(Man muss, wenn man LIMIT mit Platzhaltern nutzt)Zu dem Schreibweisen:
japp, es gibt (gerade in PHP) viele Varianten - viele Schreibweisen. Jeder macht es anders.Zu fetchAll:
ich würde anstatt ->query ->prepare und Platzhalter nutzen =)
http://php.net/manual/de/mysqli.prepare.php
(
musst nicht. aber ich find es "richtiger", wenn man
a) immer die gleiche Art nutzt (also prepare/execute)
b) wenn gnadenlos alle Werte per Platzhalter in Queries gesteckt werden
)
Aber auf jeden Fall die Fehler abfangen.
Beim connecten können Fehler auftreten,
beim preparen, und beim executen.
(kommt natürlich auf die Variante an - also mysqli_ oder PDO::)HTML/CSS ist dann in der Tat nicht mein Ding.
Ich kenne es, mag es aber nicht
-
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
Also wird das absenden verhindert, damit Du per JS damit arbeiten kannst.ZitatJetzt 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.
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 -
Zitat
Einen link zur ersten Seite des GB's muss man doch nicht unbedingt mitschicken? Ich habe ja auch schließlich das am Anfang stehen:
...
von daher ist das doch sonst nicht unbedingt nötig oder liege ich da jetzt falsch?
Versteh ich nicht , also verstehe dir Frage nicht
Wegen negativ Wert: ja, Du ziehst ja glaub ich ab ( - einträgeProSeite), da kann das bei Seite 1 passieren.
ZitatGibt es eigentlich bei der Kurzschreibweise ein else / else if, sodasss man das oben in den Teil einfügen kann?
Versteh ich auch nicht ganz
meinst Du:PHP$var = ($wenn <= 0) ? $dann : $sonst /* und hier noch ein else if ? */; // else if gibts in der schreibweise nicht, aber man kann (einigen wird das evtl nicht gefallen =) $var = ($wenn <= 0) ? $dann : ( ($wenn > 0) ? $dies : $das );
Ich nenne das die traurigen
Zu PDO:
auf jeden Fall BindParam nutzen. (int) muss nicht, da über bindParam(, PDO::PARAM_INT) ein integer an die Stelle des Platzhalters "gesetzt" wird.Zitat von http://php.net/manual/de/pdo.constants.phpPDO::PARAM_INT (integer)
Stellt den Datentyp SQL INTEGER dar.
Auch deswegen bindParam, weil über die "normale" Art und Weise (also ohne bindPara) ein String an die Stelle gepackt wird.
Dann käme sowas raus:
... was ja invalid ist.
Behalt Dir einfach immer im Hinterkopf: ohne bind wird ein String an die Stelle geschrieben.Zu goto:
Ich dachte Du kennst das evtl.
Das war ein Bug bei Apple, bei dem:Codeif ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) // hier keine klammern genutzt, also NUR die nächste anweisung zählt goto fail; // <--- das hier sollte so sein (springt zu einem punkt der den namen fail bekam) goto fail; // <--- copy/paste fehler oder shortcut fail für "dupliziere zeile" ? -- jedenfalls wird das hier ausgeführt
Mit klammern hätten beide in den Klammern gestanden -- nix wäre passiert.Codeif ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0){ goto fail; goto fail; } // würde man zB durch copy/paste die Klammer "wegkopieren, dann gäbe es einen fehler beim compilieren/ausführen (fatal error) // klammern ^= mehr sicherheitZum letzten Bsp:
Nich teinfach weglassen.
Ich versuchs mal zu erklären:PHP
Alles anzeigen// normal: if(isset($_GET['page'])){ $site = 'guestbook&page=' . $_GET['page']; } // wenn du nur das if weg nimmst, dann bekommst du einen fatal error (isset($_GET['page'])){ // <-- denn die klammern sind ja noch vorhanden =) $site = 'guestbook&page=' . $_GET['page']; } // wenn du aber als bsp schreibst: true; // dann dann trifft hier eine bedingung zu: true ist wahr. // anderes bsp: true and meineFunction(); // ^= wahr and meineFuncton(); // noch ein anderes bsp: $a = 0; $a === 1 or ++$a; $a === 1 and $a++; $a > 0 and $a = 0; // schöner sieht es mMn aber aus: $a = 0; ($a === 1) or (++$a); ($a === 1) and ($a++); ($a > 0) and ($a=0); // viele nutzen sowas in configs oder bestimmen nachgeladenen seiten: defined('CONSTANT_SOUNDSO') or die('kein zugriff ....'); // oder empty($_SERVER['SHELL']) and die('shells only');ZitatWie könnte man es eigentlich erreichen, das nur die nächsten 10 Seiten von der aktuellen ausgehend angezeigt werden?
Du meinst wenn es 100000 Seiten wären, dass nicht alle über dir Nav angezeigt werden?
Also
[ANFANG][1][2]...[10001][10002][ENDE]
Das bekomme ich heute nicht mehr hin
-
Da wird kein key "guestbook" in der url sein, wenn der switch dort nicht reinspringt.
siehe:PHP$page = $i + 1; if($site == $page) // If user is on that page, print no link { echo " $page "; } else // If user is not on that page, create link { echo " <a href="?page=$page">$page</a> "; }
beim letzen echo sollte sowas rauskommen:Zitat
{host}?page=2
probier mal das hier:PHP$page = $i + 1; if($site == $page) // If user is on that page, print no link { echo " $page "; } else // If user is not on that page, create link { echo " <a href="?site=guestbook&page=$page">$page</a> "; // beachte das & zeichen }
natürlich auch überall, wo du einen link anbietest der zum GB führen soll.Hinweis:
Du nutzt PDO, schreibst dann aber doch wieder $vars in die Query.
Auch wenn Du mysql_realy_esc ....() nutzt.
Irgendwann - bei nem update o.ä. - schleicht sich ein Schusselfehler ein und in die Query wird eine unmaskierte $var geschrieben.
Lösung:
- nutze Platzhalter, wie es die PDO - Prepared Statements vorsieht,
- im Fall LIMIT nur Ganzzahlen zulassen: "SELECT .... LIMIT " . (int)$start . ", " . $entrysAPage . ";"
Selbst verständlich ersteres empfohlen =)Noch ein Hinweis:
falls Du doch mal $vars in die Query schreiben musst (dynamsch tablenames - können ja nicht mit Platzhaltern genutzt werden),
dann die maskierung (mysql_real_esc..., (int), oder was auch immer) direkt in oder über der Query.
Andere und du selbst brauchen dann nicht in anderen Files/Zeilen suchen, um zu erfahren ob die $var bereits behandelt wurde.EDIT:
Hinweis 3
"Kann man machen, muss man aber nicht".
Nicht Klammern nutzen ist nicht cooler als Klammern nutzen. Aber Klammern nutzen ist sicherer.
Letztes Populäres Bsp war "apple goto bug"Code// code 1ster google treffer: http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
EDIT: Du kannst bei kuzen Sachen natürlich auch das hier nutzen:
Ich lasse dabei die Klammern () um die Bedingungen und Zuweisungen, um es "Blockweise" zu erkennen.
Auch das $site='guestbook' ohne Leerzeichen soll deutlich machen, dass hier kein Vergleich, sondern eine gewollte Zuweisung passiert.
Das hier würde auch funktionieren: -
Du hast ganz schön viel verschlimmbessert.

Alles nochmal zurück.
Nutze am besten den zusätzlichen Key via GET:
Den Rest wie vorher, also vor Deinem letzen Post.Zum PHP:
Zitatwird 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()
Rest per Kommentare:PHP
Alles anzeigenif(isset($_POST["Login"])) { if(isset($_POST["User"]) and isset($_POST["Password"]) and strlen($_POST["User"]) > 0/*>= 3*/ and strlen($_POST["Password"]) > 0/*>= 4*/){ $user = $_POST["User"]; $password = md5($_POST["Password"]); $query = $dbz->prepare("SELECT * FROM Backend WHERE Benutzername = :user AND Passwort = :password LIMIT 1"); $query->bindParam(':user', $user); $query->bindParam(':password', $password); try { $query->execute() or die(); $result = $query->fetch(); $dbz = null; } catch(PDOException $e) { $dbz = null; if(isset($_GET['ajaxLogin'])) { echo json_encode(array('login' => false, 'error' => 'Ein Fehler ist aufgetreten!' . $e)); exit; } echo '<p>Ein Fehler ist aufgetreten!</p>' . $e; /* HIER FEHLTE das exit =) */ exit; } if(isset($result) and !empty($result) and is_array($result)) /* immer noch schwammig - hier prüfst du nur, ob "irgendwas" aus der db kommt =)*/ { $_SESSION["eingeloggt"] = $user; if(isset($_GET['ajaxLogin'])) { // login kam über ajax echo json_encode(array('login' => true, 'error' => '')); exit; } $smarty->display('pass.php'); /* ?? keine weiterleitung mehr? kein exit ? */ } else { if(isset($_GET['ajaxLogin'])) { echo json_encode(array('login' => false, 'error' => 'Der Benutzername oder das Passwort ist oder sind falsch!')); exit; } echo '<p style="text-align: center; color: red">Der Benutzername oder das Passwort ist oder sind falsch!</p>'; header("Refresh:3; url=index.php?site=backend-login"); exit; } } else { if(isset($_GET['ajaxLogin'])) { echo json_encode(array('login' => false, 'error' => 'Bitte fuellen Sie beide Felder aus')); exit; } echo '<br /><font color="red"> Bitte fuellen Sie beide Felder aus!</font><br />'; header ("Refresh:3; url=index.php?site=backend-login"); exit; } } -
Die db-Änderungen sind nur Vorschläge.
Was Du da im Screenshot zeigst ist das, was auch erwartet wurde:
PHP legt die Daten als json String ab, und die JS Funktion wandelt diesen bei Aufruf um.
Wie gesagt - das soll erstmal nur als "Schnittstelle" dienen.Zitat// hier kann man später per ajax die daten live holen
Später kannst Du dort drin per ajax die Daten einzeln laden.Das ist natürlich keine Copy-Paste-Code, den Du direkt nutzen kannst. Du musst es schon anpassen.
Hier gint es mehr um den Ablauf. =) -
Dann musst Du mischen.
PHP
Alles anzeigen... if( isset($result) and is_array($result) and isset($result['bsp_userid']) and ... ... ){ $_SESSION["eingeloggt"] = $user; // btw - das funktioniert auch bei nem ajax call -- die session wird also gesetzt worden sein if(isset($_POST['ajax_login_key_oder_wie_du_diesen_key_auch_nennst'])){ // login kam über ajax echo json_encode( array( 'login' => true, 'error' => '' ) ); exit; } // wir sind noch nicht "raus", also war das kein ajax call echo '<p style="text-align: center; color: green>Die Eingaben waren richtig!<br />Sie werden jetzt zum Backend weitergeleitet! ...</p>'; header("Refresh:3; url=backend.php"); exit; } ...
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
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 )PHP
Alles anzeigen$username_minlen = 4; $username_maxlen = 24; // prüfen beim registrieren: if(!isset($username)){ // error - kein name übergeben } if(strlen($username) < $username_minlen){ // error - name zu kurz } if(strlen($username) >= $username_maxlen){ // error - name zu lang } if(preg_match("/^[a-zA-Z0-9]+$/", $username) !== 1){ // nützlich: http://php.net/manual/de/function.preg-match.php#105924 // (preg_match gibt int 1 bei erfolg zurück, daher !== 1) // error - name hat falsches format } // prüfen beim login: if(!isset($username)){ // error - kein name übergeben } if(strlen($username) < 1){ // error - name leer } /* wird geben dem "angreifer" keinen hinweis, daher fällt das hier weg if(strlen($username) < $username_minlen){ // error - name zu kurz } if(strlen($username) >= $username_maxlen){ // error - name zu lang } if(preg_match("/^[a-zA-Z0-9]+$/", $username) !== 1){ // error - name hat falsches format }*/ -
BLOB ist binary.
Was auch immer nun da drin steck, wird sicherlich so reingeschickt worden sein:
Beim Auslesen kann man zB CONVERT nutzen (~aus binary wird ein string):
Der String, den Du nun rausbekommst, wird sicherlich encoded sein (json_encode, serialize, ... ?)
also musst Du das rückgängig machen (json_decode, unserialize, ... ?). -
Naja, der Ajax-Aufruf war erfolgreich.
Das Problem ist der Ablauf im PHP-Script.PHP
Alles anzeigen// ... if(!empty($result)) { $_SESSION["eingeloggt"] = $user; // btw - das funktioniert auch bei nem ajax call -- die session wird also gesetzt worden sein // jetzt gibst du ENTWEDER dem browser etwas zur ausgabe, ODER dem ajax call echo '<p style="text-align: center; color: green>Die Eingaben waren richtig!<br />Sie werden jetzt zum Backend weitergeleitet! ...</p>'; header("Location: backend.php"); exit; } else { // jetzt gibst du ENTWEDER dem browser etwas zur ausgabe, ODER dem ajax call echo '<p style="text-align: center; color: red">Der Benutzername oder das Passwort ist oder sind falsch.</p>'; header("Refresh:3; url=login.php"); exit; } // ...
Mögliche Lösung (falls das PHP-Script NUR für diesen call via ajax genutzt wird)
(btw: paar Änderungen/Vorschläge eingefügt)PHP
Alles anzeigen// script to handle ajax login call /* returns (echo -- also ausgabe damit man per ajax etwas lesen kann) json_encode( array( 'login' => (bool), 'error' => (string) (if empty ^= no error) ) ) */ if(isset($_POST["Login"])) // Login ist der Button zum Abschicken { /* hier war isset($_POST["User"]) doppelt gemoppelt - sollte bestimmt isset($_POST["Password"]) sein =) */ if( // Textfelder für die Eingaben isset($_POST["User"]) and isset($_POST["Password"]) and strlen($_POST["User"]) > 0 and strlen($_POST["Password"]) > 0 // evtl gleich die min länge prüfen ){ $user = $_POST["User"]; $password = md5($_POST["Password"]); // nicht nur NICHT empfohlen, sondern böse =) // sicheres hashen von passwörtern: http://www.html-seminar.de/html-css-php-forum/board40-themenbereiche/board18-php/4384-loginpasswort-richtig-hashen-password-hash-password-verify/ // SELECT * ist ... mist $query = $dbz->prepare(" SELECT bsp_userid, bsp_username, bsp_usergroup FROM Backend -- großschreibung wird ignoriert, wenn nicht zB utf8_bin genutzt wird -- info: alle die mit _ci enden (utf9_general_ci zB) beachten keine großschreibung -- (ci ^= case insensitiv) WHERE Benutzername = :user AND Passwort = :password LIMIT 1 -- wird ja nur einer erwartet =) ; "); $query->bindParam(':user', $user); $query->bindParam(':password', $password); try { $query->execute() or die(); $result = $query->fetch(); $dbz = null; } catch(PDOException $e) { $dbz = null; // ajax muss mitbekommen, das hier etwas falsch lief echo json_encode( array( 'login' => false, 'error' => 'Ein Fehler ist aufgetreten!' ) ); exit; } // if(!empty($result)) <-- zu schwammig - hier gehts um einen login, also sollte man genau prüfen if( isset($result) and is_array($result) and isset($result['bsp_userid']) and ... /* was sollte/kann man hier prüfen: - wenn zB userid verwendet/geladen wird, dann wird die sicherlich immer numeric und > 0 sein - ... stell dir einfach vor, irgendwann änderst du oder jemand andereys weiter oben den code dann sollte hier unter jeder erdenkliche "mist" geprüft werden, damit erst gar keine schusselfehler passieren können */ ){ $_SESSION["eingeloggt"] = $user; // btw - das funktioniert auch bei nem ajax call -- die session wird also gesetzt worden sein echo json_encode( array( 'login' => true, 'error' => '' ) ); exit; } else { echo json_encode( array( 'login' => false, 'error' => '' ) ); exit; } } else { echo json_encode( array( 'login' => false, 'error' => 'Bitte fuellen Sie beide Felder aus!' ) ); exit; } }
in der jquery func success prüfst Du nunJavaScript... 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 -
Du hast da paar Fehler in den Queries.
In dem Create Statement heiße es h_titel oder s_titel,
in den Queries schreibst Du dann aber title.
Oder auch web_hersteller.id -- gibts nicht. web_hersteller.h_id gibts =)Hier mal ein "Concept":
HTML
Alles anzeigen<?php $data_hersteller = ... $mysqli->prepare(" SELECT h_id, h_titel, h_titelURL, h_status, FROM web_hersteller -- WHERE h_status = ? evtl per status greifen? "); $data_serien = ... $mysqli->prepare(" SELECT s_id, s_hID, s_titel, s_titelUrl, s_status FROM web_serien JOIN web_hersteller ON web_hersteller.h_id = web_serien.s_hID -- WHERE ?_status = ? evtl per status greifen? "); ?> <html> ... ... <head> ... ... <script> function getHerstellerBy_h_id(h_id){ // momentan ungenutzt // hier kann man später per ajax die daten live holen // vorerst nur per definiertem array var hersteller = JSON.parse(<?php echo json_encode($data_hersteller); ?>); if(typeof h_id === "undefined"){ // wir wollen alle return hersteller; } // wir wollen einen bestimmte return (typeof hersteller[h_id] !== "undefined") ? hersteller[h_id] : false; } function getSerienBy_h_id(h_id){ // hier kann man später per ajax die daten live holen // vorerst nur per definiertem array var serien = JSON.parse(<?php echo json_encode($data_serien); ?>); if(typeof h_id === "undefined"){ // wir wollen alle return serien; } // wir wollen alle serien die zu h_id gehören var ret = []; for(var s_id in serien){ if(serien[s_id]["s_hID"] !== h_id){ // ist keine serie mit der gesuchten h_id continue; // fahre fort / überspringe } ret[s_id] = serien[s_id]; } return ret; } function updateSecodSelectfield(){ // this sollte das selectfield sein // this.value sollte die value der gewählten <option> sein if(!this.value){ // nichts ausgewählt return null; } var // die gewählte h_id h_id = this.value, // hole alle serien serien = getSerienBy_h_id(h_id), // "greife" das 2te select feld SelectSerien = document.getElementById("serien"), // temp object Option_tmp; // evtl zuvor gesetzte <option> felder aus dem 2ten select feld löschen SelectSerien.innerHTML = ""; // für jede serie in serien for(var s_id in serien()){ // erstelle <option> feld Option_tmp = document.createElement("option"); // setze option feld value Option_tmp.value = s_id; // setze option feld text Option_tmp.appendChild( document.createTextNode( s_id["s_titel"] ) ); // hänge das neue <option> feld an das 2te select feld an SelectSerien.appendChild( Option_tmp ); } return; } document.onreadystatechange = function(){ if(document.readyState == "complete"){ // fall du per $_POST['hersteller'] das erste selectfeld beim laden setzen willst, // dann führen wir hier das update des 2ten selectfeldes einmal aus, damit das auf dem aktuellen stand ist updateSecodSelectfield(); } } </script> </head> <body> <select name="hersteller" id="hersteller" onchange="updateSecodSelectfield()"> <option>-- Bitte wählen --</option> <?php foreach($data_hersteller as $h_id => $hersteller){ $selected = (isset($_POST['hersteller'])and (int)$_POST['hersteller'] === $h_id) ? 'selected' : ''; ?> <option value="<?php echo htmlspecialchars($h_id); ?>" <?php echo $selected ?> ><!-- <option tag schließen --> <?php echo htmlspecialchars($hersteller['h_titel']);?> </option> <?php } // /foreach ?> </select> <select name="serien" id="serien"></select> </body> </html>Empfehlung:
Backup vor irgendwelchen Änderungen:
(achtung! könnte lange dauern, wenn die maschiene lahmt und "viele" datensätze kopiert werden müssten =)SQLcreate table `web_hersteller_kopie` like `web_hersteller`; insert into `web_hersteller_kopie` select * from `web_hersteller`; create table `web_serien_kopie` like `web_serien`; insert into `web_serien_kopie` select * from `web_serien`;
tabelle hersteller ändern:SQLALTER TABLE `web_hersteller` CHANGE COLUMN `h_id` `h_id` -- `name alt` `name neu` - bleibt also gleich INT(11) UNSIGNED -- ganze zahl ohne vorzeichen (siehe google "mysql int types") NOT NULL AUTO_INCREMENT, -- lass die db die id hochzählen ADD PRIMARY KEY (`h_id`); -- h_id wird primary keytabelle serien ändern:
SQL
Alles anzeigenALTER TABLE `web_serien` CHANGE COLUMN `s_id` `s_id` -- `name alt` `name neu` - bleibt also gleich INT(11) UNSIGNED -- ganze zahl ohne vorzeichen (siehe google "mysql int types") NOT NULL AUTO_INCREMENT, -- lass die db die id hochzählen CHANGE COLUMN `s_hID` `s_hID` INT(11) -- geändert auf int statt varchar, da die h_id im tbl hersteller ja auch int ist =) UNSIGNED -- ganze zahl ohne vorzeichen (siehe google "mysql int types") NOT NULL, ADD PRIMARY KEY (`s_id`), -- s_id wird primary key -- foreign key (fremdschlüssel) verwenden -- ^= eine beziehung zw den beiden tbl herstellen -- dafür brauchen wir einen index auf s_hID ADD INDEX `fk_web_hersteller_h_id` (`s_hID` ASC); -- den fremdschlüssel erstellen ALTER TABLE `web_serien` ADD CONSTRAINT `fk_web_hersteller_h_id` -- fremdschlüssel name FOREIGN KEY (`s_hID`) -- fremdschlüssel (in etwa "das hier ist der fremde schlüssel" :) REFERENCES `web_hersteller` (`h_id`) -- die referenz (in etwa "der fremdschlüssel zeigt auf ...") ON UPDATE CASCADE -- wenn sich die h_id in hersteller ändert, dann übernimm diesen wert (wichtig um beziehung zu erhalten) ON DELETE RESTRICT; -- wenn in hersteller der datensatz mit der h_id x gelöscht wird, die h_id in tbl serien aber genutzt wird -> löschen verweigen (wichtig um beziehung zu erhalten) -
Alle in ein Array packetn und mit einer for() Schleife durchaufen:
EDIT: update http://jsfiddle.net/absjd4rx/20/ -
Guck mal hier: Tutorial jQuery AJAX
JavaScript
Alles anzeigenfunction shellscript() { document.getElementById("zeichen").className ='fa fa-spinner fa-spin'; var result = "default"; $.ajax({ url : action, type : method, data : data }).done(function (data) { // Bei Erfolg document.getElementById("ergebnis").innerHTML=result; document.getElementById("zeichen").className =''; }).fail(function() { // Bei Fehler alert("Fehler!"); }).always(function() { // Immer alert("Beendet!"); }); } -
Zum Trennen von PHP und HTML:
naja, wenn Du im HTML - OHNE PHP nutzen zu wollen - eine Abfrage brauchst, ob eine Session o.ä. gesetzt ist,
dann kommst Du um ein CMS (eigenes oder anderes ...) nicht herum.
Dabei wird ja anhand von PseudoCode - was eigtl nur bestimmte Platzhalter/Keywords darstellt - der Inhalt dort hin replaced/gesetzt/ersetzt.Zum Weitergeben:
SESSIONs (Seite muss min einmal abgefeuert werden um in PHP die SESSIONs zu setzen, ODER per ajax an PHP-Script senden),
Dateien (ähnlich wie bei SESSIONs),
LocalStorage (js),
(Web)Socket (Aufwand/Nutzen sollte passen) -
Die Fragen zu smarty kann ich dir nicht beantworten. Evtl kennt das Framework jemand hier, oder Du fragst in deren Forum.
Zwecks Augabe von PHP in HTML: http://www.php-kurs.com/php-und-html-mischen.htm
Zur Frage "Wie kann man eigentlich eine große Menge an Daten von einer PHP Datei zur anderen übergeben?"
Da musst Du genauer werden. -
Jap, google anal meckert:
ZitatRedundante Hostnamen
Die Property {id} erhält Daten von redundant Hostnamen.
Filter anpassen | Erneut prüfen | Ignorieren | Details
wird aber erfolgreich zu-ignoriert
-
href=""
Du hast keine Ziele (Links) angegeben.