WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   [PHP] Formular versenden UND in Datenbank eintragen? (http://www.wcm.at/forum/showthread.php?t=222379)

Chrisi99 01.09.2007 20:41

[PHP] Formular versenden UND in Datenbank eintragen?
 
Hallo Leute,

leider wieder ein Fall von "ich bin zu dumm" ;)


Kann ich Daten aus einem Formular gleichzeitig senden und in eine Datenbank schreiben?

ich bekomme beides nacheinander ja hin, aber gleichzeitig geht es nicht ;)

Also sowohl das Versenden von Emails (formmailer) als auch das Schreiben in eine Datenbank geht, nur leider nicht gleichzeitig... was tun?

hier noch der Hintergrund:

es sollen sich Leute anmelden können (zu einem Kurs) mit folgenden Schritten:

S1->S2->S3

S1: Eingabe der Daten in ein
Code:

<form action="s2.php" method="post">
dann per Submitbutton auf die zweite Seite, wo die Formulareinträge begutachtet werden können:
Code:

<?php
echo $_POST["Kursort"];
?>

usw für alle Einträge.

beim Klick auf "Senden" würde ich jetzt gerne die Daten an mich senden und in die Datenbank eintragen...

Hilfe ist willkommen :-)

Grüße
Christoph

Chrisi99 01.09.2007 21:25

vielleicht check ich auch die Syntax nicht richtig... hier meine SQL Query

Code:

<?php
                //Datenbank Einstellung und Query String
                $db = mysql_connect("localhost","USER","Passwort");
                mysql_select_db("datenbank",$db);
$datum=("m, d, Y");
        $sql = "INSERT INTO tabelle('FName', 'FAdresse', 'FMail','Datum') Values({$_POST['FName']}, {$_POST['FAdresse']}, {$_POST['FMail']},$datum)";
        mysql_query($sql);
       

                mysql_close($db);
                ?>

das Formular wird per <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post"> selbst aufgerufen, ich glaube, das passt?


:confused:

reemrev 01.09.2007 21:31

Soweit ich das verstanden habe:
Auf S2 soll man vor dem Absenden seine Daten überprüfen können?
Mach ein neues Formular (Stichwort:<input type="hidden"...), wo du die eingegebenen Daten versteckst und mit "Senden" an S3 weiterleitest.
Auf S3 werden die Daten wie bei einem normalen Formular ausgelesen, die Mail gesendet und danach in die DB eingtragen. Gleichzeitig im Wortsinn geht nicht.
siehe:http://de.selfhtml.org/html/formulare/versteckte.htm

ps: $datum=date("m, d, Y");
die DBTabelle scheint nicht wirklich gut zu sein, vermisse zB. einen brauchbaren Index

Chrisi99 01.09.2007 21:39

also ich brauch die drei Schritte nicht unbedingt. Wenns auf einem geht bin ich glücklich ;)

das Emailen geht auch problemlos, nur in die Datenbank wird nichts eingetragen.

Ich habe aber DB, Table und User/Passwort 100 Mal überprüft (aus leidiger Erfahrung).

wo ist der Haken bei der Query, oder kann ich nicht senden und Datenbankschreiben einfach hintereinander in eigenen <?php ?> Tags... ich kanns ja mal in eines packen ;)

der Index der Tabelle ist auto_increment, aber brauche ich den in der query?

danke wegen dem date();!

zAPPEL 01.09.2007 22:18

Du könntest mal schaun ob deine SQL-Abfrage einen Fehler wirft:
PHP-Code:

