PHP图像上传和写入数据库

时间:2013-05-12 16:02:39

标签: php mysql forms phpmyadmin

我对PHP很新,并尝试将图像上传到服务器,然后使用表单和php使用下面的代码和表单将其写入数据库但是它似乎不起作用,如果我全部使用表单中的照片内容与其他变量和内容完美匹配,例如写出文章标题和内容,是否有人能够告诉我哪里出错了?先谢谢你们。

<?php

session_start();

include_once('../php/connection.php');

if (isset($_SESSION['logged_in'])) {
    if (isset($_POST['title'], $_POST['content'], $_FILES['photo1'])) {
        $title = $_POST['title'];
        $content = nl2br($_POST ['content']);
        $photo1=($_FILES['photo1']);
        $target = "../lifestlye";
        $target = $target . basename( $_FILES['photo1']);


        $query =$pdo->prepare('INSERT INTO article (article_title, article_content, photo_1) VALUES (?,?,?)');

        $query->bindValue(1, $title);
        $query->bindValue(2, $content);
        $query->bindValue(3, $photo1);

        $query->execute();
        move_uploaded_file($_FILES['photo1'], $target);
{

}


        header('Location: index.php');
    }

    ?>




 <form action="add.php" method="post" autocomplete="off"/>


    <dl class="field four columns centered">
                    <dd><label for="title">Article Title</label></dd>
                    <dt class="text"><input type="text" name="title" id="title"/>
                    </dt>
                    </dl>
                    <dl class="field nine columns centered">
                <dd><label for="content">Content</label></dd>
                <dt class="textarea">
                <textarea name="content" id="message"></textarea></dt>
                </dl>
                <p class="blacktext">Photo</p>
                <input type="file" name="photo1">
                <input type="submit" id="add article"/>
                </form>

3 个答案:

答案 0 :(得分:1)

试试这段代码:

<?php

session_start();

include_once('../php/connection.php');

if (isset($_SESSION['logged_in'])) {

    if (isset($_POST['title'], $_POST['content'], $_FILES['photo1'])) {

        $title    = $_POST['title'];
        $content  = nl2br($_POST['content']);
        $name     = $_FILES['photo1']['name'];
        $tmp_name = $_FILES['photo1']['tmp_name'];

        $target = '../lifestlye/'.$name;

        if (move_uploaded_file($tmp_name,$target)) {

            $stmt = $pdo->prepare('INSERT INTO article (article_title, article_content, photo_1) VALUES (?,?,?)');
            $stmt->execute(array($title,$content,$name));
            header('Location: index.php');
            exit();

        }

    }

}

答案 1 :(得分:0)

你太简单了。您需要阅读手册页:http://www.php.net/manual/en/features.file-upload.post-method.php

首先,将其作为参数enctype="multipart/form-data"

添加到表单中

然后,了解$ _FILES ['photo1']将是一个数组,$ _FILES ['photo1'] ['tmp_name']将包含一个临时文件名,即上传的文件。然后,您可以将文件移动到新位置,或者将其读取并作为BLOB将其放入数据库(但为什么要将二进制数据保存在数据库中?)

答案 2 :(得分:0)

  1. 您应该使用绝对路径来移动文件。如果您想在当前目录中执行某些操作,请使用__DIR__或dirname(__FILE__),具体取决于您的php版本。第一个是首选,如果它可用。
  2. 你应该做错误检查 - 阅读php.net手册上的$ _FILES数组,了解要注意的事项。
  3. 检查move_uploaded_file的返回值,错误,通知 - 写入权限可能也有问题(目标目录/文件必须由网络服务器写入)
  4. 你应该考虑生成一个文件名,否则如果2个ppl上传一个同名的文件,第二个将覆盖第一个。然后开始关于竞争条件的乐趣和php本身不可能进行原子锁定(使用mysql获取锁定是迄今为止最好的,因为信号量和文件锁定在使用php的web上下文中)
  5. 您应该添加一些安全检查,例如str_replace(“\ 0”,“”,$ filename)用于编码nul中毒(根据您的系统和文件系统,可能还有其他东西需要过滤/检查)
  6. 这只是一个提示,但实际上:如果您没有足够的php / security经验,请不要在公开(例如公开的网址)中对用户输入,特别是文件上传做任何事情。否则你会在很短的时间内看到你的服务器崩溃,接管...... PHP已经非常不安全了,添加mysql和文件上传并没有真正让它变得更好。没有保证您从$ _FILES获得的文件名是安全的 - 攻击者可以发送任何文件名(我可以轻松地使用几行脚本,而且我不是真正的黑客)。
  7. 此外,basename不会过滤文件名,它只会为您提供最后一个'。'之前的内容。

    编辑:+ Palantir所写的一切,为了让它成功(对不起,有很多事情,我跳过了一些)