2016-05-14 13 views
-2

でのMySQL DB値を含め、私は以下のコードを使用してHTMLコンタクトフォームから入力されたデータを電子メールで送信するためにPHPを使用しています:は、PHPのメールフォーム本体

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; 
    } 
?> 

電子メールが正しく送信され、 '名前'と 'メール'の入力フォームフィールドに入力された値が含まれていますが、$ item_name変数が空白ですか?私がそれを働かせる唯一の方法は、$ item_name変数を非表示の入力フィールドにエコーし、それを電子メール$本体に含めることです。簡単な方法がありますか?

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

編集:私は削除した

$item_name = $_REQUEST['item_name']; 
if文の中

が、電子メールはPHPを介して送信されたときに$ ITEM_NAME変数は、まだ何も表示されませんか?

+4

mysql_ *関数はPHP 5.5以降で廃止され、PHP 7では削除されました。mysqli_ *関数やPDOを代わりに使用しました – Panda

+0

データがある場合はvar_dump($ item_name)を使用してください。 – Fil

+0

var_dump($ item_name)正しい値 –

答えて

0

閉じる - あなたはそれをあまりにも直視しています。

私が最初に提案したのは、ツリーのフォレストを表示せずに(冗長でエラー(XSS INJECTION!)の問題は解決しましたが、それでも問題は解決しました)失敗:

<?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; 
} 

ではなく、あなたの問題のための主な理由は、これを実行しようと、スコープされています

<?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; 
} 

は基本的に起こっていたこと$item_[id|name]は、あなたのwhileループの中に存在しているあなたが尋ねられたとき。それらはどこかにあり、彼らは利用可能ですか?私はこの質問の仕様で私たちに利用可能ではないので、その答えはありません。

TL:whileループの各反復内にスコープDRは〜あなたの$item_[id|name]変数、この例の

より高いレベルの変数を確立し、それが参照され、値が設定します。

も ​​- あなたはもともとあなたのif文

EDIT番号の3billionに$item_name変数を再書いていた。しかし、以上で展開している誰かのように:ドキュメントは少し乾燥(ステレオインストール命令のように)であります15年の間に20の異なる言語--- ユニットテストを愛することを学ぶ

phpunitはかなりまともなスイートです。マニュアルを習得して習得することができますが、それはあなたをより良いプログラマーにしてくれるでしょう(あなたの目標 - 私は絶対に歓迎したくありません - 多くの時間の人々が特定の要件を満たし、 - 害はありません!)

ユニットテストは私を毎日良くします。

https://phpunit.de/

+0

$ item_name = $ _ REQUEST ['item_name'];電子メール$本文内の$ item_name変数は送信された電子メールにまだ表示されません。ページの他の場所で$ item_nameをエコーし​​た場合、DBからの正しい値が表示されますか? –

+0

あなたのDBデータはわかりませんが、何が起こっているのかは、あなたのwhileループの変数を取得して上書きすることです。私の例を更新しました - それ以外の場合、変数の反復/過去/変数をリセットしてnullにリセットする –

+0

'break'の代わりに' return'を使用しました - これらの言語が多すぎます日々。 'break'を使用してください - –

0

いけない、あなたはselect文から、実際の$ ITEM_NAMEを取得しますISSET関数内$item_name=$_REQUEST['item_name'];を使用しています。あなたは、あなたのコード内で2つの$item_name宣言してい

0

:だから

$item_name = $fetch['item_name']; 

$item_name = $_REQUEST['item_name']; 

を、第二1は最初のものを上書きします。したがって、$_REQUEST['item_name']<input>がない場合は空白になります。

この問題を解決するには、$item_nameがデータベースからフェッチされた値を保持するように、2番目の宣言を削除します。


注:

mysql_*機能は、PHP 5.5以降廃止され、PHP 7で除去し、代わりmysqli_*機能またはPDOを使用しています。

+0

@MikeEこれらの回答のいずれかがあなたを助けますか?最高のものを受け入れる、ありがとう:) – Panda

関連する問題