防止发布空表单输入数组?

时间:2010-06-01 11:08:07

标签: php

对不起,如果已在某处回答过;我不太确定如何解决问题甚至寻求帮助。

无论如何,我有一个带有三个文本输入框的表单,用户将输入三个歌曲标题。我有简单的PHP设置将这些输入框视为一个数组(因为我可能想要,比如说,将来有100首歌曲)并将歌曲标题写入另一个文档。

<form method="post">
<input type="text" name="songs[]" value="" />
<input type="text" name="songs[]" value="" />
<input type="text" name="songs[]" value="" />
<button type="submit" name="submit" value="submit">Submit</button>
</form>

<?php
if (isset($_POST['submit'])) {
   $open = fopen("test.html", "w");

   if(empty($_POST['songs'])) { }
   else {
      $songs = $_POST['songs'];
      foreach($songs as $song) {
         fwrite($open, $song."<br />");
      };
   };
};
?>

这可以正确地将歌曲标题写入外部文件。但是,即使输入框为空,外部文件仍将被写入(仅使用<br />)。我假设if语句会确保如果方框是空白的,就不会发生任何事情,但事实显然并非如此。

我猜这个阵列并不像我想象的那样空洞,但我不确定它会带来什么影响。知道我做错了吗?

(再说一次,对于PHP来说,我是无能为力的,所以请原谅我,如果我之前已经回答了一百万次,如果我描述的那么可怕,等等。)

2 个答案:

答案 0 :(得分:1)

你应该检查每个条目:

<?php
if (isset($_POST['submit'])) {
   $open = fopen("test.html", "w");

   foreach($_POST['songs'] as $song) {
       if(!empty($song)) {
           fwrite($open, $song."<br />");
      };
   };
};
?>

答案 1 :(得分:1)

确实$ _POST ['songs']不是一个空数组,它是一个包含3个空字符串的数组。 您可以使用以下内容清除所有空值:

$song_titles = array_filter($_POST['songs'], function($title) {return (bool) trim($title);});

您还可以对该回调函数进行一些其他检查(白名单仅包括字母数字和其他一些字符(空格,短划线等))。

如果您的PHP版本低于5.3,则必须单独定义回调函数,请参阅http://us2.php.net/manual/en/function.array-filter.php