質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2782閲覧

PHPのmysqliを使い、MYSQLへの画像の保存

sumomomomomo

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/02/09 03:14

###前提・実現したいこと
php5.6とMYSQLを使って、画像をDBに保存したい。

###該当のソースコード
$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME );
$mysqli->set_charset("utf8");
$img = 'http://xxx.com/xxx.jpg';
$img_link = file_get_contents ( $img );
$img_data = $mysqli->real_escape_string($img_link);
$stmt = $mysqli->prepare("INSERT INTO table1 ( img_col ) VALUE( ? )");
$stmt->bind_param( 'b' , $img_data );
$stmt->execute();
$mysqli->close();
###発生している問題・エラーメッセージ

Parse error: syntax error, unexpected '$mysqli' (T_VARIABLE)

###試したこと
$img_data = $mysqli->real_escape_string($img_link);
エラーの行は上記で表示されます。
上記コメントアウトして別のデータをバインドするとうまくいくので、まずい箇所はそこだと思うのですが、タイプミスでもなく$mysqliも定義しているつもりなので、どこを修正したらいいのかまったくヒントもつかめていません。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

$img_linkはバイナリーデータになっているともいますので、real_escape_string()は不要だと思うのですが。img_colのデータ型がBLOBまたはxxxBLOB型であれば$img_linkの値をそのままDBに登録できるはずです。

投稿2017/02/09 03:35

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumomomomomo

2017/02/09 04:55

ありがとうございます。 該当行ごと削除をしたらエラーは出なくなりました。 しかし、保存をしても画像データが0バイトになっていて、また別の個所が邪魔をしていそうです。絞り込みがまだできていないので、もう少し試してみます。
sumomomomomo

2017/02/09 08:31

該当行の $img_data = $mysqli->real_escape_string($img_link); の削除で何度か試してみましたが、phpmyadmin上で確認しますと画像データが0バイトのままで保存ができていないようです。 エラーメッセージは出ていません。 img_colはmedium_blobで属性はbinaryです。 stringをバインドするとそちらは保存されているのでprepare文のあたりに間違いはなさそうですが、どこがまずいのでしょうか?
turbgraphics200

2017/02/09 08:44

SQLのVALUEとなっているところはVALUESが正しいと思うのですが。
sumomomomomo

2017/02/09 09:10

$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME ); $mysqli->set_charset("utf8"); $img = 'http://xxx.com/xxx.jpg'; $img_link = file_get_contents ( $img ); $stmt = $mysqli->prepare("INSERT INTO table1 ( img_col ) VALUES ( ? )"); $stmt->bind_param( 'b' , $img_link ); $stmt->execute(); $mysqli->close(); 修正してみましたがやはりファイルサイズが0になってしまいます。 if(!img_link)でエラー時にコメントを出力させてみましたが、それもスルーされているのでimg_linkまでは問題なさそうなのですが。
turbgraphics200

2017/02/09 09:23

ちなみに画像サイズはどれくらいなのでしょうか
sumomomomomo

2017/02/09 09:28

10KiBくらいです。 img_linkをechoすると文字列出力されるので中身は入っているようです。
turbgraphics200

2017/02/09 09:48 編集

レコードは追加されるんですよね?
sumomomomomo

2017/02/09 10:17 編集

追加されますがimg_colは0バイトになっています。
turbgraphics200

2017/02/09 10:27

試しに型指定の'b'を's'変更してやってみてください。
sumomomomomo

2017/02/09 10:32

保存できました! バイナリーではなくてテキスト?で保存されてるんですね。 ありがとうございます!
guest

0

助言というよりかは一言。
画像をデータベースに保存させてまた使うときなどに再度表示などさせたいのでしょうか。
そうすると、画像の描画がかなり遅くなりますので、画像を保存させるフォルダを作りそこにパスを通して保存させた方が
描画させる時など処理が早いです。

投稿2017/02/09 06:30

mizugasira

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumomomomomo

2017/02/09 07:13

仰る通り表示に一瞬の間があります。 一度その方法でも試してみます。
guest

0

prepareで処理しているのですから、エスケープ処理は不要でしょう

投稿2017/02/09 03:26

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumomomomomo

2017/02/09 04:53

ありがとうございます。 必要なものかと思っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問