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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1011閲覧

MySQLにバイナリデータ(画像)がインサート(アップロード)出来ない

scrollman

総合スコア83

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/28 01:37

やりたいこと

HTMLフォームで選択された画像ファイルをMySQLにインサート/アップロードしたいのですが以下のコードでやるとインサートされません。
打開策を教えていただければ幸いです。
※おそらく関係ないと思いますが、Wordpressで開発しております。関係ないと思うのでWordpressタグを入れてません。

php

1<?php 2echo '<br>'; 3echo <<<HTML 4<form action="" method="post" accept-charset="UTF-8" enctype="multipart/form-data"> 5 <table> 6 <tr> 7 <td><label>DNA/ID</td> 8 <td><input type="text" name="dna_id" size="40" value=""></label></td> 9 </tr> 10 <tr> 11 <td><label>亜科</td> 12 <td><input type="text" name="subfamily_latin" size="40" value=""></label></td> 13 </tr> 14 <tr> 15 <td><label>亜科(英)</td> 16 <td><input type="text" name="subfamily" size="40" value=""></label></td> 17 </tr> 18 <tr> 19 <td><label>族</td> 20 <td><input type="text" name="family_latin" size="40" value=""></label></td> 21 </tr> 22 <tr> 23 <td><label>族(英)</td> 24 <td><input type="text" name="family" size="40" value=""></label></td> 25 </tr> 26 <tr> 27 <td><label>属</td> 28 <td><input type="text" name="genus" size="40" value=""></label></td> 29 </tr> 30 <tr> 31 <td><label>種</td> 32 <td><input type="text" name="species" size="40" value=""></label></td> 33 </tr> 34 <tr> 35 <td><label>和名</td> 36 <td><input type="text" name="Japanese_name" size="40" value=""></label></td> 37 </tr> 38 <tr> 39 <td><label>命名者</td> 40 <td><input type="text" name="nominee" size="40" value=""></label></td> 41 </tr> 42 <tr> 43 <td><label>分布</td> 44 <td><input type="text" name="distribution" size="40" value=""></label></td> 45 </tr> 46 <tr> 47 <td><label>サイズ(小)</td> 48 <td><input type="text" name="size_s" size="40" value=""></label></td> 49 <td><label>サイズ(大)</td> 50 <td><input type="text" name="size_l" size="40" value=""></label></td> 51 </tr> 52 <tr> 53 <td><label>情報</td> 54 <td><input type="text" name="information" size="40" value=""></label></td> 55 </tr> 56 <tr> 57 <td><label>写真</td> 58 <td><input type="file" name="picture"></label></td> 59 </tr> 60 <tr> 61 <td><label>写真情報</td> 62 <td><input type="text" name="picture_info" size="40" value=""></label></td> 63 </tr> 64 <tr> 65 <td><label>標本データ</td> 66 <td><input type="file" name="specimen_data"></label></td> 67 </tr> 68 </table> 69 <input type="submit" value="送信" class="button button-primary"> 70</form> 71HTML; 72 73$k_1 = $_POST['dna_id']; 74$k_2 = $_POST['subfamily_latin']; 75$k_3 = $_POST['subfamily']; 76$k_4 = $_POST['family_latin']; 77$k_5 = $_POST['family']; 78$k_6 = $_POST['genus']; 79$k_7 = $_POST['species']; 80$k_8 = $_POST['Japanese_name']; 81$k_9 = $_POST['nominee']; 82$k_10 = $_POST['distribution']; 83$k_11 = $_POST['size_s']; 84$k_12 = $_POST['size_l']; 85$k_13 = $_POST['information']; 86$k_14 = $_POST['picture']; 87$k_15 = $_POST['picture_info']; 88$k_16 = $_POST['specimen_data']; 89$t_1 = ""; 90 91echo '<br>'; 92var_dump($k_1); 93echo '<br>'; 94var_dump($k_2); 95echo '<br>'; 96var_dump($k_3); 97echo '<br>'; 98var_dump($k_4); 99echo '<br>'; 100var_dump($k_5); 101echo '<br>'; 102var_dump($k_6); 103echo '<br>'; 104var_dump($k_7); 105echo '<br>'; 106var_dump($k_8); 107echo '<br>'; 108var_dump($k_9); 109echo '<br>'; 110var_dump($k_10); 111echo '<br>'; 112var_dump($k_11); 113echo '<br>'; 114var_dump($k_12); 115echo '<br>'; 116var_dump($k_13); 117echo '<br>'; 118var_dump($k_14); 119echo '<br>'; 120var_dump($k_15); 121echo '<br>'; 122var_dump($k_16); 123echo '<br>'; 124 125if (is_null($k_1) && is_null($k_2) && is_null($k_3) && is_null($k_4) && is_null($k_5) && is_null($k_6) && is_null($k_7) && is_null($k_8) && is_null($k_9) && is_null($k_10) && is_null($k_11) && is_null($k_12) && is_null($k_13) && is_null($k_14) && is_null($k_15) && is_null($k_16)): 126 echo '情報を入力してください'; 127elseif ( $k_1 == $t_1 && $k_2 == $t_1 && $k_3 == $t_1 && $k_4 == $t_1 && $k_5 == $t_1 && $k_6 == $t_1 && $k_7 == $t_1 && $k_8 == $t_1 && $k_9 == $t_1 && $k_10 == $t_1 && $k_11 == $t_1 && $k_12 == $t_1 && $k_13 == $t_1 && $k_14 == $t_1 && $k_15 == $t_1 && $k_16 == $t_1 ): 128 echo '情報を入力しなければ送信できません'; 129elseif ($k_1 != $t_1 && $k_2 != $t_1 && $k_3 != $t_1 && $k_4 != $t_1 && $k_5 != $t_1 && $k_6 != $t_1 && $k_7 != $t_1 && $k_8 != $t_1 && $k_9 != $t_1 && $k_10 != $t_1 && $k_11 != $t_1 && $k_12 != $t_1 && $k_13 != $t_1 &&/* $k_14 != $t_1 &&*/ $k_15 != $t_1/* && $k_16 != $t_1*/): 130 //$t_2 = file_get_contents($_FILES['picture']); 131 $k_14 = file_get_contents($_FILES['picture']['tmp_name']); 132 $k_16 = file_get_contents($_FILES['specimen_data']['tmp_name']); 133 //var_dump($t_2); 134 //$k_14 = 't'; 135 //$k_16 = 't'; 136 /* 137 echo '<br>'; 138 var_dump($k_14); 139 echo '<br>'; 140 var_dump($k_16); 141 echo '<br>'; 142 */ 143 /* 144 $sql = "INSERT INTO kometuki 145 ( dba_id, subfamily_latin ) 146 VALUES 147 ( 1, '18' ) 148 "; 149 db_connection($sql); 150 */ 151 $host = my_database('host'); 152 $schema = my_database('schema'); 153 $id = my_database('id'); 154 $pass = my_database('pass'); 155 // 変数の初期化 156 $sql = null; 157 $res = null; 158 $dbh = null; 159 try { 160 // DBへ接続 161 $dbh = new PDO("mysql:host=$host; dbname=$schema; charset=utf8", "$id", "$pass"); 162 // SQL作成 163 $sql = "INSERT INTO kometuki 164 ( dba_id, subfamily_latin, subfamily, family_latin, family, genus, species, Japanese_name, nominee, distribution, size_s, size_l, information, picture, picture_info, specimen_data ) 165 VALUES 166 ( $k_1, $k_2, $k_3, $k_4, $k_5, $k_6, $k_7, $k_8, $k_9, $k_10, $k_11, $k_12, $k_13, $k_14, $k_15, $k_16 ) 167 "; 168 // SQL実行 169 $res = $dbh->query($sql); 170 echo '情報は追加されました'; 171 } catch(PDOException $e) { echo $e->getMessage(); die();} 172 // 接続を閉じる 173 $dbh = null; 174 175elseif ( $k_1 != $t_1 or $k_2 != $t_1 or $k_3 != $t_1 or $k_4 != $t_1 or $k_5 != $t_1 or $k_6 != $t_1 or $k_7 != $t_1 or $k_8 != $t_1 or $k_9 != $t_1 or $k_10 != $t_1 or $k_11 != $t_1 or $k_12 != $t_1 or $k_13 != $t_1 or $k_14 != $t_1 or $k_15 != $t_1 or $k_16 != $t_1 ): 176 echo '情報が一部のみしか入力されていません'; 177else: 178 echo '原因不明のエラーが発生しました。システム構築者へご連絡ください。'; 179endif;

