0

我对 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>
4

3 回答 3

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();

        }

    }

}
于 2013-05-12T16:49:35.633 回答
0

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

首先,将此作为参数添加到您的表单中:enctype="multipart/form-data"

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

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

此外,basename 不会过滤文件名,它只会为您提供最后一个 '.' 之前的内容。

编辑:+ Palantir 写的所有东西,让它发挥作用(抱歉,这上面有很多东西我跳过了一些)

于 2013-05-12T16:11:31.593 回答