在PHP电子邮件表单正文中包含mySQL DB值

时间:2016-05-14 13:46:43

标签: php mysql email

我正在使用PHP通过以下代码通过HTML联系表单发送数据:

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 = "testemail@testemail.com";
        $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变量回显到隐藏的输入字段,然后将其包含在电子邮件$ body中。有更简单的方法吗?

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

编辑:

我已删除:

 $item_name = $_REQUEST['item_name'];
if语句中的

但是当通过PHP发送电子邮件时,$ item_name变量仍然没有显示任何内容?

3 个答案:

答案 0 :(得分:0)

关闭 - 你太直接地盯着它了。注意你要求的是REQUEST参数而不是你提取的参数 - 试试这个:

我最初建议这样做,没有看到树木的森林(它清除了冗余和错误(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="testemail@testemail.com";
  $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="testemail@testemail.com";
  $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; 
}

基本上发生的事情是你的while循环中只存在$item_[id|name]。当你在别处问他们并且他们有空的时候?我没有答案,因为在这个问题规范中我们无法使用。

TL:DR~您的$item_[id|name]变量,其范围在while循环的EACH迭代中,对于此示例

建立一个更高级别的变量,它将被引用并设置值。

另外 - 您最初在if语句中重写了$item_name变量

EDIT#3billion:文档有点干(如:立体声安装说明),但作为15年来用20多种不同语言开发的人--- 学会喜欢单元测试

phpunit是一个相当不错的套件。有一本手册,还有一个学习曲线,但它会让你成为一个更好的程序员(如果这是你的目标 - 我绝对不希望听起来居高临下 - 很多时候人们'编程'来满足特定要求并节省公司资金 - 没有伤害没有犯规!)

单元测试让我每天都变得更好。

https://phpunit.de/

答案 1 :(得分:0)

不要在isset函数中使用$item_name=$_REQUEST['item_name'];,那么你将从select语句中获得实际的$ item_name。

答案 2 :(得分:0)

您的代码中有2个$item_name声明:

$item_name = $fetch['item_name'];

$item_name = $_REQUEST['item_name'];

所以,第二个将覆盖第一个。因此,如果<input>没有$_REQUEST['item_name'],则它将为空白。

要解决此问题,请删除第二个声明,以便$item_name保存从数据库中获取的值。

注意:

mysql_*函数自PHP 5.5起被弃用,在PHP 7中被删除,使用mysqli_*函数或PDO。