$result mysql_query($query);
if (!
$result) {
    die(
'Ungültige Abfrage: ' mysql_error());


Prinzipiell ist es kein Problem in einem PHP-File erst Daten in eine Datenbank zu schreiben und dann ein e-Mail zu verschicken.

Ahja.. ein String mit "Test $variable" da schreibt er die Variable in den String, mit Arrays ("Test $_POST['Variable']") funktioniert das soweit ich weiß nicht - da wird auch dein Fehler sein.

lg

Chrisi99 01.09.2007 22:24

Zitat:

Original geschrieben von zAPPEL
Du könntest mal schaun ob deine SQL-Abfrage einen Fehler wirft:
PHP-Code:

$result mysql_query($query);
if (!
$result) {
    die(
'Ungültige Abfrage: ' mysql_error());


Prinzipiell ist es kein Problem in einem PHP-File erst Daten in eine Datenbank zu schreiben und dann ein e-Mail zu verschicken.

Ahja.. ein String mit "Test $variable" da schreibt er die Variable in den String, mit Arrays ("Test $_POST['Variable']") funktioniert das soweit ich weiß nicht - da wird auch dein Fehler sein.

lg

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''FName','FAdresse','FMail','Datum') Values(, , , 09, 01, 2007)'

also 100 Punkte für dich :D

wie übergebe ich ihm denn die Variablen in die Query?

zAPPEL 01.09.2007 22:31

Also entweder du machst folgendes:

$name = $_POST["name"]
und dann so wie du es gemacht hast, oder du hängst die Strings 'zusammen', mit "."
PHP-Code:

"Insert Into Tabelle (spalte1) VALUES('".$_POST["name"]."')"

also mit " den String abschließen und mit . kannst du weitere Strings oder Variablen anhängen.

Möglichkeit 1 wäre vorzuziehen, und dabei kann man auch gleich die Eingaben aus dem Forumular überprüfen.

lg zaPPEL

Chrisi99 01.09.2007 23:08



danke schon mal für die Hilfe, das Einfügen haut jetzt hin, leider sind die Variablen immer leer...?
Code:

$name = $_POST["FName"];
$adresse = $_POST["FAdresse"];
$email = $_POST["FMail"];
$datum=date("m.d.Y");

das sind meine Beispielvariablen, leider kommt in der Datenbank nur das Datum an (ergo findet er bei den anderen den Wert nicht).

im Formular heißen die Felder aber so:


Code:

<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
       
        <div class="form-css"><dl>
        <dd> <input type="hidden" name="Kursort"
           
            <dl><div class=header> Persönliche Daten </div><div class=group>
                <dt>Name und Vorname :</dt>
                <dd><input type="text" name="FName" /></dd>
               
                <dt>Ihre Adresse:</dt>
                <dd><input type="text" name="FAdresse" /></dd>
                  <dt>Ihre E-Mail:</dt>
                <dd><input type="text" name="FMail" /></dd></div><input type="submit" value="Senden" class="btn"/>
      </form>

sry für die Formatierung!

zAPPEL 01.09.2007 23:20

Müsste so eigentlich funktionieren, ich sehe den Fehler zumindest auf die Schnelle nicht.. mach mal
print_r($_REQUEST); bzw. print_r($_POST) (da zeigt er dir das komplette Server-Request bzw. Post-Array an)

btw. sieht die HTML-Datei wirklich so aus und der Tag schließt nicht:
<dd> <input type="hidden" name="Kursort" ? Mach den mal zu.. außerdem ist das ein ziemlicher HTMl-Müll - sorry ;) Tu bitte mal alle <DL> <DD> <DT> und <DIVS> raus.. mach einfach nur ein <form> mit <inputs> und teste das ganze nochmal

lg

Chrisi99 01.09.2007 23:34

schas ;)

seltsam ist, dass die Variablen nicht übernommen werden, dafür wird jeder Datumseintrag doppelt in der Datenbank angelegt...

und ich habe mir gedacht, dass das sicher einfach geht *g*

also der Mailversand funktioniert perfekt und zuverlässig.

vielleicht hängts irgendwo zwischen Mail() und der Datenbank....

Code:

if($_POST)
{
 $strMailtext = "";

 while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
  foreach($value as $value_array)
  {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";
  }
  }
  else
  {
  $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }
 
 mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
 
  or die("Die Mail konnte nicht versendet werden. Bitte überprüfen Sie Ihre Eingabe!");
 header("Location: $strReturnhtml");
 exit;
}

aber das ist eh ganz einfach, weil das hab ich mir gestern zusammengesucht....

danke für deine Hilfe, dadurch bin ich schon weiter gekommen! :-)

Chrisi99 02.09.2007 09:07

okeeee, nachdem ich schlecht geschlafen habe hab ich mich gleich in der Früh zusammengerissen und etwas herumgebastelt.

