2014-09-12 143 views
-1

我試圖上傳圖片到MySQL,當我嘗試使用這段代碼,它似乎只是插入數據庫,但沒有圖像文件名上傳到我的服務器,我可以知道什麼地方出錯上傳圖片到MySQL PHP

<form method="post" action=""> 
    <?php 
    include ("setting/connect.php"); 
    $g = mysql_query("select max(id) from abc"); 
    while($id=mysql_fetch_array($g)) 
    { 
    ?> 
    <input type="text" name="id" value="<?php echo $id[0]+1; ?>" hidden/> 
    <?php } 
    ?> 


    <div class="form-group"> 
     <label>Image</label> 
     <input name="image" type="file"> 
    </div> 

    <div class="form-group input-group"> 
     <span class="input-group-addon">Title</span> 
     <input name="title" type="text" class="form-control" placeholder=""> 
    </div> 

    <center><input class="btn btn-primary" type="submit" name="cmdadd" value="ADD" /> 
    <button type="button" class="btn btn-danger">BACK</button></center> 
    </div> 
    <!-- /.panel-body --> 
</form> 

我的PHP:從這個

<?php 
     $id = $_POST['id']; 
     $title= trim($_POST['title']); 
    $path = "uploads/"; 
     $tmp_name = $_FILES['image']['tmp_name']; 
     $name = $_FILES['image']['name']; 
    if(isset($_POST['cmdadd'])){ 
     if(empty($id)||empty($title)) 
     { 
      echo "<center>Error!</center>"; 
     } 
    if($_FILES["image"]["error"] > 0) 
     { 
      echo "<font size = '5'><font color=\"#e31919\">Error: NO CHOSEN FILE <br />"; 
      echo"<p><font size = '5'><font color=\"#e31919\">INSERT TO DATABASE FAILED"; 

     } 


    else{ 

     move_uploaded_file($tmp_name,$path.$name); 
     $file="uploads/".$name; 
     include "setting/connect.php"; 
     mysql_query("SET NAMES 'UTF8'"); 
     $i = mysql_query("insert into abc values ('".$id."','".$file."','".$title."')"); 
     if($i==true){ 
     echo '<META HTTP-EQUIV="Refresh" Content="0; URL=danhsachtindang.php">'; 
        } 
      //if($i==true){ 
      //header('Location:index.php'); 
      //exit; 
      //mysql_close(); 
      //} 
     } 
    } 
    ?> 

結果:當我嘗試上傳例如,picture.jpg,在mysql表,它僅在列出來「化身/」並沒有任何上傳到服務器。

+0

你得到最後一個ID的方式,然後增加它是不好的。如果這個腳本是由兩個客戶端同時運行的,你會得到ID衝突。一個客戶端將獲得最大ID並將其增加,然後當他們在窗體上工作時,另一個用戶將獲得相同的ID和相同的遞增值。第一個用戶的表單將會成功,第二個用戶將擁有相同的ID,並且您將嘗試插入重複的主鍵,從而導致數據庫失敗。 – 2014-09-12 14:45:04

+0

您可以使用「PDO :: lastInsertId」這是獲取最後一個ID的更好方法,但如果您不需要最後一個ID,請讓它自動遞增。 – 2014-09-12 14:45:54

+0

**不再支持** mysql_ *'函數,它們是[**官方不推薦使用的**](https://wiki.php.net/rfc/mysql_deprecation),**不再維護**並且將來會[**刪除**](http://php.net/manual/en/function.mysql-connect.php#warning)。您應該使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli)更新您的代碼,以確保您的項目未來的功能。 – Kermit 2014-09-12 14:49:53

回答

3

您的表單缺少enctype="multipart/form-data"上傳文件時需要。

將其修改爲已讀:

<form method="post" action="" enctype="multipart/form-data"> 

諮詢手冊:http://php.net/manual/en/function.move-uploaded-file.php

還要確保該文件夾已設置寫入適當的權限。

  • 請參閱PHP.net上的chmod以獲取有關設置文件夾/文件權限的更多信息。

旁註#1:

由於您使用$path = "uploads/";我假設你是從你的服務器的根目錄運行代碼。

如果不是這種情況,您需要相應地進行調整。

即時通訊:$path = "../uploads/";取決於您的文件執行的位置。

只是見識


旁註#2:

你現在的代碼是開放的SQL injection。使用prepared statementsPDO with prepared statements

mysql_*功能已取消通知:

http://www.php.net/manual/en/intro.mysql.php

這個擴展不贊成PHP 5.5.0,並且不建議用於編寫新的代碼,因爲它會在將來被移除。應該使用mysqliPDO_MySQL擴展名。請參閱MySQL API Overview以獲取進一步幫助,同時選擇MySQL API。

這些函數允許您訪問MySQL數據庫服務器。有關MySQL的更多信息,請參閱»http://www.mysql.com/

MySQL的文檔可在»http://dev.mysql.com/doc/找到。


error reporting添加到您的文件的頂部,這將有助於生產測試。

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

只在列出來「化身/」,並沒有任何東西上傳到服務器

你們是不是要上傳到avatars/uploads/

檢查一下。

+2

每當我看到有人建議拋棄'mysql_ *'時,我都會保持upvoting。 – muttley91 2014-09-12 14:44:53

+1

@rar謝謝。準備好的陳述是自切片面包以來最好的;) – 2014-09-12 14:45:49