2016-05-14 4 views
-2

ich PHP bin mit Daten zu E-Mail, die unten über ein HTML-Kontakt-Formular mit dem Code eingegeben wird:Fügen Sie mySQL DB Wert in PHP E-Mail-Formular Körper

HTML

<form action="<?php echo $_SERVER[PHP_SELF]; ?>" method="post" name="form" id="form"> 
    <input type="text" id="name" name="name"/> 
    <input type="text" id="email" name="email"/> 
    <input name="submit" type="submit" title="Submit" value="Submit"/> 
</form> 

PHP

<?php 
    require 'connect.php'; 
    $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 
    $query = "SELECT * FROM `items` WHERE `item_id`='" . $id . "'"; 
    $result = mysql_query($query); 
    while ($fetch = mysql_fetch_assoc($result)) { 
     $item_id = $fetch['item_id']; 
     $item_name = $fetch['item_name']; 
    } 
    if (isset($_POST['submit'])) { 
     $to = "[email protected]"; 
     $name = $_REQUEST['name']; 
     $email = $_REQUEST['email']; 
     $item_name = $_REQUEST['item_name']; 
     $subject = "New Message"; 
     $body = "Name: $name \n\n Email Address: $email \n\n Item Name: $item_name \n\n"; 
     $sent = mail($to, $subject, $body); 
     echo 'Sent'; 
     die; 
    } 
?> 

Die E-Mail wird korrekt gesendet und enthält die in die Eingabefelder 'Name' und 'E-Mail' eingegebenen Werte, aber die Variable $ item_name ist leer? Die einzige Möglichkeit, es zum Laufen zu bringen, besteht darin, die Variable $ item_name in ein verstecktes Eingabefeld zurückzuspähen und dieses dann in die E-Mail $ body einzufügen. Gibt es einen leichteren Weg?

<input type="hidden" id="item_name" name="item_name" value="<?php echo $item_name; ?>"/> 

EDIT:

ich entfernt haben:

$item_name = $_REQUEST['item_name']; 

innerhalb der if-Anweisung, aber die $ item_name Variable noch nichts angezeigt wird, wenn die E-Mail über PHP gesendet wird?

+4

'mysql_ *' Funktionen sind veraltet seit PHP 5.5 und entfernt in PHP 7, verwenden Sie 'mysqli_ *' Funktionen oder PDO statt – Panda

+0

Versuchen Sie var_dump ($ item_name) zu verwenden, wenn Daten zurückgeben – Fil

+0

var_dump ($ item_name) zeigt die korrekter Wert –

Antwort

0

Schließen - Sie starrt es direkt an. Beachten Sie, dass Sie für den Request-Parameter statt Ihrer abgerufenen Parameter fragen - versuchen Sie dies:

