Rück mal den Code ein. Alles in einer Zeile liest sich nicht gut =)
Beiträge von cottton
-
-
Alles richtig - außer die Anführungsstriche =)
'bilder' -- die einfachen Anführungsstriche sind der Fehler.
Das sind keine Value-Felder, sondern Schlüssel/Keys - daher hier: `
also.
Auch bei allen anderen Keys wie zB fk_user-id ect.
(ALTER TABLE 'bilder' kommt auch 2 mal vor, aber das war sicherlich ein Kopierfehler)Empfehlung: keine Bindestriche im Code nutzen.
Off möchte man einen Key kopieren, um Schreibfehler zu vermeiden.
Bei diesem_key reicht ein Doppelklick zum markieren. Bei diesem-key musst Du mit der Maus rum eiern.Note: durch ON DELETE CASCADE wird beim Löschen der Referenz (also des Users) auch die betreffenden Rows in `bilder` gelöscht.
Wenn das so sein soll - OK.
Um Bilder nicht zu verlieren, könntest Du auch ON DELETE SET NULL wählen.
Ein Fremdschlüsselfeld muss immer ein Gegenstück in der Referenztabelle besitzen,
oder NULL sein (also entweder fk existiert, oder das feld ist null). -
-
Der Unterschied zw. Foreign keys und Fremdschlüssel ist ... die Sprache

Foreign key (in db meist fk abgekürzt) ist englisch für Fremdschlüssel.Wenn Du eine Tabelle normalisieren möchtest, dann kann man Fremdschlüssel (fk) verwenden.
Muss aber nicht. (Ich würde es aber empfehlen)
(BTW: http://www.php-kurs.com/normalisierung.htm)Im Bsp Deiner Tabelle (was ist pic_cat und warum muss es raus/in einer andere Tabelle?)
würdest du eine neue Tabelle anlegen:
Es empfiehlt sich `pic_cat_id` statt `id`.SQL
Alles anzeigenCREATE TABLE `my_new_tbl`( `pic_cat_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', `pic_cat` VARCHAR(30) NOT NULL COMMENT '', PRIMARY KEY (`pic_cat_id`) ) COMMENT '' ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;In Deiner Haupttabelle änderst Du pic_cat in einen Fremdschlüssel:
SQL
Alles anzeigenALTER TABLE `haupttblname` `pic_cat` `pic_cat_id` INT UNSIGNED NOT NULL -- `alter_name` `neuer_name` ... -- fk anlegen ADD CONSTRAINT `fk_pic_cat_id` -- name des fremdschlüssels FOREIGN KEY (`pic_cat_id`) -- fremdschlüssel hier in der tabelle ist pic_cat_id REFERENCES `my_new_tbl` (`pic_cat_id`) -- referenz ist die neue tabelle tabelle (dort liegen die auto increment keys `pic_cat_id`) ON UPDATE CASCADE -- wenn der wert in der neuen tabelle ge-updated wird, dann cascade (übernehmen) ON DELETE CASCADE -- wenn der wert in der neuen tabelle gelöscht wird, dann cascade (übernehmen) -- möglich wäre hier: RESTRICT | CASCADE | SET NULL | NO ACTION -- achtung - on delete cacade löscht die row, nicht nur die column/cell -- einfach mal rumtestenWenn Du nun ein (was auch immer das ist) neues pic_cat einfügen willst,
dann machst Du das in der neuen Nebentabelle (hier im Bsp `my_new_tbl`).
Die bekommt automatisch eine increment id (zb 5).
In der Haupttabelle nutzt Du nun nur noch die `pic_cat_id` aus der Nebentabelle.
Bsp:Code|bildID |pfad |title |pic_cat_id ... +-------+-------+-------+----------- ... |1 |... |... |5 |2 |... |... |5 |3 |... |... |111
Die ersten beiden Rows in der Haupttabelle nutzen beide die `pic_cat_id` 5
welche als fk fungiert
und auf die Row mit der `pic_cat_id` 5 in der neuen Nebentabelle zeigen.Die beiden Tabelle stehen nun direkt in Beziehung miteinander.
Durch update CASCADE stellst Du sicher,
dass das Ändern der `pic_cat_id` der neuen Tabelle
auf die Haupttabelle übernommen wird.Info: das alles geht auch ohne fk. Musst Du die beiden Tabellen "überwachen".
Für weiteres/genaueres fragen oder: http://dev.mysql.com/doc/refman/5.7…reign-keys.html
-
Stimmt. Ganz vergessen - der Salt ist ja immer neu

