【问题标题】:Can I pass a variable into an if(isset($_FILES['whatever'])) logical process?我可以将变量传递给 if(isset($_FILES['whatever'])) 逻辑过程吗?
【发布时间】:2021-05-15 20:18:21
【问题描述】:

我是 PHP 新手,我正在尝试创建一个页面,该页面将根据选择的表单按钮进行更改/更新/刷新。这部分有效。该站点的目的是允许上传两种类型的数据的多个文件:照片和音乐,以及文本区域文本的上传——每种类型都存储在不同的位置。我遇到的问题是为每种数据类型指定专用路径(用于 move_uploaded_file 命令)。我可以在变量中设置路径,但似乎if(isset($_FILES['whatever'])) 代码块看不到这些变量。我没有收到任何错误(如您所见,我正在通过 localhost 进行测试)。我应该如何重新设计我的代码以实现目标?我假设问题出在我处理项目的方式上。

ini_set('display_errors',1); 
$MasterFolder= __DIR__;
$BodyText = "";
$BodyHeader='<form action="" method="post">
<div id="NavContainer" style="margin: 4% auto;">
<input type="submit" name="Button" value="Photos">
<input type="submit" name="Button" value="Writings">
<input type="submit" name="Button" value="Music">
</div>
</form>';

switch (htmlspecialchars($_POST['Button'])) {
    case 'Photos':
        $ParentFolder = $MasterFolder . '/Photo';
        $DestinationFolder = $ParentFolder . '/PhotoStore';
        $BodyText='<!-- Whatever -->';
        break;
        
    case 'Writings':
        $ParentFolder = $MasterFolder . '/Write';
        $DestinationFolder = $ParentFolder . '/WriteStore';
        $BodyText='<!-- Whatever -->';
        break;
        
    case 'Music':
        $ParentFolder = $MasterFolder . '/Music';
        $DestinationFolder = $ParentFolder . '/musicStore';
        $BodyText='<div class="EntryForm">
        <div class="TextLabel">Music</div>
        <form action="" style="margin: 0 auto 4% auto;" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile[]" multiple="multiple" />
        </div>
        <div class="EntryForm">
        <div class="TextLabel">Description:</div> 
        <textarea name="MusicText"></textarea>
        </div>
        <div class="EntryForm">
        <input type="submit" value="Publish Entry" />
        </p>
        </form>
        </div> <!-- End ENTRYFORM div -->';
        #echo $ParentFolder;                  ################## These two lines print the expected ##############
        #echo "\n" . $DestinationFolder;      ####################  values #############################
        break;
} 

if (isset($_FILES['myfile'])) {
    #echo $ParentFolder;                  ################## These two lines are equal to ""  ##############
    #echo "\n" . $DestinationFolder;    ###### and I expected them to contain the values assigned in the switch/case statement above ########
    foreach($_FILES['myfile']['tmp_name'] as $key => $tmp_name) {
        $DFile = $DestinationFolder . htmlspecialchars($_FILES['myfile']['name'][$key]);
        chmod($ParentFolder, 0777);
        chmod($DestinationFolder, 0777);
        move_uploaded_file($tmp_name, $DFile);
        chmod($DFile, 0644);
    }   
    chmod($DestinationFolder, 0650);
    chmod($ParentFolder, 0650);
}

?>

<!DOCTYPE html>
<html lang="en">
<head><title>Publish</title>

</head>
<body>

<form action="" method="post">
<input type="submit" name="Button" value="Photos">
<input type="submit" name="Button" value="Writings">
<input type="submit" name="Button" value="Music">
</form>
<div class="EntryForm">
<?php echo $BodyText; ?>
</body>
</html>```

【问题讨论】:

  • 您不能用相同的名称命名所有提交按钮。由于它们具有相同的名称,前两个将被忽略,您将只发送最后一个(在本例中为“音乐”)。为此,您可以使用:1) 三种不同的表单,或 2) 另一个允许您在选项之间进行选择的项目(如单选按钮或下拉菜单)。
  • 谢谢 Alejandro,但使用 Buttons 作为数组确实有效。该部分似乎正常运行 - 您可以更改上面代码中的“” 部分,以查看数组中的按钮确实可以正确处理。
  • 如果您尝试添加default: 案例以查看它是否进入其中?
  • 谢谢,亚历杭德罗。好主意,但结果相同。附加信息:如果我将路径硬编码到 if(isset($_FILES['myfile])) 语句块中,它将适用于我输入的任何硬编码路径。只是我似乎想不出一种方法来成功地将变量从 switch/case 传递到 if(isset 代码块。
  • 哈!那!在 switch 语句之前(在顶部,如 $MasterFolder)声明变量为空值(例如:$ParentFolder = “”),然后它们将在 switch 中重新分配。问题是这些变量在实际开关的范围内,您需要一个外部范围(“更高级别”)才能使它们持续存在。当它们的当前作用域结束时,变量被释放。

标签: php html arrays button move-uploaded-file


【解决方案1】:

当您提交第二个表单(带有文件的那个)时,您不会重新发送“按钮”值。为了避免这种情况,您可以在“发布条目”-submit-input 上方的文件表单中添加一个隐藏输入,如下所示:

<input type="hidden" name="Button" value="Music" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2021-10-15
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多