Jetzt bekomme ich immerhin 2 der 4 Variablen in die Datenbank (very strange though...)?

Code:

if (isset($_POST['FName']) && isset($_POST['FAdresse']) && isset($_POST['FMail'])) {
    // Connect

    $link = mysql_connect('localhost', 'user', 'pass');
   
    $select = mysql_select_db('tabelle', $link);

    if(!is_resource($link)) {

        echo "Failed to connect to the server";

    } elseif(!$select) {
       
        echo "Failed to select database";

    } else {
     
        // Reverse magic_quotes_gpc/magic_quotes_sybase effects on those vars if ON.

        if(get_magic_quotes_gpc()) {
            if(ini_get('magic_quotes_sybase')) {
                $name        = str_replace("''", "'", $_POST['FName']);
                $adresse = str_replace("''", "'", $_POST['FAdresse']);
                                $mail = str_replace("''", "'", $_POST['FMail']);
                               
            } else {
                $name        = stripslashes($_POST['FName']);
                $adresse = stripslashes($_POST['FAdresse']);
                                $mail = stripslashes($_POST['FMail']);
                               
            }
        } else {
            $name        = $_POST['FName'];
            $adresse = $_POST['FAdresse'];
                        $email = $_POST['FMail'];
        }
                        $datum=date("d.m.y")
        // Make a safe query
        $query = sprintf("INSERT INTO target (FName, FAdresse, FMail, Datum) VALUES ('%s', '%s', '%s', %d)",
                    mysql_real_escape_string($name, $link),
                    mysql_real_escape_string($adresse, $link),
                    mysql_real_escape_string($email, $link),
                                        mysql_real_escape_string($datum, $link));

        mysql_query($query, $link);
               
                $result = mysql_query($sql);
if (!$result) {
    die('Ungültige Abfrage: ' . mysql_error()); }

        if (mysql_affected_rows($link) > 0) {
            echo "Eintrag erfolgt\n";
        }
    }
} else {
    echo "Bitte kontrolliere deine Einträge\n";
}}
?>

Antwort:
Code:

Ungültige Abfrage: Query was empty
dabei schreibt er "Name" und "Adresse" in die Datenbank, nur Mail und Datum nicht...

falls mir da noch jemand helfen kann bin ich überglücklich :-)

T.dot 02.09.2007 10:08

Hallo,

E-Mail geht vermutlich aus folgendem Grund nicht:
Beim Basteln des sql-Statements verwendest du $email, vorher gibt es aber eine Variable $mail und $email, vermutlich sollten die alle $email heißen.

also die beiden Zeilen ändern:
$mail = str_replace("''", "'", $_POST['FMail']);
$mail = stripslashes($_POST['FMail']);