-
Ersten Post bearbeitet: siehe "EDIT: 05.06.2016"
-
Du musst Dir nur sicher sein, dass das Script dort liegt, wo es nicht "überschrieben" wird.
Auch das geänderte Template, in dem Du das PHP-Script einbaust.
Sonst könnte es sein, dass nach einem WP-update Deine Änderungen "weg" sind.In den meisten Frameworks gibts dafür einen Bereich, in den Du Deine Scripte ablegst.
Und templates werden überschrieben -per config zB. Soll heißen Du gibst an, dass Du Dein Template Y anstelle von Template X verwenden möchtest.
Dein Template Y liegt dann auch in dem oben genannten Bereich, um nicht durch ein WP-Update überschrieben zu werden.Kenne WP auch nicht. Aber such mal nach "wordpress template überschreiben" o.ä.
-
Ja, dann gibt es keine $_POST -Daten.
soll heißen, dass Du keine Daten für die jeweiligen Formularfelder bekommst.Warum/Fehlerfindung:
Als erstes hab ich nach "name" in Deiner Form gesucht.
Dabei sehe ich, dass das input-Feld keinen name="" -Tag besitzt.
Auch alle anderen input-Felder (außer die Checkbox glaub ich) besitzen keinen Namen.Ohne Name gibts keine Daten
Die musst Du also noch ergänzen. Dann bekommst Du auch Daten.
Bitte informiere Dich zum Thema Sicherheit bei Kontaktformularen.
-
-
Man kann es in eine Zeile schreiben, muss man aber nicht

