防止通过表单覆盖文件上传和MySQL记录?

时间:2011-11-02 02:00:34

标签: php mysql file-upload

我设置了提交系统,我想拥有它,因此不能提交重复的条目。如果提交了一个,则保留ORIGINAL记录和文件上载(不覆盖)。此外,如果它存在,我希望表单向用户显示错误。这是我的upload.php(在HTML表单中引用)。

upload.php的

<?php

//This is the directory where images will be saved
$extension = explode(".", $_FILES['upload']['name']);
$extension = $extension[count($extension)-1];
$target = "uploads/";
$target = $target . $_POST['snumber'] . "." . $extension;

//This gets all the other information from the form and prevents SQL injection
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$upload=($_FILES['upload']['name']);
$snumber=$_POST['snumber'];
$grade=$_POST['grade'];
$email=$_POST['email'];

// Connects to your Database
mysql_connect("localhost", "db_user", "password") or die(mysql_error()) ;
mysql_select_db("db_name") or die(mysql_error()) ;

//Writes the information to the database
mysql_query("INSERT INTO `Table` VALUES ('$fname', '$lname', '$snumber', '$grade', '$email', '$target')") ;

//Writes the upload to the server
if(move_uploaded_file($_FILES['upload']['tmp_name'], $target))
{
//Tells you if its all ok
echo "Your submission ". basename( $_FILES['uploadedfile']['name']). " was successful and we have received your submission. Your result will be sent to $email ";
}
else {

//Gives and error if its not
echo "Sorry, there was a problem uploading your file.";
}
?>

我该怎么做呢?

编辑:来自下方的综合建议,这里是更新的代码,但现在我得到了Parse error: syntax error, unexpected T_ECHO in /path/to/upload.php on line 32

新上传.php

<?php

//This is the directory where images will be saved
$extension = explode(".", $_FILES['upload']['name']);
$extension = $extension[count($extension)-1];
$target = "uploads/";
$target = $target . $_POST['snumber'] . "." . $extension;

//This gets all the other information from the form and prevents SQL injection
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$upload=($_FILES['upload']['name']);
$snumber=$_POST['snumber'];
$grade=$_POST['grade'];
$email=$_POST['email'];

//Checks if submission already exists
if(file_exists($target))
{
    echo "This submission already exists. Please check that you have entered all values correctly. If this is an error please contact support";
}
else
{
    //Now that file doesn't exist, move it. 
    move_uploaded_file($_FILES['upload']['tmp_name'], $target);
    //MYSQL CONNECTION
        mysql_connect("localhost", "db_user", "password") or die(mysql_error()) ;
        mysql_select_db("db_name") or die(mysql_error()) ;
    //MYSQL Entry
        mysql_query("INSERT INTO Table (fname, lname, snumber, grade, email, target) VALUES ('".mysql_real_escape_string($fname)."', '".mysql_real_escape_string($lname)."', '".mysql_real_escape_string($snumber)."', '".mysql_real_escape_string($grade)."', '".mysql_real_escape_string($email)."', '".mysql_real_escape_string($target)."')")

    echo "Your submission was successful and we have received your portfolio. Your marks will be sent out to $email.";
}
?>

2 个答案:

答案 0 :(得分:1)

看起来您正在将目标存储在数据库中,因此您可以检查数据库以查看该文件是否已存在,或者您可以使用php的file_exists()函数。

DB你显然在插入语句之前运行查询,并根据结果使你的条件成为基础。

否则,

if(file_exists($target))
{
    echo 'error';
}
else
{
   move_uploaded_file($_FILES['upload']['tmp_name'], $target);
   // do success things here
}

文件存在可能需要完整路径。如果它不能立即工作,请查看前面的$ _SERVER ['DOCUMENT_ROOT']是否有帮助。

答案 1 :(得分:0)

我在提交表单和文件

之前通过应用ajax查询解决了这个问题
var param = "action=testfile&dirpath=" + dirpath + "&file=" + filename;

    $.ajax({
       type: "GET",
       url: 'combi/testfile.php',
       data: param,
       success: function(data) {
            test data .... if OK submit.
       }

在testfile.php中,您测试文件并回显数据

if($_GET['action'] == 'testfile'){
    $msg = '';
    $basedirpath = $_GET['dirpath'] . "/";

    if(file_exists($basedirpath . $_GET['file'])) {
        $msg = 'exists';
    }
    echo $msg;
}

在ajax调用中的数据中返回$ msg。