2014-09-12 5 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를 가지며 중복 된 기본 키를 삽입하려고 할 때 DB에 오류가 발생합니다. –

+0

마지막 ID를 얻는 더 좋은 방법 인 "PDO :: lastInsertId"를 사용할 수 있지만 마지막 ID가 필요없는 경우 자동으로 증가시킵니다. –

+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

답변

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/"; 당신이 당신의 서버의 루트에서 코드를 실행하는 것을 가정하고 사용하고 있기 때문에.

그렇지 않은 경우 적절하게 조정해야합니다.

I .: $path = "../uploads/"; 파일 실행 위치에 따라 다릅니다.

통찰력.


(!) 참고 # 2 :

현재의 코드는 SQL injection에게 열려 있습니다. prepared statements 또는 PDO with prepared statements을 사용하십시오.

mysql_* 기능 사용되지 않는다는 알림 :이 확장은 PHP 5.5.0 추천되지 않습니다, 그리고 그것은 미래에서 제거 될 예정으로 새로운 코드를 작성하지 않는 것이 좋습니다

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

. 대신 mysqli 또는 PDO_MySQL 확장자를 사용해야합니다. MySQL API를 선택할 때 추가 도움말은 MySQL API Overview을 참조하십시오.

이 기능을 사용하면 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

+1

@rar 감사합니다. 준비된 진술은 얇게 썬 빵 이후로 가장 좋습니다.) –

관련 문제