2017-04-24 9 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-use-mysql-functions-in-php) 新しいコードでデータベースの拡張子を使用するたびに * * [これは起こります](https://media.giphy.com/media/kg9t6wEQKV7u8/giphy.gif)** これは廃止され、何年も前からPHP7で永久に失われています。 PHPを学んでいるだけなら、 'PDO'や' mysqli'データベースの拡張機能や準備した文を学ぶことができます。 [ここから開始](http://php.net/manual/en/book.pdo.php) – RiggsFolly

+0

あなたのスクリプトは[SQL Injection Attack]の危険にさらされています(http://stackoverflow.com/questions/60174/how -can-i-prevent-sql-injection-in-php) でも [あなたが入力をエスケープしているなら、それは安全ではありません!](http://stackoverflow.com/questions/5741187/sql-injection-that-gets -around-mysql-real-escape-string) [用意されたパラメータ化された文](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

名前を重複しないようにする良い方法は、ファイル名をアップロードの日付に設定することです。既に存在する場合は、ファイル名の最後に - を追加します。 –

関連する問題