将数据从文件复制到表

时间:2018-03-29 04:31:48

标签: php html

我正在尝试从文件中复制数据,创建新文件,从此表复制内容,将其放在表格中并输出。但是,在浏览并选择文件后,我表中唯一的输出是文件的路径。

我还尝试将内容复制并粘贴到我创建的新文件中。但是,我的代码只是清除它并只在文件中放置路径。

任何提示?

<?php
$Semester = $_POST['Semester'];
$CourseID = $_POST['CourseID'];
$SectionID = $_POST['SectionID'];
$file = $_POST['SelectFile'];
echo "You entered:".$Semester.",".$CourseID."&".$SectionID.".";

if (file_exists($file)){ 
    echo "The file ".$file." exists.";
    }
    else {
    echo "The file ".$file."does not exist.";
    }

    file_put_contents("hw3data_server.txt" , $file);
        //copy('$file','hw3data_server.txt');
    $myfile = fopen("hw3data_server.txt","r") or die ("Unable to return file.");
 ?>
    <table>
    <tr>
    <th>Student Name</th>
    <th>Course Grade</th>
    </tr>

    <?php



    while(($row = fgets($myfile)) != false) {
    echo "<tr>";
    $col = explode("\n",$row);

    foreach($col as $data) {
            echo "<td>". trim($data)."</td>";
    }
    echo "</tr>";
}
?>

</table>
</body>
</html>



<form method="post" action="hw3_grade_form.php">
<h3>Please submit semester (e.g., Spring 2018), course ID (e.g., BCS 350),
Section ID (e.g., 21695), and upload a text file that includes all student names.</h3><br />
Semester: <input type="text" name="Semester" value="" /><br />
Course ID: <input type="text" name="CourseID" value="" /><br />
Section ID: <input type="text" name="SectionID" value="" /><br />
Select File: <input type="file" name="SelectFile" /><br />
<input type="submit" value="Submit" />

1 个答案:

答案 0 :(得分:2)

正如我在评论中所说的那样。但是让我们来看看你的代码。

$file = $_POST['SelectFile'];
file_put_contents("hw3data_server.txt" , $file);
  

int file_put_contents(string $ filename,mixed $ data [,int $ flags = 0 [,resource $ context]])

$file是您文件的名称。 file_put_contents的第二个参数是数据,因此您将文件名放在文件的数据中。哪个惊喜会创建一个包含文件名的文件。

现在你评论了一下。

//copy('$file','hw3data_server.txt'); 

这是复制文件的正确方法,但您使用'$file'单引号,不进行变量插值(不会将变量的值放在适当位置)所以您尝试复制文件名称为$file的字面意思,而不是$file的值,即文件名。

而是尝试copy($file,'hw3data_server.txt');

没有单引号。

这种逻辑是有缺陷的

if (file_exists($file)){ 
   echo "The file ".$file." exists.";
}else {
   echo "The file ".$file."does not exist.";
}

file_put_contents("hw3data_server.txt" , $file);

看到检查是好的,一切都很好,但无论如何你只是去做。假设if条件无法阻止运行file_put_contents。没什么,你回应错误然后继续执行它。

 do{
    if (file_exists($file)){ 
       echo "The file ".$file." exists.";
    }else {
      echo "The file ".$file."does not exist.";
      break; //exit doWhile
    }

    if(!@copy($file, "hw3data_server.txt"){
       echo "Failed to copy the file ".$file;
       break; //exit doWhile
    }

    //rest of code...

 }while(false);

参见Do While循环,与while循环有点不同。 while循环检查条件然后运行,do while循环运行1次,然后检查条件。因此,当条件为假时,此循环仅运行一次。

为什么要使用它。

好吧,它让我们可以利用break来退出循环。

因为这是程序性的,没有类没有函数,控制执行流的唯一方法是嵌套if条件,以便排除我们不想运行的代码块。

但是,我们可以使用这个小技巧并突破循环并随时停止运行。

<强>更新  我认为这使用了现有文件,而不是http上传表单,感谢@Omar Tanti指出这一点。

由于这是一个HTTP上传表单,因此您必须在表单标记中添加enctype="multipart/form-data"。它与数据如何通过服务器传递有关,但我并不关心这些细节,只要相信我没有它就无法工作。

<form method="post" action="hw3_grade_form.php" enctype="multipart/form-data" >

现在我们已修复此问题,而不是使用$_POST['SelectFile'],您需要使用$_FILES['SelectFile']['tmp_name']$_FILES中还有一些其他重要的内容,所以我会快速echo '<pre>'; var_export($_FILES);查看详细信息。

最后一件事是你真的不应该这样移动和复制上传文件,你应该使用

move_uploaded_file

  

bool move_uploaded_file (字符串 $ filename ,字符串 $ destination

     

此函数检查以确保filename指定的文件是有效的上载文件(意味着它是通过PHP的HTTP POST上载机制上传的)。如果文件有效,它将被移动到目的地给出的文件名。

     

如果上传文件中的任何内容都可能向用户显示其内容,甚至向同一系统上的其他用户显示内容,则此类检查尤其重要。

出于各种安全原因。基本上,这会检查文件是否已上载,从而减轻了一些目录遍历攻击。这种类型的攻击使用文件名指向服务器上的文件,然后可以将其输出并显示给攻击者(或者至少是我理解它的方式)。

一个例子是上传一个文件,其名称被构造成模仿wp-config.php的位置。例如名为../../wp-config.php的文件。此文件中包含数据库用户和密码信息(用于wordpress)。 ../向上导航到一个目录级别。因此,服务器可以向上导航两个级别,然后拉取该文件。然后,如果您在代码中读出“已上载”文件的内容,而不检查它是否实际上是上传的文件。这可能会欺骗服务器读出该文件的内容并将其显示给“攻击者”,从而将它们提供给服务器等等。(这可能是一个很糟糕的例子,但我能想到的最好的是我的头)。

换句话说,这几乎是一团糟。

我建议查看一些基本的文件上传教程,因为它们可以覆盖构建文件上传的过程,远远好于在此处理。此类“教程”也远远超出了SO的Q&amp; A格式的范围。

也就是说,您可以使用copy替换上面代码中的move_uploaded_file($_FILES['SelectFile']['tmp_name'],"hw3data_server.txt"),这至少应该让您入门。但是,对于我上面提到的一些安全考虑,值得一读。

对不起,这太漫长了。

相关问题