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

    Code
    `bilder` statt 'bilder'

    .
    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).

    Dann macht das auch Sinn =)

    Fremdschlüssel wie oben beschrieben.
    JOIN nutzt man, um eine oder mehrere Tabellen in die Query einzubinden.
    Kann man also nicht vergleichen.

    Bsp:

    SQL
    SELECT ...
    FROM `main_table` AS `main`
    JOIN `pic_cat_tbl` AS `cat` ON (`main`.`pic_cat_id` = `cat`.`pic_cat_id`)
    WHERE


    oder

    SQL
    SELECT ...
    FROM `main_table` AS `main`
    LEFT JOIN `pic_cat_tbl` AS `cat` USING (`pic_cat_id`)
    WHERE
        `main`.`sometihng` = 'someting'
        AND `cat`.`pic_cat_something` = 'seomthing'

    Der Unterschied zw. Foreign keys und Fremdschlüssel ist ... die Sprache :D
    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:

    Code
    |pic_cat_id |pic_cat
    +-----------+---------------
    |1	|...
    |2	|...


    Es empfiehlt sich `pic_cat_id` statt `id`.

    In Deiner Haupttabelle änderst Du pic_cat in einen Fremdschlüssel:

    Wenn 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

    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:

    Wenn Du $reihe['Vorname'] Hier das erstemal definieren willst, dann eher so:

    Gibt wohl doch das checked Attribute: http://www.w3schools.com/jsref/dom_obj_radio.asp
    Dann sollte das hier funktionieren (ungetested)

    HTML
    <input type="radio" ... onChecked='this.form.submit();' ...>

    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

    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:

    PHP
    include pageFilenames();

    Eine Möglickeit wäre:


    Oder per Ref:


    Oder aber auch:

    Zusätzlicher Hinweis:
    Wenn das Formular öffentlich zugänglich ist, dann den Input prüfen/begrenzen/...

    Fehler beim Fehler abfangen :D

    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:

    SQL
    UNIQUE INDEX `idx_mein_index_name` (`username` ASC)


    Wenn Username order Email und Passwort -Login:

    SQL
    UNIQUE INDEX `idx_mein_index_name` (`username` ASC, `email` ASC) -- die combi username und email darf nur einmal vorkommen