1

我正在使用html和php制作一个基于网络的系统,其中一个功能是允许学生将文件上传到数据库,实际上是3个文件。我创建了一个文件类型的输入字段,我确定我的 PHP 是正确的,但有时会出现我不理解的警告并且查询不起作用。但这并不总是发生..通常不会..

这是 HTML 中的字段之一:

<tr><td> <p><span>C.V:  </span> </td><td> <input class="contact" type="file" id ="CV" name="CV" value="" required /></p> </td></tr> 

这是PHP

    //check for CV
if ($_FILES["CV"]["size"] > 0)
{

    $fileName = $_FILES['CV']['name'];
    $tmpName  = $_FILES['CV']['tmp_name'];
    $fileSize = $_FILES['CV']['size'];
    $fileType = $_FILES['CV']['type'];
    //check if larger than 1M
    if($fileSize > 1048576) {echo "<p style='color: red;'> Cannot upload <b>CV</b> due to large size. File must be less than 1MB </br> </p>"; $complete= false;}
    //check if .PDF ( I need it to be PDF always)
    else if($fileType != "application/pdf")
        {
        echo "<p style='color: red;'> Cannot upload <b>CV</b> file type must be a .PDF only </br> </p>"; $complete= false;}
    //everything is fine:
        else{
            $fp = fopen($tmpName, 'r');
            $CV = fread($fp, filesize($tmpName));
            $CV = addslashes($CV);
            fclose($fp);

            if(!get_magic_quotes_gpc())
                {
                $fileName = addslashes($fileName);
                }

                echo "<br>CV: File $fileName uploaded with type $fileType and size $fileSize <br>";
            } 

 }

SQL查询:

$qry=" UPDATE student SET CV = '$CV', Transcript='$tran',IELTScertificate='$EC', Status ='$stat' WHERE KSUID ='$KSUID'";

警告:

警告:mysql_query():MySQL 服务器已消失...第 330 行

警告:mysql_query():读取结果集的标题时出错...第 330 行

330.  $result=mysql_query($qry);

在数据库中我没有为上传的文件使用表格,我只需要内容但我不关心类型,因为它总是一个 pdf,只要它被存储,我也不关心名称在右栏中。

我不确定这是否是问题所在?但我不这么认为,因为某些文件已成功上传,而其他大小不同的文件则没有。


我在检索文件时面临的另一个问题..当我下载文件时,我正确地将其作为 .pdf 文件获取,但是当我打开它时,它说文件已损坏..我不确定为什么?也许是因为我使用的是本地服务器?虽然我不这么认为,但我已经厌倦了试图弄清楚:(如果有人以前遇到过这样的问题,或者如果你知道如何解决这个问题,请帮助我

HTML:

<a href='updatestudentlist.php?id=".$ksuid."&file=00'>CV</a> <br/>

PHP:

    if(isset($_GET['file'])){ 
    $file=intval($_GET['file']);
    if($file==00) //I use this cause other files got different numbers
    {

        $query = "SELECT CV FROM student WHERE KSUID='".$_GET['id']."'"; 
        $result = mysql_query($query) or die('Error, query failed'); 
        list($content) = mysql_fetch_array($result);

        header("Content-type: application/pdf");
        header("Content-Disposition: attachment; filename=".$_GET['id']."_CV"); 
        echo $content; 
        exit; 
    }
}   
4

2 回答 2

1

这里有多个问题,主要集中在您如何使用数据库。

1)您不应该使用mysql_query()与您的数据库进行交互,因为该模块已被贬低,以支持更好、更新的库(例如MySQLi)。特别是,MySQL 扩展缺少 MySQLi 的一个主要功能是准备好的语句,这就是间接地为什么您会收到有关服务器消失的警告的原因。

除了使用当前代码对自己进行注入攻击之外,它还会生成一个非常大的 SQL 查询(因为您将 PDF 本身包含在查询字符串中以更新学生资料)。如果单个查询执行时间过长,则与服务器的连接将被断开(这会发出该特定警告)。因此,您应该在上传较大的 PDF 时遇到错误,而较小的 PDF 上传就好了。

相反,如果您使用准备好的语句,如 MySQLi 扩展中可用的那样,服务器将能够处理极短的查询,然后也等待要传递的参数,其中极大的 PDF 文件字符串就是其中之一。

2)您的文件被认为是“损坏的”,因为您addslashes()在将其插入数据库之前使用它,但在将其stripslashes()拉出时未使用。因此,您提供的 PDF 的大部分数据都是正确的,但其中有一堆额外的斜线,这会使 PDF 阅读器无法使用。

于 2013-04-28T15:12:52.327 回答
0

问题的第一部分主要与 MySQL 服务器的连接问题有关。可能发生的原因有很多。检查此链接服务器已因各种原因消失

于 2013-04-28T15:05:43.843 回答