MySQLの情報

イメージ説明
※参考になれば幸いです…

やってみたこと/実験

上のコードではコメントアウトされていますが、

PHP

1 echo '<br>'; 2 var_dump($k_14); 3 echo '<br>'; 4 var_dump($k_16); 5 echo '<br>';

でk_14とk_16に入っている中身を表示しようとしてみたところ、文字化けしてる文字の羅列が大量に表示されたのでしっかり格納されているはずです。

また、画像ファイルが格納されているk_14とk_16を除外した上でインサートしてみるとちゃんとMySQLにインサートされるので、やはりk_14とk_16の問題なようです。

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

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

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

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

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

n_takapyon

2018/09/28 01:44

インサートエラーは出てないですか?エラーログを確認すると原因が割りやすいと思います。
scrollman

2018/09/28 17:42 編集

字数制限で質問が更新出来なかったのでここでお答えします。質問時のコードではエラーが表示されませんでしたが、yambejpさんの助言に従い $sql = $dbh->prepare("INSERT INTO kometuki ( dba_id, subfamily_latin, subfamily, family_latin, family, genus, species, Japanese_name, nominee, distribution, size_s, size_l, information, picture, picture_info, specimen_data ) VALUES ( $k_1, $k_2, $k_3, $k_4, $k_5, $k_6, $k_7, $k_8, $k_9, $k_10, $k_11, $k_12, $k_13, $k_14, $k_15, $k_16 ) ");としてみたら、 Warning: PDO::query() expects parameter 1 to be string, object given in /home/users/1/hoge.ho-hogehogehogehoge/web/sanmpe/wp-content/themes/simplicity2-child/mysystem/adminpage/admin_kometuki_add.php on line 172というエラーが表示されました。
guest

