2013-05-12 76 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