Formular wird falsch abgesendet

Hallöle,
ich knoble nun schon seid ich glaub 1-2 Monaten zusammen mit jemand anderem daran warum ein gewisses Formular nicht dort landet wo es landen soll (um ehrlich zu sein: Niemand weiß wo es landet, denn es landet nirgendwo…).

Bei dem Formular handelt sich um das Kommetar-Formular einer News/Blog Seite das pardu nicht funktionieren will. Da weder der Programmierer der PDO noch ich rausfinden können woran es liegt frage ich hier mal nach (da ja auch in der Vergangenheit hier oftmals jemand wusste!).

Ich werde hier mal nur den Teil des Scriptes einfügen und zwar der des Formulares, die PDO sowie ein 3. Teil der zum Prüfen da war was das Formular da absendet :susp: danach kommt ein Pastebin Link mit der Kompletten Datei.

echo('<h4 id="s1">Kommentar schreiben</h4>'."\n"); echo('<form action="?p=blog&amp;mode=view&amp;id='.$blog->id.'&amp;action=commentcheck" method="post" id="commentform">'."\n"); echo('<label for=form-name>Name (erforderlich)</label><br />'."\n"); echo('<input name=form-name id=name type=text required>'."\n"); echo('<label for=form-email><br />Email (erfordlich)</label><br />'."\n"); echo('<input name=form-email id=email type=email required>'."\n"); echo('<label for=form-url><br />Homepage</label><br />'."\n"); echo('<input name=form-url id=url type=url>'."\n"); echo('<label for=form-comment><br />Dein Kommentar</label><br />'."\n"); echo('<textarea name=form-comment id=comment required></textarea>'."\n"); echo('<input class="button" type="submit" value="Kommentar eintragen" tabindex="5" />'."\n"); echo('</form>'."\n"); }else if(isset($_GET['action']) == 'commentpost'){ $sql = "insert into blog_kommentare (blog_id, display, datum, name, email, homepage, naricht) values (:id, 'NO', ". NOW() .", :name, :email, :url, :text)"; $array = array(":id"=>$_GET['id'],":name"=>$_POST['name'],":text"=>$_POST['text'],":email"=>$_POST['email'],":url"=>$_POST['url']); $db_con = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); $pre = $db_con->prepare($sql,array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $res = $pre->execute($array); $row = $pre->fetchAll(); }else if(isset($_GET['action']) == 'commentcheck'){ echo('<p>'.$_POST['blog_id'].'</p>'."\n"); echo('<p>'.$_POST['name'].'</p>'."\n"); echo('<p>'.$_POST['email'].'</p>'."\n"); echo('<p>'.$_POST['homepage'].'</p>'."\n"); echo('<p>'.$_POST['naricht'].'</p>'."\n");

Kompletter Code auf Pastebin:
pastebin.com/ebQbBaUM

Vielen Dank schonmal an jegliche Tipps :slight_smile:! (Ich will hier keine komplett Lösung sondern nur eine Hilfe dabei was da faul ist damit es nicht geht).

auf den allerersten blick, ohne mir was angesehen zu haben: bist du sicher, dass du richtig abfragst?
$_POST[] schonmal per vardamp ausgegeben?

ich habe nämlich den verdacht, dass du nach zb “email” suchst, das ding aber unter “form-email” angekommen ist…
die labelzuordnung ist falsch - for muss sich auf eine id, nicht einen name beziehen.

es würde sicherlich auch nichts schaden, das ganze hübsch mit foo=“bar” zu schreiben - anführungszeichen. required=“required”… ich weiß dass das nich bei allen html-varianten unbedingt erforderlich ist, es sollte aber mit sicherheit auch kein schaden sein :wink:

gruß
emil

Jo, wenn da “form-email” als Name steht, sollte man auch “form-email” verwenden.
Außerdem solltet ihr ein bisschen sauberer Arbeiten um mögliche Fehler von vornherein zu vermeiden, wie emil schon sagte, nutzt für Attribute Anführungsstriche etc.pp.

Anzuprangern habe ich dann evt noch den unübersichtlichen Programmierstil.
Dutzendfache echo Anweisung fördern nicht unbedingt die Übersichtlichkeit, und wenn es nicht übersichtlich ist, macht man leicht Fehler, die schwer zu erkennen sind.
Aber gut, das ist eure Angelegenheit.

Nun das es noch so unübersichtlich ist das ist wahr. Derzeit auch noch viel am Aufräumen und erstmal alles programmieren :susp: .
Das ich bei einigen Attributen keine Anführungsstriche verwende liegt einfach daran das ich dabei nach dem Schema vorging wie es in dem Buch über HTML5 wo ich habe auch gemacht wurde.

Das das alles in echo drin steht kommt ja daher das das ganze in if Verpackt in einer Datei abläuft.

Die Abfragen hab ich jetzt mal überarbeitet, aber fakt ist das immernoch nichts ankommt :stress: .
Eher frage ich mich ob es denn auch machbar ist was ich/wir da vorhaben das das ganze Formular ja an eine andere Stelle der Seite weitergeleitet wird und dann wieder zum Beitrag zurück (zurück tuts noch garnicht… das kommt jetzt erst wenn das endlich abgesendet wird).

Weil derzeit zeigt er mir nach Absenden einfach nur das Formular an:
antribute.eu/?p=blog&mode=view&i … mmentcheck

Ist ja nicht sinn der Sache ôO.
Ich werd jetzt aber mal auf alle Fälle überprüfen ob überall auch das richtige Abgefragt wird.

Dann guck mal, was isset() zurück gibt.
Das:

... }else if(isset($_GET['action']) == 'commentpost'){ ... }else if(isset($_GET['action']) == 'commentcheck'){
wird also nie zutreffen.

[quote=“hummer”]Dann guck mal, was isset() zurück gibt.
Das:

... }else if(isset($_GET['action']) == 'commentpost'){ ... }else if(isset($_GET['action']) == 'commentcheck'){
wird also nie zutreffen.[/quote]

Nun und wie würdest du den Überprüfen was für die Variable “action” eine Wert hat? Weil auch ohne isset() kommt das gleiche dabei raus

error_reporting(E_ALL); ini_set('display_errors', 1);an den Anfang des Skripts.

  1. Prüfen, ob die Variable existiert
    UND
  2. Prüfen, welchen Wert sie hat.

Grund für die isset()'s war folgender nun wieder Angezeigter Fehler:

[code]Notice: Undefined index: action in /var/www/vhosts/antribute.eu/httpdocs/content/pages/blog.php on line 53

Notice: Undefined index: action in /var/www/vhosts/antribute.eu/httpdocs/content/pages/blog.php on line 60[/code]

Das ist ja auch richtig.
Lies meine Antwort darüber nochmal.

[quote]1. Prüfen, ob die Variable existiert
UND
2. Prüfen, welchen Wert sie hat.[/quote]

Ich vermute mal, die meisten server und browser werden das netterweise interpretieren.
Formal ist es aber wohl undefiniert, GET und POST gleichzeitig zu verwenden, denn entweder
man schickt das Formular per GET oder per POST los, beides zusammen geht nicht.
Man sollte also an die URI innerhalb von action sicher keine GET-Parameter anhängen, denn
solche würden ja vom Formular selbst kommen.
Im Grunde fälschen die angehängten GET-Parameter bei der URI eine Formularübertragung,
was natürlich keinen Sinn ergibt, wenn man wirklich ein Formular losschickt und schon gar nicht,
wenn man es per POST losschickt.
Da deuten sich also (X)HTML-Verständnisprobleme an, die man allerdings häufiger sehen kann,
weswegen ich mal davon ausgehe, daß einige Programme solche Autorenfehler irgendwie
zu kompensieren suchen, was aber nichts daran ändert, daß es ein Fehler ist und daß die
Kompensation nicht immer die gleiche sein muß oder überhaupt durchgeführt wird.

Ich würde einfach mal empfehlen, alles aufzuräumen und das erstmal alles im Formular
unterzubringen und dies dann testweise per GET loszuschicken.
Man kann dann anhand der URI direkt sehen, was der browser wirklich ausliefert und kann
dann recht einfach vergleichen, was der server über PHP interpretiert.

Falls ich dasrichtig verstanden habe…
Du vergibst bei action="…" den Parameter mode=view. So wird die Abfrage aber wohl nie den elseif-Teil erreichen, da mode=view immer zutrifft, wenn das Formular abgeschickt wird.

[code]if( (isset($_GET[‚mode‘])) AND ($_GET[‚mode‘] == ‚view‘) ) {

}else if(isset($_GET[‚action‘]) == ‚commentpost‘){ //einfach mal kopiert, gehört natürlich dementsprechend ausgebessert

}else if(…){

}
[/code]

PS: Also da schreib ja ich noch übersichtlicheren Code, und das heißt was :nutz:

@hoffman: Wie sollte man dann bei einer dynamischen Seite am besten vorgehen, auf der man praktisch immer Parameter and die url dranhängt?

@Mgier: Nein der Parameter mode=view wird da nicht vergeben.
Dieses “mode” ist dazu da um zu bestimmen ob er nun alle Einträge (Übersicht) oder nur den einzelnen Beitrag anzeigen soll (mode=view).

In der URL sieht das dann also so aus:

index.php?p=blog&mode=view&id=12

So als Beispiel bei “action” übergibt das formular ja dann folgende URI:

index.php?p=blog&mode=view&id=12&action=commentpost

Und bei commentpost sollte er dann eigentlich folgendes ausführen:

}else if(isset($_GET['action']) AND 'commentpost' == $_GET['action']) { $sql = "insert into blog_kommentare (blog_id, display, datum, name, email, homepage, naricht) values (:id, 'NO', ". NOW() .", :name, :email, :url, :text)"; $array = array(":id"=>$_GET['id'],":name"=>$_POST['form-name'],":text"=>$_POST['form-comment'],":email"=>$_POST['form-email'],":url"=>$_POST['form-url']); $db_con = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass); $pre = $db_con->prepare($sql,array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $res = $pre->execute($array); $row = $pre->fetchAll();

Nur derzeit grübel ich darüber was mit folgendem Fehler gemeint ist:
Notice: Trying to get property of non-object in /var/www/vhosts/antribute.eu/httpdocs/content/pages/blog.php on line 42

Was eindeutig auf folgende Zeile zurück führt:

Das wäre dann genau mein Szenario für

index.php?p=blog&mode=view&id=12&action=commentpost

[quote]if( (isset($_GET[‘mode’])) AND ($_GET[‘mode’] == ‘view’) ) { trifft zu

}else if(isset($_GET[‘action’]) && $_GET[‘action’] == ‘commentpost’){ hinfällig

}else if(…){ hinfällig

}[/quote]

Du meinst also sobald mode == view erfüllt ist wird der Rest einfach ignoriert?

Das ist prinzipiell der Sinn von if-else, ja :slight_smile:

php.net/manual/de/control-structures.elseif.php

Du müsstest dann einzelne If’s machen, wie, ich glaube hummer wars, auch schon angedeutet hat. Oder eine If-Else Switches besser strukturieren.

Mfg :wink2:

Ok hab das jetzt in eigene if() rein… nun kommt nach dem Absenden:
Fatal error: Call to undefined function NOW() in /var/www/vhosts/antribute.eu/httpdocs/content/pages/blog.php on line 110

//EDIT:
Total vergessen: Kommt weiterhin nix an in Datenbank.

Hier mal 2 Links 1x der Blog (bzw. News) wo ich es derzeit Teste und eine andere Datei die einfach nur den Datenbank inhalt ausgibt offtopic: meine Lightning ist umgefallen…:

Blog (Beitrag direkt als einzelansicht): antribute.eu/?p=blog&mode=view&id=14
DB-Check: antribute.eu/?p=komcheck

Ui jetzt kommen erst die ganzen Fehler zum Vorschein. NOW ist keine PHP-Funktion, die gehört zu MySQL.

Mfg :wink2:

[quote=„Mgier“]Ui jetzt kommen erst die ganzen Fehler zum Vorschein. NOW ist keine PHP-Funktion, die gehört zu MySQL.

Mfg :wink2:[/quote]

Ach und wo sollte ich MySQL anweißen das er dort NOW() ausführen soll :slight_smile:?

lass die Verkettungsoperatoren weg.

INSERT INTO tbl (datum, bla, blubb) VALUES (NOW(), 'bla', 'blubb')

Also liebevoll das wieder nutzen was ich selbst schon dachte und nix mit PDO? :astonished:

//UPDATE:
Hab mal standard INSERT INTO verwendet.
Nun kommt beim Absenden dieser Fehler nicht mehr :susp: .

if(isset($_GET['action']) AND 'commentpost' == $_GET['action']) { mysql_query("insert into blog_kommentare (blog_id, display, datum, name, email, homepage, naricht) values (". $_GET['id'] .", 'NO', NOW(), ". $_POST['form-name'] .", ". $_POST['form-email'] .", ". $_POST['form-url'] .", ". $_POST['form-comment'] .")"); }