Das Datum musst du afaik auch unter Hochkomma setzen und als String uebergeben, dh.
$query = sprintf("INSERT INTO target (FName, FAdresse, FMail, Datum) VALUES ('%s', '%s', '%s', '%s')", ......

mfg Thomas

Chrisi99 02.09.2007 10:17

sry, das habe ich schon ausgebessert, mein Fehler, aber er schreibt trotzdem nur 2 Einträge...

Code:

if(get_magic_quotes_gpc()) {
            if(ini_get('magic_quotes_sybase')) {
                $name        = str_replace("''", "'", $_POST['FName']);
                $adresse = str_replace("''", "'", $_POST['FAdresse']);
                                $email = str_replace("''", "'", $_POST['FMail']);
                               
            } else {
                $name        = stripslashes($_POST['FName']);
                $adresse = stripslashes($_POST['FAdresse']);
                                $email = stripslashes($_POST['FMail']);
                               
            }
        } else {
            $name        = $_POST['FName'];
            $adresse = $_POST['FAdresse'];
                        $email = $_POST['FMail'];
        }
                        $datum=date("d.m.y")
        // Make a safe query
        $query = sprintf("INSERT INTO target (FName, FAdresse, FMail, Datum) VALUES ('%s', '%s', '%s', '%s')",
                    mysql_real_escape_string($name, $link),
                    mysql_real_escape_string($adresse, $link),
                    mysql_real_escape_string($email, $link),
                                        mysql_real_escape_string($datum, $link));

In der Datenbank habe ich jetzt alle mal auf vchar gestellt, also da kanns eigentlich nicht liegen...

T.dot 02.09.2007 10:25

Lass dir mal $query ausgeben (echo $query; ), dann weißt du zumindest, was er in die DB eintrage will. Du kannst ja statt dem Formularparametern einfach mal:
INSERT INTO target (FName, FAdresse, FMail, Datum) VALUES ('a','b','c','d')
probieren, dann weißt du obs an der Datenbank liegt.

der Fehler "Ungültige Abfrage: Query was empty" liegt daran:
mysql_query($query, $link);
$result = mysql_query($sql);

$sql gibts nicht, daher die Meldung. müsste so aussehen:
$result = mysql_query($query, $link);

Chrisi99 02.09.2007 10:49

abcd funktioniert problemlos... also kriegt er scheinbar fie Variablen FEmail und Datum nicht...

Code:

if(get_magic_quotes_gpc()) {
            if(ini_get('magic_quotes_sybase')) {
                $name = str_replace("''", "'", $_POST['FName']);
                $adresse = str_replace("''", "'", $_POST['FAdresse']);
                                $email = str_replace("''", "'", $_POST['FMail']);
                               
            } else {
                $name = stripslashes($_POST['FName']);
                $adresse = stripslashes($_POST['FAdresse']);
                                $email = stripslashes($_POST['FMail']);
                               
            }

ist scheinbar schuld, denn ohne funktioniert es!

aber ich hätte das gerne wegen den Injection-Probleme...

danke für die Hilfe bis jetzt! Alleine verzweifle ich ;)

void 02.09.2007 12:40

mein tipp:
so lästig es sein mag, geh das script schritt für schritt durch und mache vor und nach einer änderung eine ausgabe z.b. mittels dump_var(); - damit siehst du genau, wo der fehler liegt... wenn du also eh schon vermutest, dass der fehler bei dem "injection"-teil liegt, mache genau dort deine ausgaben. somit lässt sich jeder fehler finden ;)

iG0r 02.09.2007 12:56

mysql_real_escape_string gegen mysql_escape_string tauschen, sind ja keine binary datas.

Aber irgendwie schaut mir das alles viel komplizierter aus, als es sein müsste :-) Glaub das Formular müsste mal entwirrt werden.

Wenn du mehrere Schritte machen willst, kannst du die Daten in Cookies, Session oder mit jedem Punkt als Variable im Post mit neu übergeben, einfach als input type="hidden" anlegen. Ich würde aber generell schon zur Sicherheit keine global Var wie $_POST direkt in ein sql-query schreiben.

reemrev 02.09.2007 14:34

Ist das nicht alles zu kompliziert?
Verstehe außerdem nicht ganz die stripslashes, ich meine, gehts nicht auch ohne die vielen ifs?:

$name = mysql_escape_string(striptags($_POST['FName']));
...
...

und danach die 'gesäuberten' Variablen in die DB.

Chrisi99 02.09.2007 14:59

Zitat:

Original geschrieben von iG0r
mysql_real_escape_string gegen mysql_escape_string tauschen, sind ja keine binary datas.

Aber irgendwie schaut mir das alles viel komplizierter aus, als es sein müsste :-) Glaub das Formular müsste mal entwirrt werden.

Wenn du mehrere Schritte machen willst, kannst du die Daten in Cookies, Session oder mit jedem Punkt als Variable im Post mit neu übergeben, einfach als input type="hidden" anlegen. Ich würde aber generell schon zur Sicherheit keine global Var wie $_POST direkt in ein sql-query schreiben.

danke euch! Jetzt geht es.

Beschäftige mich ja nur sporadisch mit PHP, daher auch wenig Plan *g* Den Code hab ich aus meinem Buch zusammengesucht, seltsam, dass die _real_ verwendet haben, in einem fast gleichen Beispiel.

Jetzt läufts und ich bin glücklich *g*

Thx!

Chrisi99 02.09.2007 15:12

ah ganz übersehen :)

werde versuchen, ob das auch einfacher geht!

danke für den Tipp!

Lg
Christoph

reemrev 02.09.2007 15:37

Ups, denke, mysql_escape_string sollte man im Query verwenden.


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag