2017-04-24 4 views
0

나는 관리자 패널에 업로드 된 뉴스를 표시하는 사이트를 만들고 있습니다.
각 게시물에는 이미지와 제목 (설명이 있지만 아직 구현하지 않았습니다)이 있습니다.
내 문제는 내가 게시하려고 할 때 (그리고 함께 이미지를 업로드 할 때) 게시물이 만들어 지지만 이미지가 존재하지 않는다는 것입니다.업로드 된 파일 (PHP)을 복사 할 수 없습니다.

업 로더 (PHP) :

if (isset($_FILES['image'])) { 

//this script 
//connects to mysql database 
//declares an array that contains table names (array name is db) 
require_once("db.php"); 

//move file to the img folder 
move_uploaded_file($_FILES['image']['tmp_name'], "img/" . $_FILES['image']['tmp_name']); 

//upload the post to the database 
$sql = "INSERT INTO `{$db["posts"]}` (`img`, `text`) VALUES ('img/{$_FILES['image']['tmp_name']}', '{$_POST["text"]}')"; 
if (!mysql_query($sql)) { 
    //display error message 
} 

} 

형태 (HTML)이 :

<form action="post.php" method="POST" enctype="multipart/form-data"> 
    <label>Image: </label><input type="file" name="image" /> 
    <br /> 
    <label>Text: </label><input type="text" name="text" /> 
    <input type="submit" /> 
</form> 

내가 게시 한 후 FTP를 통해 파일을 확인, 이미지가 존재하지 않습니다.

+0

[mysql_'] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-ex-mysql-functions-in-php) 새 코드에서 데이터베이스 확장자를 사용할 때마다 * * [이런] (https://media.giphy.com/media/kg9t6wEQKV7u8/giphy.gif) **는 사용되지 않으며 년간되어 왔으며 PHP7에서 영원히 사라 . PHP를 배우려는 분이라면'PDO' 또는'mysqli' 데이터베이스 확장과 prepared statement를 배우는 데 많은 시간을 할애하십시오. [여기에서 시작] (http://php.net/manual/en/book.pdo.php는) – RiggsFolly

+0

스크립트는 [SQL 주입 공격]의 위험 (http://stackoverflow.com/questions/60174/how에있다 - 수 - 내가-방지-SQL 주입 -에 - PHP를) 에도 [당신이 입력을 탈출하는 경우, 그 안전하지!] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets -around-mysql을 리얼 탈출 문자열) 사용 [매개 변수 제표를 작성 (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

+0

는 PHP 파일 의 상단에 붙여 넣기 'ini_set ('display_errors', 1); ini_set ('display_startup_errors', 1); error_reporting (E_ALL); '오류를 확인하십시오. –

답변

0

$_FILES['image']['tmp_name']/var/tmp/something 같은 절대 경로이다. img/에 연결하면 하위 디렉토리 img//var/tmp/something을 가리키는 경로 이름을 얻게됩니다. 하위 디렉토리가 존재하지 않으므로 move_uploaded_file()이 실패합니다.

당신은 파일 이름의 부분을 얻기 위해 basename()를 사용해야합니다. 이 방법은 임시 파일의 이름을 사용하여 얼마나 안전

$filename = 'img/' . basename($_FILES['image']['tmp_name']); 
move_uploaded_file($_FILES['image']['tmp_name'], $filename); 
$text = mysql_real_escape_string($_POST['text']); 
$sql = "INSERT INTO `{$db["posts"]}` (`img`, `text`) VALUES ('$filename', '$text')"; 

는 그래도 난, 정말 모르겠어요. 다른 업로드에 대해 동일한 이름을 반복하지 않는다는 보장이 없다고 생각합니다.

+0

감사합니다. 작동합니다! 임시 이름을 반복 할 수 있는지 여부를 모르겠다면 확인하고 필요한 경우 변경합니다. –

+0

테스트에서 반복을 볼 수 없을 수도 있습니다. 오랜 기간에만 반복 될 수 있습니다. – Barmar

+0

중복 된 이름을 피하는 좋은 방법은 파일 이름을 업로드 날짜로 설정하는 것입니다. 이미 존재하는 경우 파일 이름의 끝에 (예 : -)를 추가하십시오. –