2014-09-12 145 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