回答3

0

HTML

1<input type="file">

で送信されたデータは、生のバイナリデータが$_POSTに入ってくるわけではありません。
http://php.net/manual/ja/features.file-upload.post-method.php
↑をよく読んで見てください。

$_FILES['userfile']['tmp_name']の中に、サーバ上で一時的に置かれているパスが書かれているので、これをopenして読み込んだ値をinsertすると、通ると思います。

投稿2018/09/28 01:50

kunai

総合スコア5405

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

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

scrollman

2018/09/28 17:46

もともと $k_14 = $_POST['picture']; $k_16 = $_POST['specimen_data']; でバイナリデータが入ってこなかったのは コメントアウトされている「var_dump」で分かっていたので、 ifではk_14とk_16を除外して $k_14 = file_get_contents($_FILES['picture']['tmp_name']); $k_16 = file_get_contents($_FILES['specimen_data']['tmp_name']); で新たに代入しなおし、これをInsertしようとしたのですがこれはだめでした。 ⇩fopenの方法でもやってみましたが、結果は同じでした。 $k_14 = fopen($_FILES['picture']['tmp_name'],"r"); $k_16 = fopen($_FILES['specimen_data']['tmp_name'],"r");
guest

0

MEDIUMBLOBは16,777,215バイトを超えるデータを登録できませんが容量オーバーしていないでしょうか。
小さい画像が登録できるかどうかテストしてみて下さい。
また、DBのcolumnをLONGBLOB型にすると4GBが最大長のようです。

投稿2018/09/28 01:52

n_takapyon

総合スコア443

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

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

scrollman

2018/09/28 17:34

1MBあるかないかぐらいのデータを入れておりますので容量オーバーではないはずです。
guest

0

ベストアンサー

バイナリデータをDBに登録するなら最低でもプレイスホルダー(prepare)で処理してください

投稿2018/09/28 01:42

yambejp

総合スコア114814

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

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

scrollman

2018/09/28 17:48

$sql = $dbh->prepare("INSERT INTO kometuki ( dba_id, subfamily_latin, subfamily, family_latin, family, genus, species, Japanese_name, nominee, distribution, size_s, size_l, information, picture, picture_info, specimen_data ) VALUES ( $k_1, $k_2, $k_3, $k_4, $k_5, $k_6, $k_7, $k_8, $k_9, $k_10, $k_11, $k_12, $k_13, $k_14, $k_15, $k_16 ) "); してみたらそれまで表示されていなかったエラー、 Warning: PDO::query() expects parameter 1 to be string, object given in /home/users/1/hoge.ho-hogehogehogehoge/web/sanmpe/wp-content/themes/simplicity2-child/mysystem/adminpage/admin_kometuki_add.php on line 172 が表示されるようになりました。 エラーの内容がいまいちわかりません。どういうことなのでしょうか…?
yambejp

2018/09/29 03:20

prepareは疑問符かラベルを使ってあらかじめデータ投入の 受け口を作っておいて、あとでバインドします 詳細はマニュアルを参照してください
scrollman

2018/09/30 07:59

マニュアルじっくり見たらいけました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問