web-dev-qa-db-ja.com

PHPコードを使用して画像をMySQLデータベースにアップロードする方法

HTMLフォームからデータベースに画像を保存しようとしています。このタスクを実行するPHPコードを作成しました。プログラムはエラーメッセージを生成しませんが、MySQLデータベースに画像データを挿入しません。親切に確認してください。ここで、コードからの抜粋を共有しています。

        /*-------------------
    IMAGE QUERY 
    ---------------*/


    $file   =$_FILES['image']['tmp_name'];
    if(!isset($file))
    {
      echo 'Please select an Image';
    }
    else 
    {
       $image_check = getimagesize($_FILES['image']['tmp_name']);
       if($image_check==false)
       {
        echo 'Not a Valid Image';
       }
       else
       {
        $image = file_get_contents ($_FILES['image']['tmp_name']);
        $image_name = $_FILES['image']['name'];
        if ($image_query = mysql_query ("insert into product_images values (1,'$image_name',$image )"))
        {
          echo $current_id;
         //echo 'Successfull';
        }
        else
        {
          echo mysql_error();
        }
       }
   }
        /*-----------------
    IMAGE QUERY END
    ---------------------*/

    <form action='insert_product.php' method='POST' enctype='multipart/form-data' ></br>
            File        : <input type='file' name= 'image' >
    </form>

エラーメッセージSQL構文にエラーがあります。行1で ''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

22
Taha Kirmani

まず、image列がBLOBタイプかどうかを確認する必要があります!

SQLテーブルについては何も知りませんが、例として自分で作成しようとする場合。

フィールドid(int)、image(blob)、およびimage_name(varchar(64))を取得しました。

したがって、コードは次のようになります(IDが常に「1」であるとし、このmysql_queryを使用しましょう):

$image = addslashes(file_get_contents($_FILES['image']['tmp_name'])); //SQL Injection defence!
$image_name = addslashes($_FILES['image']['name']);
$sql = "INSERT INTO `product_images` (`id`, `image`, `image_name`) VALUES ('1', '{$image}', '{$image_name}')";
if (!mysql_query($sql)) { // Error handling
    echo "Something went wrong! :("; 
}

あなたは多くの点で間違っています。 mysql関数を使用しないでください-それらは非推奨です! PDO または MySQLi を使用します。ファイルの場所をディスクに保存することも考慮する必要があります。 MySQLを使用して画像を保存することは、Bad Idea™と考えられています。画像などのビッグデータを含むSQLテーブルの処理には問題があります。

また、HTMLフォームは規格外です。次のようになります。

<form action="insert_product.php" method="POST" enctype="multipart/form-data">
    <label>File: </label><input type="file" name="image" />
    <input type="submit" />
</form>

サイドノート:

ファイルを処理してBLOBとして保存する場合、データは mysql_real_escape_string() を使用してエスケープする必要があります。そうしないと、構文エラーが発生します。

41
Wiktor Mociun

ほんの少しの詳細

  • Mysqlフィールドを追加

`image` blob

  • 画像からデータを取得する

$image = addslashes(file_get_contents($_FILES['image']['tmp_name']));

  • 画像データをdbに挿入する

$sql = "INSERT INTO `product_images` (`id`, `image`) VALUES ('1', '{$image}')";

  • 画像をウェブに表示

<img src="data:image/png;base64,'.base64_encode($row['image']).'">

  • 終わり
18
Sean