1

私はhtmlとphpを使用してWebベースのシステムを作成しています。機能の1つは、学生がファイルをデータベースにアップロードできるようにすることです。実際には3つのファイルです。ファイル タイプの入力フィールドを作成しました。PHP は正しいと確信していますが、理解できない警告が表示され、クエリが機能しないことがあります。しかし、これは常に起こるとは限りません..通常はそうではありません..

HTML のフィールドの 1 つを次に示します。

<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 拡張機能に欠けている主な機能の 1 つは、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 に答える