Du verwendest $reihe['Vorname'], obwohl es wohl nicht gesetzt war:
PHP
Alles anzeigen<?php $reihe['Vorname'] = empty($_POST['st_bn_vorname']) ? $reihe['Vorname'] // hier fehler -- $reihe['Vorname'] ist hier wohl nicht gesetzt : $_POST['st_bn_vorname']; $reihe['Name'] = empty($_POST['st_bn_name']) ? $reihe['Name'] // gleiche wie oben : $_POST['st_bn_name'];Wenn Du $reihe['Vorname'] Hier das erstemal definieren willst, dann eher so:
PHP
Alles anzeigen$reihe['Vorname'] = (isset($_POST['st_bn_vorname']) and !empty($_POST['st_bn_vorname'])) // wenn es gesetzt ist ? $_POST['st_bn_vorname']) // dann : ''; // sonst // meiner meinung nach übersichtlicher $reihe['Vorname'] = isset($_POST['st_bn_vorname']) ? trim($_POST['st_bn_vorname'])) : ''; if(!strlen($reihe['Vorname'])){ // kein empty, denn 0 zählt als empty // hier was sonst passieren soll } -
-
Gibt wohl doch das checked Attribute: http://www.w3schools.com/jsref/dom_obj_radio.asp
Dann sollte das hier funktionieren (ungetested)Oder
HTML<!-- dein html code --> <script type="text/javascript"> if(document.getElementById('postpublic').checked) { // document.getElementById('bildinfo').submit(); das geht so glaub ich net document.getElementById('postpublic').form.submit() // ungetested }else if(document.getElementById('notpublic').checked) { // document.getElementById('bildinfo').submit(); document.getElementById('bildinfo'').form.submit() // ungetested } </script>Weiß allerdings nicht, was Du mit "dem einen Radio-Element" meinst :x
-
Ich glaube es gibt kein radio.checked.
Was Du wohl brauchst ist element.onchangeOder (finde ich pers. sinnvoller)
Hier ein Bsp: http://stackoverflow.com/a/18564258/3411766 -
Die $_SESSION könnte/wird nach einem Browser neustart weg sein.(gewollt oder ungewollt)
Man könnte Cookies verwenden, um die Dateien später wieder zu finden.
Oder noch besser in die db. Der User hat sicherlich ein Profil. -
Du musst es Dir ja auch genauer ansehen, und nicht einfach reinkopieren.
-
Du gibst $p nicht aus der Funktion zurück.
Und den zurückgegebenen Wert $r setzt Du ausserhalb der Func nicht, sondern nutzt den Wert direkt um die Seite einzubinden:Eine Möglickeit wäre:
PHP
Alles anzeigenfunction pageFilenames() { // Funktion für die switch - case funktion $p = !empty($_GET["page"]) ? trim($_GET["page"]) : 'home'; // hol dir den gesuchten link switch($p) { case "home": // Fall home -> $r = 'home.php'; // rufe inhalt von home.php ab break; // breche funktion ab // ... default: $r = 'error404.php'; } return array($p, $r); } list($p, $r) = pageFilenames(); include $r;
Oder per Ref:PHP
Alles anzeigenfunction pageFilenames(&r, &$p) { // Funktion für die switch - case funktion $p = !empty($_GET["page"]) ? trim($_GET["page"]) : 'home'; // hol dir den gesuchten link switch($p) { case "home": // Fall home -> $r = 'home.php'; // rufe inhalt von home.php ab break; // breche funktion ab // ... default: $r = 'error404.php'; } return; } $r = $p = ''; pageFilenames($r, $p); include $r;
Oder aber auch: -
Zusätzlicher Hinweis:
Wenn das Formular öffentlich zugänglich ist, dann den Input prüfen/begrenzen/...PHP
Alles anzeigen<?php $kapital = (float)$_POST["kapital"]; // sicherlich float erwartet $zinssatz = (float)$_POST["zsatz"]; // sicherlich float erwartet $durchlauefe = (int)$_POST["durchlauefe"]; // sicherlich ganzzahl erwartet und nicht negativ // siehe http://php.net/manual/de/function.abs.php $durchlauefe = abs($durchlauefe); $maxDurchlaeufe = 100; // durchläufe begrenzen um den den server nicht lahmlegen zu lassen if($durchlauefe > $maxDurchlaeufe){ echo 'Error: maximal ' . $maxDurchlaeufe . ' Durchlauefe!'; exit(0); // oder du setzt hier $durchlaeufe auf max $durchlauefe = $maxDurchlaeufe; } for ($i = 1; $i <= $durchlauefe; $i++) { $kapital = $kapital * $zinssatz / 100 + $kapital; // hier fehlte das $ (aus kapital wird $kapital) echo $kapital . "br"; } -
Du hast irgendwo eine Query mit "eingegebener Username" als Feldnamen abgeschickt.
Den Teil des Codes hast Du wohl aber nicht hier gepostet.Such mal im Code nach "eingegebener Username" -- irgendwo muss das ja in eienr SQL-Anweisung stehen (oder in einer Variable die dann in einer Query genutzt wird).
-
Fehler beim Fehler abfangen
PHP$query = "SELECT id FROM users WHERE username = $username"; $userid = $pdo->query($query); if (!$userid) { // wenn userid "NICHT" ist (als hier im Bsp false) echo "\nPDOStatement::errorInfo():\n"; // falsch =) print_r($userid->errorInfo()); print_r($pdo->errorInfo()); // $pdo ist das obeject, das "etwas tun sollte". $pdo->query funktionierte nicht, daher fragen wir $pdo, was denn schief gelaufen ist } -
Fehler abfangen. (Siehe meinem Post weiter oben)
Hat denn die inset-Query funktioniert?
Die ->query hat jedenfalls nicht funktioniert -
siehe: http://php.net/manual/de/pdo.query.php "PDO::query() returns a PDOStatement object, or FALSE on failure."
Also ->query returnt false, wenn ein Fehler aufgetreten ist.
... deshalb - Fehler abfangen ... immer
Tipp: http://php.net/manual/de/pdo.lastinsertid.php
PHP$aktivierungscode = random_string(); $statement = $pdo->prepare("INSERT INTO users (username, email, passwort, aktivierungscode) VALUES (:username, :email, :passwort, :aktivierungscode)"); // error abfangen $result = $statement->execute(array('username' => $username, 'email' => $email, 'passwort' => $passwort_hash, 'aktivierungscode' => $aktivierungscode)); // error abfangen $userid = $pdo->lastInsertId();
Du musst aber keine user id anhängen - wie schon gesagt - ein guter Aktivierungscode (db Feld UNIQUE) tut es auch.
Nur ein Hinweis. Wenn Du das so machen willst, dann werde ich Dich nicht davon abhalten
(ist also nicht falsch)BTW: was wird für den Login genutzt? Username oder Email? Oder ist beides möglich?
Ich frage, weil diese(s) Feld(er) dann UNIQUE sein sollten.Wenn also Username und Passwort -Login:
Wenn Username order Email und Passwort -Login: