2013-05-12 18 views
0

我对PHP很陌生,试图将图像上传到服务器,然后使用表单和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> 
+0

可能重复到使用PHP的服务器。将文件名存储在MYSQL数据库中,以及其他配置文件信息](http://stackoverflow.com/questions/450876/upload-image-to-server-using-php-store-file-name-in-a-mysql-数据库与其他) – 2013-05-12 16:05:12

+0

请参阅此:http:// stackoverflow。com/a/16499251/1846562 – mpyw 2013-05-12 16:21:40

回答

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

     } 

    } 

} 
[上传图片的
+0

在尝试将它放到服务器上时完美地工作。我得到这个错误,是因为我没有正确定义目录?警告:move_uploaded_file(../ lifestlye/Shop.png)[function.move-uploaded-file]:无法打开流:没有这样的文件或目录在/home/content/55/10880055/html/admin/add.php在线19 警告:move_uploaded_file()[function.move-uploaded-file]:无法在/ home/content/55/10880055 /中将'/ tmp/php7JHFaJ'移动到'../lifestlye/Shop.png' html/admin/add.php on line 19 – tezzataz 2013-05-12 17:03:47

+0

嗯,'../ lifestyle /'意味着'。/ lifestyle /'?或者这个目录的权限不是** 777 **? – mpyw 2013-05-12 17:18:25

+0

拼写错误抱歉!非常感谢你,现在它工作得很好。最后一个问题,如果我想上传多个文件,例如photo2,我可以制作另一个$ name和$ tmp_name,然后添加它以移动_upload,而不是我?例如(move_upload_file($ tmp_name,$ tmp_name2,$ target)? – tezzataz 2013-05-12 17:35:46

0

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

首先,以此为参数添加到您的窗体:enctype="multipart/form-data"

然后,明白$ _FILES [“照片1”]将是一个数组,$ _FILES ['照片1 '] ['tmp_name']将包含一个临时文件名,它是上传的文件。然后,您可以将文件移动到新位置,或阅读,放入数据库中作为BLOB(但是你为什么要保留的二进制数据在数据库中?)

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

此外,basename不会过滤文件名,它只是给你最后一个'。'之前的任何内容。

编辑:+一切真知晶球中写道,使其工作(对不起,人们对此这么多的事情,我跳过一些)

+0

@palantir谢谢你们,基本上这是针对我为博客制作的一个cms,文件上传基本上是为页面顶部的幻灯片插件上传图片。我想在上传后将数据写入数据库的原因是为了能够使用生成的文件名将其动态输入到幻灯片中,例如, tezzataz 2013-05-12 16:22:06

+0

这是完全没问题/标准,但因为我一直在建立一个新的CMS在过去的两年中,我只能强调自己在这方面的重要性:1.阅读安全性(nul字节中毒,utf8,...)2.阅读竞争条件(例如so你没有2个文件结尾为一个)3.不要相信任何用户输入(甚至更好:永远不要相信任何类型的输入),并因此总是验证,消毒,过滤... – griffin 2013-05-12 16:26:53

+0

这件事不喜欢alt +输入它似乎;)无论如何,你也应该确保无论你上传的文件,没有机会,你1.覆盖现有的文件(我可以通过'../index.php'作为文件名例如,并且您只需追加它!)2.上传的文件不能直接访问,或者至少服务器不会执行它们(想想uploa ding一些backdoor.php文件,然后在我的浏览器中打开/whatever-upload-dir/backdoor.php) – griffin 2013-05-12 16:28:41