【问题标题】:PHP upload errorsPHP 上传错误
【发布时间】:2011-09-28 19:03:14
【问题描述】:

我的上传脚本给我带来了一些问题,我终其一生都无法弄清楚原因。这是php代码:

mysql_connect('localhost', 'root', '');
mysql_select_db('uploads');

if (isset($_FILES["file"]["type"]) && isset($_FILES["file"]["size"])) {
if (($_FILES["file"]["type"] == "image/png")) {
    if ($_FILES["file"]["size"] < 500120) {
        if ($_FILES["file"]["error"] > 0) {
            echo $_FILES["file"]["error"];
        } else {                         
            if (file_exists("uploads/" . $_FILES["file"]["name"])) {
               echo $_FILES["file"]["name"] . " already exists. ";
            } else {
                move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/" . $_FILES["file"]["name"]);
                $name = $_FILES["file"]["name"];
                mysql_query("INSERT INTO uploads (name) VALUES ('$name')");                 
                if (isset($_POST['title']) && isset($_POST['desc'])) {
                    $title = $_POST['title'];
                    $desc = $_POST['desc'];
                    mysql_query("INSERT INTO uploads (title, desc) VALUES ('$title', '$desc')");
                    echo $title;
                    echo $desc;
                }                  
            }
        }
    } else {
        echo "File is too big";
    }
} else {
   echo "Wrong file type";
}
}

我知道我的文件路径和表单输入是正确的,如果我回显 $title$desc 变量,它们会返回正确的值。我的问题是:由于某种原因,它不会将$title$desc 值输入数据库。第一个 mysql 查询工作正常,但不是第二个。知道为什么吗?

【问题讨论】:

  • 您确定要将title, desc 与名称相关联吗?
  • 第二个查询后面加上echo mysql_error()会是什么输出?
  • 是的,现在有点搞砸了,但 $name 是实际文件名,$title 是用户定义的图像名称,$desc 是用户定义的描述。
  • 首先,您确实需要在将数据发送到数据库之前对其进行清理,其次您遇到的错误是什么?
  • 我没有收到错误,只是没有任何内容输入数据库

标签: php mysql upload


【解决方案1】:

这可能是因为descMySQL reserved keyword,并且它必须在查询语句中用反引号括起来。始终检查 mysql_error() 以查找查询失败的原因。

$success = mysql_query("INSERT INTO uploads (title, `desc`) VALUES ('$title', '$desc')");
if (!$success) echo mysql_error();

请在插入前转义$title$desc,因为它们直接来自$_POST

$title = mysql_real_escape_string($_POST['title']);
$desc = mysql_real_escape_string($_POST['desc']);

在前面的查询中对$name 执行相同的操作:

$name = mysql_real_escape_string($_FILES["file"]["name"]);

【讨论】:

  • 这也会影响 $title 变量吗?
  • @codedude 不,它不会影响title,因为这不是 MySQL 保留字。请参阅我刚刚链接到答案中的列表。
【解决方案2】:

您正在上传表中为 1 个文件创建 2 条记录。可能名称列设置为不为空,这会导致第二个查询不起作用。 它必须是:

$name = mysql_escape_string($_FILES["file"]["name"]);
$title = isset($_POST['title'])?mysql_escape_string($_POST['title']) : '';

$desc = isset($_POST['desc'])?mysql_escape_string($_POST['title']) : '';

mysql_query("INSERT INTO uploads (`name`, `title`, `desc`) VALUES ('$name', $title, $desc)");

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2016-03-08
    • 2011-06-19
    • 2012-06-18
    • 2010-09-05
    • 2015-11-02
    • 2012-05-04
    相关资源
    最近更新 更多