PHP未定义的变量

时间:2014-02-12 09:46:47

标签: php

有人可以查看这段代码并告诉我为什么我在第22-26行从调试器收到“未定义变量”消息?此代码在另一台运行php 5.2的服务器上运行正常。但是,我的apache服务器运行php5.5,相同的代码不会写入指定的文件。当我为第22-26行的参数添加一个字符串值,而不是引用空的表单值时,它可以工作,所以问题是将输入表单值转换为变量。我得到“未定义的变量”或“未定义的索引”。这是我的代码:

<html>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Name: <input type="text" name="name"><br><br>

E-mail: <input type="text" name="email"><br><br>

Username(for ftp access): <input type="text" name="username"><br><br> 
Password(for ftp access): <input type="password" name="password"><br><br>
Leave Your Feedback (Comments, Inquiries, Suggestions): <br>
<textarea rows="10" cols="50" name="text"></textarea>
<br><input type="submit" name="submit" value="Submit"> 
<?php

$file = fopen("data.html", "ab"); 
if(isset($_POST['name'])){ $name = $_POST['name']; } 
if(isset($_POST['email'])){ $email = $_POST['email']; } 
if(isset($_POST['username'])){ $username = $_POST['username']; }
if(isset($_POST['password'])){ $password = $_POST['password']; } 
if(isset($_POST['text'])){ $text = $_POST['text']; } 


echo fwrite($file, $name);
echo fwrite($file, $email);
echo fwrite($file, $username);
echo fwrite($file, $password);
echo fwrite($file, $text);
fclose($file);
?>
</form> 
</html>

大家,谢谢你的建议。您的一些解决方案已经解决了摆脱恼人的通知和有关未定义变量的警告的问题。但是,该脚本仍然不会写入该文件。当我使用var_dump($ _ POST)时,它返回已使用表单提交的完整变量值数组。但是,脚本的输出(写入文件00000的字节数)仅在从控制台,调试器或命令行运行时显示在html中,但在浏览器中打开时则不显示。我知道脚本工作正常,因为我可以看到它从输入表单字段读取了很多字节到我浏览器中的文件,这种情况没有发生,因此脚本无效。它应该工作,我使用xdebug并没有错误。

这是调试器的输出:

<html>
<form method="post">
Name: <input type="text" name="name"></input><br><br>
E-mail: <input type="text" name="email"></input><br><br>
Username(for ftp access): <input type="text" name="username"></input><br><br> 
Password(for ftp access): <input type="password" name="password"></input><br><br>
Leave Your Feedback (Comments, Inquiries, Suggestions): <br>
<textarea rows="10" cols="50" name="textx"></textarea>
<br><input type="submit" name="submit" value="Submit"></form> 
//output of var_dump($_POST) 
array(0) {
}
//output of fwrite()
00000</html>

我遇到的问题:表单是使用值提交的,但是我在脚本中分配的变量在写入文件时并不指向这些值。顺便说一句,这个脚本在php5.2服务器上工作正常,我可以看到提交表单时写入的字节数。实际上我已经在很多不同的服务器上使用这个脚本很长一段时间了,直到现在它才给我这个问题。我通常会在最终的html中隐藏脚本的显示,但至少我知道它的运行正常。

7 个答案:

答案 0 :(得分:1)

工作的服务器使用register_globals。使用它是不好的做法(见警告?)

禁用它,并修复代码。它现在有效,因为$_POST['name']可以$name访问。

答案 1 :(得分:1)

$file = fopen("data.html", "ab");
$details = array('name', 'email', 'username', 'password', 'text');
foreach ($details as $var) {
    if (!empty($_POST[$var])) {
        fwrite($file, $_POST[$var]);
    }
}
fclose($file);

在5.2服务器上,您可能已禁用警告。

您只是分配值,如果$_POST包含这些键,则问题就在于此。

检查和写入文件的最简单方法是使用foreach,就像我上面粘贴的代码一样。

答案 2 :(得分:0)

如果有人未在其中一个帖子字段中插入任​​何内容(例如email),则相关变量将永远不存在

按如下方式更改您的代码

$name = isset($_POST['name']) ? $_POST['name'] : '';
$email = isset($_POST['email']) ? $_POST['email'] : '';
$username = isset($_POST['username']) ? $_POST['username'] : '';
$email = isset($_POST['password']) ? $_POST['password'] : '';
$text = isset($_POST['text']) ? $_POST['text'] : '';

这是ternary operator:如果最右边的运算符被评估为True,它将为左运算符分配?之后的值,否则为:之后的值

N.B:

这只是避免此类警告/错误的可能方法之一

答案 3 :(得分:0)

如果未设置适当的post变量,则不定义$name $email $username $password,从而为您提供未定义的变量错误 你可能会用这个来克服这个错误:

if(isset($_POST['name'])){ $name = $_POST['name']; echo fwrite($file, $name);} 
if(isset($_POST['email'])){ $email = $_POST['email']; echo fwrite($file, $email);} 
if(isset($_POST['username'])){ $username = $_POST['username']; echo fwrite($file, $username);}
if(isset($_POST['password'])){ $password = $_POST['password']; 
echo fwrite($file, $password);} 
if(isset($_POST['text'])){ $text = $_POST['text']; echo fwrite($file, $text);} 

答案 4 :(得分:0)

如果没有$ _POST ['name'],则没有$ name,您将收到错误消息。 你可以使用var_dump($ _ POST)查看值是否正确传递,也可以使用     别的{$ name =''; }

答案 5 :(得分:0)

试试这个

<?php

  $name = "";
  $email= "";
  $username= "";
  $password= "";
  $text = "";
  $file = fopen("data.html", "ab"); 
  if(isset($_POST['name'])){ $name = $_POST['name']; } 
  if(isset($_POST['email'])){ $email = $_POST['email']; } 
  if(isset($_POST['username'])){ $username = $_POST['username']; }
  if(isset($_POST['password'])){ $password = $_POST['password']; } 
  if(isset($_POST['text'])){ $text = $_POST['text']; } 


   echo fwrite($file, $name);
   echo fwrite($file, $email);
   echo fwrite($file, $username);
   echo fwrite($file, $password);
   echo fwrite($file, $text);
   fclose($file);
 ?>

答案 6 :(得分:0)

好的,谢谢大家的帮助。我摆脱了恼人的通知和警告,我在解决问题时解决了我的其他问题。主要的问题是我第一次在Fedora上运行这个服务器而且我没有将selinux设置设置为“permissive”。我在更改后重新配置了防火墙,现在我可以看到脚本并将其写入文件。