创建变量为两个不同的任务使用一个表单字段值

时间:2017-08-03 07:12:59

标签: php arrays forms variables echo

我的网站上有一个表单供用户提交博客

在该表单中,我有一个针对不同博客类别的下拉选择菜单。

例如U.S. NewsWorld NewsEconomic News等......'

每个表单选项允许单个值输入。

在我的php中,我想为该“类别”表单字段创建两个单独的变量,并将每个值用于两个不同的任务。

任务#1:

我想使用所选值作为URL路径的一部分来发布/存储特定的博客文件。

对于此任务,我能够使用表格中嵌入的值。

并且......在我的php中,我使用类别数组创建了变量$catPath来处理此任务。

例如:

*如果用户选择“美国新闻”作为其博客应显示的类别,则美国新闻的值将设置为“美国”。

因此,在上面的示例中,“US”值将被用作;

file_put_contents("../Blogs/$catPath/$unique_id.html", ob_get_contents());

例如:../Blogs/US/0001.html

所以,非常好......

然而......

任务#2:

我想创建一个名为$catTag的单独变量,以便在博客标题中使用。

例如:

坚持上面的例子......如果用户选择'美国表格中的新闻......我希望完整的类别文本“美国新闻”出现在博客的标题中,而不是像在网址路径中那样“美国”。

DEMO:

我在表格和下面的php中包含了一个非常精简的演示版本。

在php中,请注意我已经创建了变量$catTag,并且我成功地能够在php echo示例'A'中回显调整后的值。

但是,当我尝试将变量$catTag用作简单的php回声时,如在php示例'B'中...它仍然回显原始值,而不是调整后的值。

我不想在我的表单中为'category'创建两个冗余字段。

我需要能够使用单独的变量,以便回调调整后的值。

我提前为我对此的有限知识道歉。我希望我已经足够好地解释了这一点。

我尝试了几件事,但到目前为止,我没有运气。

非常感谢任何建议。

表格:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form action="MyPHP.php" method="post" enctype="multipart/form-data">

<label>Select A Category: </label>
<select name="category">
<option value="US">U.S. News</option>
<option value="World">World News</option>
<option value="Government-Politics">Government & Politics</option>
<option value="Economic">Economic News</option>
<option value="National-Weather">National Weather News</option>
<option value="Entertainment">Entertainment News</option>
<option value="Science-Technology">Science & Technology</option>
<option value="Sports">Sports News</option>
<option value="Health">Health News</option>
</select>
<br>
<br>
<input name="Submit" type="submit" value="Submit">

</form>
</body>
</html>

PHP :( MyPHP.php)

<?php ob_start(); ?>

<html>
<head>
</head>
<body>


<!---| Start php Example A |---------------------------->
<?php 

$catTag = $_REQUEST['category']; 

if  ($catTag == "US") { echo "U.S. News"; }
if  ($catTag == "World") { echo "World News"; }
if  ($catTag == "Government-Politics") { echo "Government & Politics"; }
if  ($catTag == "Economic") { echo "Economic News"; }
if  ($catTag == "National-Weather") { echo "National Weather News"; }
if  ($catTag == "Entertainment") { echo "Entertainment News"; }
if  ($catTag == "Science-Technology") { echo "Science & Technology"; }
if  ($catTag == "Sports") { echo "Sports News"; }
if  ($catTag == "Health") { echo "Health News"; }

?><br>
<!---| End php Example A |---------------------------->


<!---| Start php Example B |------------------------------>
<?php echo $catTag; ?>
<!---| End php Example B |-------------------------------->

</body>
</html>

<?php echo ''; 
$catPath = $_REQUEST['category']; 
$valid_categories = array('US','World','Government-Politics','Economic','National-Weather','Entertainment','Science-Technology','Sports','Health');
if (!in_array($catPath, $valid_categories)) { die("Invalid Category"); } file_put_contents("$catPath.html", ob_get_contents()); ?>

2 个答案:

答案 0 :(得分:0)

我不太喜欢在SO上为其他人编写代码,但这里有一个更干净的实现,你想要实现的目标。我对代码进行了评论,希望对您有所帮助。

它有一个Key / value数组,包含类别slugs及其标题。然后,我们在执行代码之前检查类别是否存在。因此,您可以使用数组中键的值作为所选类别的标题。

$chosen_category = filter_input(INPUT_POST, 'category'); // Filter the input

if( !$chosen_category ) die('No category chosen');

// Array holding the category keys and titles
$category_array = [
    'US' => 'U.S. News',
    'World' => 'World News',
    'Government-Politics' => 'Government & Politics'
];

if( !array_key_exists($chosen_category, $category_array) ) die('Chosen category does not exist'); // Confirm that the category exists in as key value in $category_array

$category_title = $category_array[$chosen_category]; // Title of the chosen category, as mapped in the KV Array

file_put_contents("{$chosen_category}.html", ob_get_contents());

答案 1 :(得分:0)

我认为最清晰的方法是构建阵列以满足您的两个目的,而不会过于臃肿。我建议通过以下方式利用特定的键和值:

$array=[
    'US'=>'U.S. News',
    'World'=>'World News',
    'Government-Politics'=>'Government & Politics',
    'Economic'=>'Economic News',
    'National-Weather'=>'National Weather News',
    'Entertainment'=>'Entertainment News',
    'Science-Technology'=>'Science & Technology',
    'Sports'=>'Sports News',
    'Health'=>'Health News'
];

表单生成:

echo "<select name=\"category\">";
foreach($array as $k=>$v){
    echo "<option value=\"$k\">$v</option>";
}
echo "</select>";

提交验证:

if(isset($_POST['category'])){  // something was sent
    if(isset($array[$_POST['category']])){
        $catPath=$_POST['category'];
        $catTag=$array[$_POST['category']];
    }else{
        // set some kind of default values or deny submission
    }
}

当然,您必须确定这些方法在项目中的位置。

最重要的信息是,重用数组数据可以提供DRY代码并使“编程神”微笑。

我还要补充一下:

  • 如果您要在表单中使用POST方法,请使用$ _POST接收它。
  • 在尝试使用$_POST['category'] isset()之前,您应该先检查Map<String, String> myMap = new HashMap<>(); myMap.put("A", "fortran"); myMap.put("B", "java"); myMap.put("C", "c++"); myMap.put("D", "php"); List<String> keysForFiltering = Arrays.asList("A", "C"); Predicate<Entry<String, String>> myPredicate = t -> keysForFiltering.contains(t.getKey()); Map<String, String> filteredMap = myMap .entrySet().stream().filter(myPredicate) .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); System.out.println(filteredMap); List<string> MyFilesDates = Directory.GetFiles("C:\\Images\\", "*.png") .Select(p => File.GetLastWriteTime(p) // closing parenthesis moved from here... .ToString("dd/MM/yy")) // ...to here .ToList(); 是否有警告。