【问题标题】:PHP upload filename to mysqlPHP上传文件名到mysql
【发布时间】:2014-11-27 15:53:36
【问题描述】:

此代码将文件传输到指定的文件夹和 db 表,但是当我在浏览器上启动/打开/运行页面时,它会自动向 db 表发送一些内容,并且文件名字段为空。我什至没有点击/上传了任何东西。我不知道我是否解释得当。问题是当我打开页面时,我检查了 db 表行并创建了一个空行。顺便说一句,id 递增,文件名字段为空。(尚未上传任何内容.) 代码有什么问题?

<?php
if(isset($_FILES['filename'])){
    $errors= array();
    $file_name = $_FILES['filename']['name'];
    $file_size =$_FILES['filename']['size'];
    $file_tmp =$_FILES['filename']['tmp_name'];
    $file_type=$_FILES['filename']['type'];   
    $file_ext=strtolower(end(explode('.',$_FILES['filename']['name'])));

    $expensions= array("jpeg","jpg","png");         
    if(in_array($file_ext,$expensions)=== false){
        $errors[]="extension not allowed, please choose a JPEG or PNG file.";
    }
    if($file_size > 2097152){
    $errors[]='File size must be excately 2 MB';
    }               
    if(empty($errors)==true){
        move_uploaded_file($file_tmp,"uploads/".$file_name);
        echo "Success";
    }else{
        print_r($errors);
    }
  }

 ?>

<?php


$servername = "localhost";
$username = "root";
$password = "";
$dbname = "admin";

$filename = false;
if(isset($_FILES['filename'])){
$filename = $_FILES['filename']['name'];
}

// Create connection
mysql_connect($servername, $username, $password) or die ('MySQL Not found // Could Not Connect.');

mysql_select_db("admin") or die(mysql_error()) ;

mysql_query("INSERT INTO upload_test (fileName)
VALUES ('$filename')") ;

?>

我的表格:

<form name="form" method="POST" enctype="multipart/form-data" >
<input name="filename" type="file" id="filename" />
<input name="submit" type="submit" id="submit"/>
</form>

【问题讨论】:

  • 是的,您的查询将始终运行,无论是否有上传。 1) 你为什么不把它放在第一个 if 块 2) 你 主要 容易受到 SQL 注入,修复它 3) 不要将 mysql_ 函数用于新代码,它们'被弃用
  • 警告:这非常不安全,因为这些参数不是properly escaped。您应该绝不$_POST 数据直接放入查询中:它会创建一个巨大的SQL injection bugmysql_query 是一个过时的接口,不应使用,它已从 PHP 中删除。像PDO is not hard to learn 这样的现代替代品。像 PHP The Right Way 这样的指南解释了最佳实践。
  • 感谢您的建议。我会试试那些。不过还是个菜鸟。

标签: mysql file-upload filenames filefield


【解决方案1】:

那是因为你总是在执行 INSERT 语句。您只想在上传后插入一条记录。

if(isset($_FILES['filename'])){
    $errors = array();
    $file_name = $_FILES['filename']['name'];
    $file_size =$_FILES['filename']['size'];
    $file_tmp =$_FILES['filename']['tmp_name'];
    $file_type=$_FILES['filename']['type'];   
    $file_ext=strtolower(end(explode('.',$_FILES['filename']['name'])));

    $expensions= array("jpeg","jpg","png");         
    if(in_array($file_ext,$expensions)=== false){
        $errors[]="extension not allowed, please choose a JPEG or PNG file.";
    }
    if($file_size > 2097152){
     $errors[]='File size must be excately 2 MB';
    }          

    // if there are no errors...     
    if (empty($errors)==true) {

        // upload the file...
        move_uploaded_file($file_tmp,"uploads/".$file_name);

        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "admin";

        // and create a new record in the database
        mysql_connect($servername, $username, $password) or die ('MySQL Not found // Could Not Connect.');
        mysql_select_db("admin") or die(mysql_error()) ;
        mysql_query("INSERT INTO upload_test (fileName) VALUES ('$file_name')") ;

        echo "Success";
    }else{
        print_r($errors);
    }
}

顺便说一句,获取文件扩展名的更短的方法是使用pathinfo()

$file_ext = pathinfo($_FILES['filename']['name'], PATHINFO_EXTENSION);

【讨论】:

  • 谢谢!你暂时救了我。 :D
  • 如果它有多个文本字段呢?假设我添加了 5 个文本字段。
  • 看看这个example。网上还有很多其他的“PHP 表单处理”教程。
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 2015-04-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多