2010-06-01 16 views
0

对不起,如果这已被回答某处;我不太确定如何解决问题甚至寻求帮助。防止发布空表单输入数组?

无论如何,我有一个带有三个文本输入框的表单,其中用户将输入三首歌曲标题。我设置了简单的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,所以请原谅我,如果这之前已经无数次回答,如果我可怕的描述的那样,等)

回答

1

你应该检查每个条目:

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

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

哦,就这么简单,哈哈。谢谢! – user355295 2010-06-01 11:16:24

+0

我个人不会使用empty(),因为它是如此宽容,当它指定它为空的值时:例如,一个“0”字符串将通过empty()被评估为true--它不可能是歌曲标题将自己为“0”,但因为它可能会发生,所以我会考虑使用更简单的if(trim($ song)!=='')条件。 – 2010-06-01 11:23:00

+0

好点,谢谢! – user355295 2010-06-01 11:25:42

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