• 締切済み

PHP+MYSQLの画像の書き込み

PHPでMYSQLにblob型へJPGを格納したいのですが、<INPUT type="file" name="file">でPOSTしたのを insert文で$_POST['file']で書き込んでもMYSQLのテーブルを見ても書き込まれていません。 base64でエンコードしないとだめなのでしょうか? 簡単なサンプルが知りたいです。

みんなの回答

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.3

ANo.1です。 バイナリデータを変数に格納するところは問題なさそうですね。 あとは入力する際に何かしらエスケープを噛ましておけば大丈夫だと思うのですが。 どういった問題が発生していますか?

devid
質問者

お礼

もう少しらしいので勉強して分からなければまた質問します。 ありがとうございます。

devid
質問者

補足

これでいいんですか?? 実行する毎にblobには0バイトでオートインデックスが増えていっています。$_FILES["upfile"]["tmp_name"]のtmp_nameは固定なのですか?

全文を見る
すると、全ての回答が全文表示されます。
  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

ANo.1です。 >わかりません。。 マニュアルを見てどこが不明でしたか? それとも何も得られませんでしたか? 何を試してみましたか? 何がうまくいきませんでしたか? 出力ができたから入力もできるということでもないですよ。

devid
質問者

補足

んーバイナリファイルはテキストと違いただ変数に格納するけでは だめなのですか?以下の事をためしましたがだめでした。 'upfile'はinputのnameです。 $fp = fopen($_FILES["upfile"]["tmp_name"], "rb"); $imgdat = fread($fp, filesize($_FILES["upfile"]["tmp_name"])); fclose($fp);

全文を見る
すると、全ての回答が全文表示されます。
  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

とりあえずマニュアルに目を通しておきましょう。 http://www.php.net/manual/ja/features.file-upload.post-method.php

devid
質問者

補足