Ich schlug zunächst vor, ohne die Gesamtstruktur für die Bäume zu sehen (es beseitigt ein redundantes und Fehler (XSS INJECTION!) Problem, aber immer noch fehlschlägt:

<?php 
require 'connect.php'; 
$id = $_GET['id']; 
$id = mysql_real_escape_string($id); 
$query = "SELECT * FROM `items` WHERE `item_id`='" . $id . "'"; 
$result = mysql_query($query); 
while($fetch = mysql_fetch_assoc($result)){ 
    //these variables only exist in this scope 
    $item_id = $fetch['item_id']; 
    $item_name = $fetch['item_name']; 
    //assuming you've found what you're looking for, terminate the loop, conditionally 
    if ($item_id != null && $item_name != null) 
    { 
    break; 
    } 

} 
if(isset($_POST['submit'])) 
{ 
    $to="[email protected]"; 
    $name=$_REQUEST['name']; 
    $email=$_REQUEST['email']; 
    //$item_name=$_REQUEST['item_name']; 
    $subject="New Message"; 
    $body="Name: $name \n\n Email Address: $email \n\n Item Name: $item_name \n\n"; 
    $sent=mail($to, $subject, $body); 
    echo 'Sent'; die; 
} 

der Hauptgrund für Ihre Probleme sind Scoping, stattdessen versuchen, dies zu tun:

<?php 
require 'connect.php'; 
$id = $_GET['id']; 
$id = mysql_real_escape_string($id); 
$query = "SELECT * FROM `items` WHERE `item_id`='" . $id . "'"; 
$result = mysql_query($query); 
// placeholder variables in the scope you are interested in! 
$item_id = null; 
$item_name = null; 
while($fetch = mysql_fetch_assoc($result)){ 
    // now these reference a different (parent) scope 
    $item_id = $fetch['item_id']; 
    $item_name = $fetch['item_name']; 
    //assuming you've found what you're looking for, terminate the loop, conditionally 
    if ($item_id != null && $item_name != null) 
    { 
    break; 
    } 

} 
if(isset($_POST['submit'])) 
{ 
    $to="[email protected]"; 
    $name=$_REQUEST['name']; 
    $email=$_REQUEST['email']; 
    //$item_name=$_REQUEST['item_name']; 
    $subject="New Message"; 
    $body="Name: $name \n\n Email Address: $email \n\n Item Name: $item_name \n\n"; 
    $sent=mail($to, $subject, $body); 
    echo 'Sent'; die; 
} 

im Grunde, was geschah das $item_[id|name] ist nur innerhalb Ihrer while-Schleife existiert, wenn Sie gefragt. sie woanders und sie w Vorhanden? Ich habe keine Antwort dafür, weil das in dieser Frage nicht verfügbar ist.

TL: DR ~ Ihre $item_[id|name] Variablen, bei denen innerhalb jeder Iteration der while-Schleife scoped zu, für dieses Beispiel

eine höhere variable etablieren, und es wird Bezug genommen werden und der Wert festgelegt.

auch - Sie wurden ursprünglich Umschreiben den $item_name Variable in der if-Anweisung

EDIT # 3 Milliarden: Die Dokumentation ist ein wenig trocken (wie in: Stereo-Installationsanleitung), sondern als jemand, der mit über entwickelt hat 20 verschiedene Sprachen für 15 Jahre --- lernen, Unit Tests zu lieben

phpunit ist eine ziemlich anständige Suite. Es gibt ein Handbuch und eine Lernkurve, aber es macht Sie zu einem besseren Programmierer (wenn das Ihr Ziel ist - ich möchte nicht herablassend klingen - viel Zeit programmieren die Leute, um eine bestimmte Anforderung zu erfüllen und ihr Firmenkapital zu sparen - Kein Schaden, kein Foul!)

Komponententests machen mich jeden Tag besser.

https://phpunit.de/

+0

Ich habe die $ item_name = $ _ REQUEST ['item_name']; aber die Variable $ item_name in der E-Mail $ body wird immer noch nicht in der gesendeten E-Mail angezeigt? Wenn ich an einer anderen Stelle auf der Seite $ item_name zurückmelde, wird der korrekte Wert aus der DB angezeigt? –

+0

ahhh also ich weiß nicht, Ihre DB-Daten - aber was passieren könnte, ist, Sie bekommen und dann überschreiben die Variablen in Ihrer While-Schleife. Sie sollten Ihre Schleife beenden, sobald die Werte gesetzt sind - ich habe mein Beispiel aktualisiert ~ sonst laufen Sie Gefahr, die Variablen zu durchlaufen und auf null zurückzusetzen –

+0

Ich habe 'return' anstelle von' break' verwendet - zu viele Sprachen diese Tage. Verwenden Sie 'break' - aktualisiert Beispiel mit diesem –

0

Dont $item_name=$_REQUEST['item_name']; innerhalb der isset Funktion verwenden, dann werden Sie den tatsächlichen $ item_name aus der select-Anweisung erhalten.

0

Sie haben 2 $item_name Erklärungen in Ihrem Code:

$item_name = $fetch['item_name']; 

UND

$item_name = $_REQUEST['item_name']; 

die erste Also, überschreibt die zweite ein. Wenn es also keinen <input> für $_REQUEST['item_name'] gibt, wird es leer sein.

Entfernen Sie die 2. Deklaration, um dieses Problem zu beheben, so dass $item_name den Wert enthalten, der aus der Datenbank abgerufen wird.


Hinweis:

mysql_* Funktionen seit PHP sind veraltet 5.5 und entfernt in PHP 7 verwenden mysqli_* Funktionen oder anstelle PDO.

+0

@MikeE Hilft Ihnen eine dieser Antworten? Akzeptiere den Besten, danke :) – Panda

Verwandte Themen