我正在使用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变量仍然没有显示任何内容?
答案 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是一个相当不错的套件。有一本手册,还有一个学习曲线,但它会让你成为一个更好的程序员(如果这是你的目标 - 我绝对不希望听起来居高临下 - 很多时候人们'编程'来满足特定要求并节省公司资金 - 没有伤害没有犯规!)
单元测试让我每天都变得更好。
答案 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。