わかりません。。 $_FILESをなんとかしろということでしょうか? phpmyadminから入れた画像を 読み出すときはヘッダー+print ($row['image']); のみで表示できたのですが、PHPで書き込みが分かりません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPとMySQLを使い、画像データベースを構築しています。

    PHPとMySQLを使い、画像データベースを構築しています。 以下までできたのですが、SQL syntaxエラーが発生してしまい、UP出来ませんでした。 画像を指定しない場合は、成功します。 <form method="post" action="addinfo.php" enctype="multipart/form-data"> Place Name(*)<br> <input type="text" size="50" maxlength="100" name="place_name"><br> Address(*)<br> <input type="text" size="50" maxlength="100" name="address"><br> Pictures<br> <input type="file" size="50" name="picture1"><br> <input type="file" size="50" name="picture2"><br> <input type="file" size="50" name="picture3"><br> <input type="reset" value="Reset" name ="reset"> <input type="submit" value="Submit" name="submit"> </form> <?php if ($_POST["submit"] != "") { // Connecting DB require 'lib.php'; //img1 if ($_FILES["picture1"]["tmp_name"] != NULL) { $fp = fopen($_FILES["picture1"]["tmp_name"], "rb"); if (!$fp) { print("Cannot open the uploaded file <BR>\n"); exit; } $img1 = fread($fp, filesize($_FILES["picture1"]["tmp_name"])); fclose($fp); } ----------------------------------------------------------- img2, img3についての処理もimg1と同じなので、文字数の関係で省略します ----------------------------------------------------------- // Insert Query $sql = "INSERT INTO places (place_name, address, `picture1`, `picture2`, `picture3`) VALUES('{$_POST["place_name"]}','{$_POST["address"]}', '{$img1}', '{$img2}', '{$img3}') "; $result = mysql_query($sql); if (!$result) { print("QUERRY ERROR<BR>\n"); print(mysql_errno() . ": " . mysql_error() . "<BR>\n"); exit; } echo "UPLOAD SUCCESSFULL "; ご教授お願いいたします

    • ベストアンサー
    • MySQL
  • ファイルのアップロード mysql

    現在PHPを使いファイルのアップロードをしようとしているのですが 途中でいきずまってしまいました。自分がしたいことですが フォームからファイル(画像:jpgのみ)をMYSQLにアップロードし、必要に応じてその画像を出力するということです。また画像のサイズも決めてそれ以上ならエラーを出すということです。こちらが今あるスクリプトになります。 途中まではなんとなく分かったのですがどうしても続きが分かりません。 ちなみにphp.iniの設定は色々調べたのであっていると思います。 またMYSQLのカラムはBLOBになっており、下記にinsert into~の文もあります。 form.php <form name="order" action="form.php" method="post" enctype="multipart/form-data"> <input name="MAX_FILE_SIZE" type="hidden" value="1000000" /> <input name="uploadfile" type="file" size="60" /> </form> <?php $uploadfile_name = $_FILES["uploadfile"]["name"]; $uploadfile_tmp_name = $_FILES["uploadfile"]["tmp_name"]; $uploadfile_size = $_FILES["uploadfile"]["size"]; if (strlen($uploadfile_name) > 0 ) { $fileinfo = pathinfo($uploadfile_name); $fileext = strtoupper($fileinfo["extension"]); $err_msg = ""; //ファイルのサイズチェック if ($uploadfile_size > 1000000 ) { $err_msg .= "テキストファイルが大きすぎます。1MB以下にして下さい。<br />"; } //ファイルの拡張子チェック elseif ($fileext != "jpg") { $err_msg .= ".jpg形式以外のファイルは登録できません。<br />"; } if( //どのようにしれMYSQLに保存するのかここら辺から分からなくなっています。 } } } $sql = "insert into ccc values('$upload_file')"; どなたかご存知の方おりましたらお伺い出来ませんでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHP+MySQLでのINSERTについての質問です。

    insert.html(入力フォーム)で <input type="text" name="company_nm" size="80"> を <form name="form1" method="post" action="insert_kakunin.php"> <input type="submit" value=" 次 へ "> で送って insert_kakunin.php(確認画面)で <input type="hidden" name="company_nm" value="<?= $company_nm ?>"> <?php print $_POST["company_nm"]; ?> で表示させます。 それを <form name="form1" method="post" action="insert.php"> <input type="submit" value=" 決 定 "> で insert.php(DB処理)で DB接続した後に $sql='INSERT INTO Sample (company_nm) VALUES("'.$_POST['company_nm'].'"); というふうにINSERTしたいんですが、VALUESに入力した値が入りません。 print $sql; print ($_POST['company_nm']); で見ても「""」となっています。 値の渡し方を教えてください。

    • ベストアンサー
    • PHP
  • PHPを使って、1ページ内で新規レコードと画像アップロードしたいのですが・・・

    PHP4、MySQL4初心者です。 今回、会員名簿のDBをつくり、PHPを使って、管理者が新規会員(レコード)を登録できるようにプログラミングしています。 フィールドは、「ID」「名前」「住所」「コメント」等の数字や文字データばかりでしたが、今回会員の写真(jpg)データも新規会員登録画面で一緒に登録できるようにして欲しいと要望があり、色々調べておりますが四苦八苦しております・・・ 基本的な構造としましては・・・ HTMLファイルにformタグを使って、入力してもらったデータをpostで飛ばして、別ファイル(php)でsql文を書いて、insertしている形です。 その際に一緒に画像も、sbumitする際に所定のフォルダにアップロードして、そのファイル名をimg_id.jpg みたいな形で接頭語とidをくっつけて、作成して、その画像ファイル名をさらに、DBのフィールド”img_name”に登録したいのです。 画像はBLOBでDBにアップではなく、あくまでFTPで後で入って処理しやすいように、public以下のフォルダ内に特定のフォルダを作成してそこにアップしたいと思います。 1ページ以内で処理するということで、かなり困っていますが、いい方法はないでしょうか・・・? みなさん! どうかお知恵をお貸しくださいませ!! ちなみに現在できている登録のコードはこちらです。 -------------(HTML)------------------------------------- <html> <body> <h2>新規会員登録</h2> <form action="insert.php" method="post"> ■会員名 :<input type="text" name="input_name" /><br> ■住 所 :<input type="text" name="input_addr" /><br> ■コメント:<input type="text" name="input_comm" /><br> <input type="submit" value="-- 登録する --" /> </form> </body> </html> -------------(HTML)------------------------------------- -------------(PHP:insert.php)-------------------------- <? $db = mysql_connect("localhost","ユーザー名","パスワード"); mysql_select_db("データベース名"); $query = "set NAMES euc"; $result = mysql_query($query); // ここで、HTMLフォームの中のinputタグに対応したデータを取得 $name= $_POST["input_name"]; $addr= $_POST["input_addr"]; $comm= $_POST["input_comm"]; $query = "insert into テーブル名(name,addr,comm) values ('$name','$addr','$comm')"; $result = mysql_query($query); mysql_close($db); ?> <html> </head> <body> <h2>新規会員登録</h2> <p>データ登録完了</p> </body> </html> -------------(PHP)-------------------------------------- phpで画像をアップロードするときは formの中に ”enctype=\"multipart/form-data”を入れたり、 ”move_uploaded_file”を使ったりと、断片的には知識はありますが、 体系的に理解できません・・・ どなたか、アドバイス頂けましたら幸いです。 あるいは、解説してあるサイトや、フリーのサンプルスクリプト等教えて頂けましたら助かります・・! どうぞ、どうぞよろしくお願い致します!!

  • エクセルをMysqlに格納

    いつもお世話になっております。 Linux,mysql,PHP,apacheの環境で試しているのですが、 エクセルデータをアップロードし、MysqlのBLOB型に格納したいと思っております。また、格納したMysqlのエクセルデータをダウンロードできる流れを考えております。 テンポラリファイルをそのままINSERTするとデータは格納されるのですが、抽出したときに文字化けしてしまいます。 エンコード方法など何か指定するのかと思うのですが 調べたのですが見つかりませんでした。 内部エンコードはEUCになっています。 説明不足な点があるかと思いますが、ご教授お願いします。 /*insert時*/ $localfile = file_get_contents($_FILES['userfile']['tmp_name']); $sql = "INSERT INTO TABLE (fileup) VALUES '".$localfile ."'"; /*ダウンロード時*/ header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: inline; filename=\"".date('Ymd')."list.xls\""); echo $binary;//selectで抽出した時のデータ

    • 締切済み
    • PHP
  • phpとmysqlで出欠確認

    phpとmysqlを使い、出欠確認アプリのようなものを作りたいです。 操作としては 1.画面上で名前を選ぶ(タイプする) 2.確認画面がでてokを押す 3.出席登録しました このような簡単のものなのですが、phpの流れについて確認したいです。 管理者側で誰がいつ出席登録したか、また日付ごとに検索ができ、何月何日に誰が出席したか確認したいです。 その際に流れなのですが、 1で記入してもらった名前をsubmitで送信し、その内容をphpファイルに送る その後そのファイル内で、name,createdとしてmysqlに値を格納する。nameは名前、createdはボタンが押された時の時間を格納 これで登録はできるかと思いますがどうでしょうか? php初心者のため、まずは流れから質問させてもらいました。 phpの内容ですが、 dbに接続する selectでテーブルを選択する insertで指定したテーブルにPOSTで受け取った値を格納する dbを切断する このような流れでよろしいでしょうか? 管理者側日付ごとに検索するプログラムを書くときはその際にまた質問させていただこうと考えております。 また名前などのデータはPOSTメソッドでの受け渡しで良いのでしょうか?

    • 締切済み
    • PHP
  • PHP/MySQL SQLエラーについて。

    PHP/MySQLについての質問です。 当方PHP/MySQLについては初心者で、現在参考書を見ながらWebアプリケーションを作成しています。 いくらやっても成功しない例があるので、どこが間違っているのか、 なぜ成功しないのかご教示願いたいです。 エラー名:SQL実行エラー 要因:不明。SQL文を変えたりしたところ成功したこともあるので(elect id,name,age from input_table 等)SQL文に間違いがあるのか? -------------------input.html------------------------ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <form action="input.php" method="post"> 名前:<input type="text" name="nm"> 年齢:<input type="text" name="age"> <input type="submit" name="exec" value="登録"> </form> </body> </html> -----------------------input.php---------------------------- <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php //DB接続 if(!$con=mysql_connect("localhost","root","********")){ //passwardは正確 echo"接続エラー"; exit; } //DB選択 if(!mysql_select_db("input",$con)){ echo"DB選択エラー"; exit; } $sql = "insert into input_table(name,age) values('$nm',$age)"; if(!$res=mysql_query($sql)){ echo"SQL実行エラー"; //ここでこのエラーが表示されてしまう exit; } echo "登録完了"; mysql_close($con); ?> </body> </html> --------------------database----------------------- create table input_table( id int not null auto_increment, name varchar(20) not null, age int not null, primary key(id) )

    • ベストアンサー
    • PHP
  • 【PHP・MySQL】一文字だけ抜き出したい

    php・MySQL初心者です。 何とかここまで自力でやってこれたのですが、もうお手上げで…。 サンプルコードを解析し、部分的に理解しながら進んでる状態です。 やりたいことは、 「ユーザーが入力した文字列の最後の1文字だけを抜き出し、データベースに代入する」です。 ←(2) ちなみに、 「ユーザーが入力した文字列をそのまま、データベースに代入する」はできました。←(1) 参考に、(1)のソースコードの一部を書きます。 ------------------------------------------- 『main.php』 <form action="result.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="<?= $file_maxsize ?>"> タイトル:<INPUT type="text" name="title" size="50"><br> コメント:<INPUT type="text" name="comment" size="50"><br> <input type="submit" value="送信"> </form><hr> ------------------------------------------- 『result.php』 $comment = @trim($_REQUEST['comment']); //※ $query = "insert into main_t (comment, last)" . " values ('$comment', '$last')"; $result = mysql_query($query); ------------------------------------------- だいたいこんな感じで(1)は出来ました。 (関係がありそうなところだけを抜き出したつもりです…) 『main.php』で出力して確認もしました。 (2)の現状の私のコードを書きます。 ------------------------------------------- 『result.php』 $x = mysql_query("select right('$title', 1)"); $last = mysql_fetch_assoc($x); ------------------------------------------- これを(1)の //※  の部分に記述してみましたが、うまくいきません。 出力するとなぜか「Ar」と出てきます…泣 『select right('いちもじ', 1)』で『じ』とちゃんと右一文字が取り出せるのをbatファイル?みたいなので確認しました。 このSQL文をPHP内で行いたいのですが、やり方がわかりません…。 (そもそも根本的に間違っているのでしょうか…) $x = mysql_query("select * from ○○ where 条件"); $last = mysql_fetch_assoc($x); みたいにfromで検索先や条件を指定して得た「配列」を取得し、表示する方法はネット検索で沢山見つかったのですが、fromやwhereを使わず、結果も配列ではなく1つだけ得られるような場合は、どうすればよいのでしょうか? わかりづらい文章ですみません; 難しい質問かとは思いますが、PHPやMySQLに詳しい方がいましたら、是非ともご教授いただけたらと思います。 よろしくお願いいたします。

  • BLOBでの画像表示について

    BLOBでの画像表示について質問させてください。 元々ヘテムルのサーバーを利用していたのをここ最近さくらのVPSに移行しました。 するとヘテムルではBlob型の画像表示が正常に表示されていたものがサクラのVPSにて画像表示がされなくなってしまいました。 mysqlのバージョンやphpinfoの設定などを限りなくヘテムルに近づけたのですが正常に表示されないため詰まってしまいました。 各ブラウザで、以下のような状況です。 IE:表示されない Chrome:表示されない Firefox:画像ファイル"http://~/image.php?id=544"は壊れているため、表示できませんでした。 以下質問用にソースを書き換えたものですが、ご教授頂ければと思います。 質問用ソースで動作させて同じ様に画像が出ないことは確認しています。 質問用ソースの構造は以下の通りです。 form.html ↓ファイルをPOST upload.php ↓データをINSERT MySQLのthumbnailテーブル ↓データをSELECT image.php ■form.html■ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> ファイル:<br /> <input type="file" name="upfile" size="30" /><br /> <br /> <input type="submit" value="アップロード" /> </form> </body> </html> ■upload.php■ <?php include_once(dirname(__FILE__) . "/admin/common/functions.php"); include_once(dirname(__FILE__) . "/admin/common/db_functions.php"); // MySQL に接続し、データベースを選択します。 dbConnect(); global $_G_DbConnection; $message = "ファイルが選択されていません。"; //サムネイル1 if (is_uploaded_file($_FILES["upfile"]["tmp_name"]) && !empty($_FILES["upfile"]["name"])){ $contents = file_get_contents($_FILES["upfile"]["tmp_name"]); $contents = base64_encode($contents); $contents = mysql_real_escape_string($contents,$_G_DbConnection); $post_thumbnail1 = $contents; $post_thumbnail1_name = $_FILES["upfile"]["name"]; } mysql_query("SET AUTOCOMMIT=0"); mysql_query("BEGIN"); // サムネイル1 $post_thumbnail1_id = null; if (!empty($post_thumbnail1_name)) { $sql = "INSERT INTO `thumbnail` ("; $sql .= "`filename`,`thumbnail`)"; $sql .= " values('$post_thumbnail1_name', '{$post_thumbnail1}')"; if (!(mysql_query($sql))) { mysql_query("ROLLBACK"); $message = "ファイルをアップロードできません。"; } else { $post_thumbnail1_id = mysql_insert_id(); mysql_query("COMMIT"); $message = $post_thumbnail1_name . "をアップロードしました。"; } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?=$message; ?></p> <img src="image.php?id=<?=$post_thumbnail1_id; ?>"> </body> </html> ■image.php■ <?php include_once(dirname(__FILE__) . "/admin/common/functions.php"); include_once(dirname(__FILE__) . "/admin/common/db_functions.php"); // MySQL に接続し、データベースを選択します。 dbConnect(); global $_G_DbConnection; //ID $get_id = null; if (isset($_GET['id'])){ $get_id = $_GET['id']; // MySQL 問い合わせテスト $sql = "select * from `thumbnail`"; $con = " where id = " . $get_id; if (!($rs = mysql_query($sql . $con))) { echo "MySQL 問い合わせエラー"; echo $sql . $con; die; } while ($row = mysql_fetch_array($rs)) { // 出力 $ext = substr($row['filename'], strrpos($row['filename'], '.') + 1); if (is_null(get_content_type($ext))) { echo "ファイル取得エラー"; } else { header('Content-type: ' .get_content_type($ext)); echo base64_decode($row['thumbnail']); } } dbFreeResult($rs); } ?> ■thumbnailテーブル■phpMyadminよりエクスポート CREATE TABLE IF NOT EXISTS `thumbnail` ( `id` int(11) NOT NULL AUTO_INCREMENT, `filename` varchar(255) DEFAULT NULL, `thumbnail` longblob NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=545 ; □中身のデータ□ INSERT INTO `thumbnail` (`id`, `filename`, `thumbnail`) VALUES (544, 'SH3D0054.jpg', 0x2f~2f5a);  ←[BLOB - 17.3 KiB] INSERT INTO `thumbnail` (`id`, `filename`, `thumbnail`) VALUES (543, 'ねむネコ.bmp', 0x51~413d); ← [BLOB - 234.9 KiB] 長くなってしまいましたが、ご教授お願い致します。

    • 締切済み
    • PHP
  • phpからmysqlにデータ保存(テキストと画像)

    登録フォームを作成し、PHPにてMYSQLに情報を保存しようとしています。 テキストデータは問題なく保存できるのですが、画像データが保存できません。 いろいろ調べているのですが、テキストデータと画像データをいっぺんに保存する方法がわかりません。 なんとなくはどこらへんが問題なのかということはわかるのですが、具体的にどうすればいいかがわかりません。 アドバイスをご教示いただけないでしょうか。よろしくお願いします。 【mysqlテーブル】 create table entries ( id int not null auto_increment primary key, name varchar(255), address varchar(255), image1 MEDIUMBLOB NOT NULL, image1 MEDIUMBLOB NOT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 【touroku.php】 <?php error_reporting(E_ALL & ~E_NOTICE); if ($_SERVER['REQUEST_METHOD']=="POST") { $name = $_POST['name']; $email = $_POST['email']; $image1 = $_POST['image1']; $image2 = $_POST['image2']; $error = array(); // エラー処理 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $error['email'] = 'メールアドレスが正しくありません'; } if ($email == '') { $error['email'] = 'メールアドレスが入力されていません'; } // エラーがなかった場合 if (empty($error)) { // DBにデータを入れる mysql_connect("localhost", "ユーザー名", "パスワード") or die("can't connect to DB: ".mysql_error()); mysql_select_db("DB名") or die("can't select to DB: ".mysql_error()); $q = sprintf("insert into entries (name, email, image1, image2) values ('%s', '%s', '%s', '%s')", mysql_real_escape_string($name), mysql_real_escape_string($email), mysql_real_escape_string($image1), mysql_real_escape_string($image2)); mysql_query($q) or die("can't run query: ".mysql_error()); // 登録完了画面に飛ぶ header("Location: http://localhost/.../thanks.html"); } } ?> <!DOCTYPE html> <html lang="ja"> <meta charset="UTF-8"> <title>登録フォーム</title> <head> </head> <body> <form method="post" action=""> <p>名前:</p> <input type="text" name="name" value="<?php echo htmlspecialchars($name); ?>"> <?php if ($error['name']) echo $error['name']; ?> <p>メールアドレス</p> <input type="text" name="email" value="<?php echo htmlspecialchars($email); ?>"> <?php if ($error['email']) echo $error['email']; ?> <br> <p>画像1:</p> <input type="file" name="image1"> <p>画像2:</p> <input type="file" name="image2"> <p><input type="submit" value="登録"></p> </form> </body> </html>

    • ベストアンサー
    • PHP