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

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

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

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

Q&A

解決済

1回答

694閲覧

MySQLへの画像ファイルデータ(blob)格納時エラー

Fujiman

総合スコア41

MySQL

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

0グッド

0クリップ

投稿2022/04/17 06:43

編集2022/04/17 22:00

ホームページから画像ファイルを選択しそれをMySQLに格納しようとしています。
1レコードにつきファイル2つまでは正常に格納されるのですが
3つ登録しようとすると下記エラーが出てしまいます。
カラムのタイプは3つともlongblobです

エラーメッセージ:
Got a packet bigger than ‘max_allowed_packet’ bytes

my.cnfのmax_allowed_packetを最大の(?)
16MBにしても同様のエラーになります。
画像ファイルはどれも600KBくらいのものです
このような問題はどこを修正すれば回避できるでしょうか?
以下にPHPとデータベースのコードを掲示します。
このPHPでは画像を2つまで選択するのは問題なく処理されますが
3つ画像を選択すると上記のようなエラーになります

PHP

1<?php 2 require_once('dbConfig.php'); // データベース接続用定数の読み込み 3 ini_set('display_errors', 1); 4 ini_set('error_reporting', E_ALL); 5 $error_flag = false; 6 $stmt_error = 'GET'; 7 8 if($_SERVER['REQUEST_METHOD'] == 'POST'){ 9 $link = mysqli_connect(DB_HOST, DB_USER, DB_USER_PASS, DB_NAME); 10 if ($link == null) { 11 die("接続に失敗しました:" . mysqli_connect_error()); 12 } 13 $title = $_REQUEST['title']; 14 $resolution = $_REQUEST['resolution']; 15 $detail = $_REQUEST['detail']; 16 $schoolyear = $_REQUEST['schoolyear']; 17 $subject = $_REQUEST['subject']; 18 $keyword = $_REQUEST['keyword']; 19 $source = $_REQUEST['source']; 20 21 if (!empty($_FILES['image']['name'])) { 22 $filename = $_FILES['image']['name'][0]; 23 $filetype = $_FILES['image']['type'][0]; 24 $filecontent = file_get_contents($_FILES['image']['tmp_name'][0]); 25 $size = $_FILES['image']['size'][0]; 26 if ($_FILES['image']['name'][1] !== "") { 27 $filename2 = $_FILES['image']['name'][1]; 28 $filetype2 = $_FILES['image']['type'][1]; 29 $filecontent2 = file_get_contents($_FILES['image']['tmp_name'][1]); 30 $size2 = $_FILES['image']['size'][1]; 31 }else{ 32 $filename2 = ""; 33 $filetype2 = ""; 34 $filecontent2 = ""; 35 $size2 = ""; 36 } 37 if ($_FILES['image']['name'][2] !== "") { 38 $filename3 = $_FILES['image']['name'][2]; 39 $filetype3 = $_FILES['image']['type'][2]; 40 $filecontent3 = file_get_contents($_FILES['image']['tmp_name'][2]); 41 $size3 = $_FILES['image']['size'][2]; 42 }else{ 43 $filename3 = ""; 44 $filetype3 = ""; 45 $filecontent3 = ""; 46 $size3 = ""; 47 } 48 } 49 50 if($title == '' || $resolution == '' || $detail == '' || $schoolyear == '' || $subject == '' || $keyword == ''){ 51 $error_flag = true; 52 } 53 if(!$error_flag){ 54 $sql = "INSERT INTO `jirei`(`title`, `resolution`, `detail`, `schoolyear`, `subject`, `keyword`, `source`, `image_name`, `image_type`, `image_content`, `image_size`, `image_name2`, `image_type2`, `image_content2`, `image_size2`, `image_name3`, `image_type3`, `image_content3`, `image_size3`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 55 if ($stmt = mysqli_prepare($link, $sql)) { 56 mysqli_stmt_bind_param($stmt, "ssssssssssisssisssi",$title, $resolution, $detail, $schoolyear, $subject, $keyword, $source, $filename, $filetype, $filecontent, $size, $filename2, $filetype2, $filecontent2, $size2, $filename3, $filetype3, $filecontent3, $size3); 57 mysqli_stmt_execute($stmt); 58 $stmt_error = mysqli_stmt_error($stmt); 59 // var_dump($stmt_error); 60 // exit(); 61 mysqli_stmt_close($stmt); 62 } 63 } 64 } 65 66?> 67 68<!DOCTYPE HTML> 69<html lang ="ja"> 70<head> 71<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet"> 72<link rel="stylesheet" href="./css/font-awesome.min.css"> 73<link rel="stylesheet" href="./css/style.css"> 74<meta name="viewport" content="width=device-width, initial-scale=1" /> 75<meta charset="utf-8"> 76<title>登録フォーム</title> 77</head> 78<body id="log_body"> 79 <?php 80 // 登録成功時とエラー表示用モーダル 81 if($error_flag){ 82 print '<div class="modal2">'; 83 print '<input class="modal-check" type="checkbox" id="modal-check"/>'; 84 print '<div class="modal-body">'; 85 print '<div class="modal-window">'; 86 print '<label class="modal-label" for="modal-check">'; 87 print '<svg width="16" height="16">'; 88 print '<polygon points="14.4,3.1 12.9,1.6 8,6.6 3.1,1.6 1.6,3.1 6.6,8 1.6,12.9 3.1,14.4 8,9.4 12.9,14.4 14.4,12.9 9.4,8 "></polygon>'; 89 print '</svg>'; 90 print '</label>'; 91 print '<div class="modal-inner">'; 92 print '<div class="modal-content">'; 93 print '<h2>未入力があります</h2>'; 94 print '</div>'; 95 print '</div>'; 96 print '</div>'; 97 print '</div>'; 98 print '</div>'; 99 } else if($stmt_error == ""){ 100 print '<div class="modal">'; 101 print '<input class="modal-check" type="checkbox" id="modal-check"/>'; 102 print '<div class="modal-body">'; 103 print '<div class="modal-window">'; 104 print '<label class="modal-label" for="modal-check">'; 105 print '<svg width="16" height="16">'; 106 print '<polygon points="14.4,3.1 12.9,1.6 8,6.6 3.1,1.6 1.6,3.1 6.6,8 1.6,12.9 3.1,14.4 8,9.4 12.9,14.4 14.4,12.9 9.4,8 "></polygon>'; 107 print '</svg>'; 108 print '</label>'; 109 print '<div class="modal-inner">'; 110 print '<div class="modal-content">'; 111 print '<h2>登録完了</h2>'; 112 print '</div>'; 113 print '</div>'; 114 print '</div>'; 115 print '</div>'; 116 print '</div>'; 117 } 118 ?> 119<form action="" enctype="multipart/form-data" method="post"> 120 <table> 121 <tr> 122 <td>タイトル:</td> 123 </tr> 124 <tr> 125 <td><input type="text" name="title" size="60" value="" /></td> 126 </tr> 127 <tr> 128 <td></td> 129 </tr> 130 <tr> 131 <td>解決ポイント:</td> 132 </tr> 133 <tr> 134 <td><textarea name="resolution"></textarea ></td> 135 </tr> 136 <tr> 137 <td>詳細:</td> 138 </tr> 139 <tr> 140 <td><textarea name="detail"></textarea ></td> 141 </tr> 142 <tr> 143 <td> 対象学年: 144 <select name="schoolyear"> 145 <option value="1">小学1年</option> 146 <option value="2">小学2年</option> 147 <option value="3">小学3年</option> 148 <option value="4">小学4年</option> 149 <option value="5">小学5年</option> 150 <option value="6">小学6年</option> 151 <option value="JC1">中学1年</option> 152 <option value="JC2">中学2年</option> 153 <option value="JC3">中学3年</option> 154 <option value="ALL">全学年</option> 155 </select> 156 </td> 157 </tr> 158 <tr> 159 <td> 学科: 160 <select name="subject"> 161 <option value="kokugo">国語</option> 162 <option value="rika">理科</option> 163 <option value="syakai">社会</option> 164 <option value="sansuu">算数</option> 165 <option value="suugaku">数学</option> 166 <option value="eigo">英語</option> 167 <option value="taiiku">体育</option> 168 <option value="ongaku">音楽</option> 169 <option value="sougou">総合</option> 170 <option value="sonota">その他</option> 171 </select> 172 </td> 173 </tr> 174 <tr> 175 <td>キーワード:</td> 176 </tr> 177 <tr> 178 <td><textarea name="keyword"></textarea ></td> 179 </tr> 180 <tr> 181 <td>ソース:</td> 182 </tr> 183 <tr> 184 <td><input type="text" name="source" size="60" value="" /></td> 185 </tr> 186 <tr> 187 <td>画像1を選択(必須)</td> 188 </tr> 189 <tr> 190 <td> 191 <input id="fileinput" type="file" name="image[]" required onchange="previewImage(this);" accept="image/*"> 192 <p> 193 Preview:<br><img id="preview" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" style="max-width:200px;"> 194 </p> 195 </td> 196 </tr> 197 <tr> 198 <td>画像2を選択</td> 199 </tr> 200 <tr> 201 <td> 202 <input id="fileinput" type="file" name="image[]" onchange="previewImage2(this);" accept="image/*"> 203 <p> 204 Preview:<br><img id="preview2" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" style="max-width:200px;"> 205 </p> 206 </td> 207 </tr> 208 <tr> 209 <td>画像3を選択</td> 210 </tr> 211 <tr> 212 <td> 213 <input id="fileinput" type="file" name="image[]" onchange="previewImage3(this);" accept="image/*"> 214 <p> 215 Preview:<br><img id="preview3" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" style="max-width:200px;"> 216 </p> 217 </td> 218 </tr> 219 220 </table> 221 222 <input type="submit" value="登録する" /> 223</form> 224 225<script> 226 function previewImage(obj){ 227 var fileReader = new FileReader(); 228 fileReader.onload = (function() { 229 document.getElementById('preview').src = fileReader.result; 230 }); 231 fileReader.readAsDataURL(obj.files[0]); 232 } 233 function previewImage2(obj){ 234 var fileReader = new FileReader(); 235 fileReader.onload = (function() { 236 document.getElementById('preview2').src = fileReader.result; 237 }); 238 fileReader.readAsDataURL(obj.files[0]); 239 } 240 function previewImage3(obj){ 241 var fileReader = new FileReader(); 242 fileReader.onload = (function() { 243 document.getElementById('preview3').src = fileReader.result; 244 }); 245 fileReader.readAsDataURL(obj.files[0]); 246 } 247 248 249</script> 250 251 252<?php 253mysqli_free_result($stmt); 254mysqli_close($link); 255?> 256</body> 257</html>

mySQLインポート用ファイルの内容

SQL

1 2 3-- 4-- テーブルの構造 `jirei` 5-- 6 7CREATE TABLE `jirei` ( 8 `id` int(11) NOT NULL, 9 `title` varchar(100) NOT NULL, 10 `resolution` varchar(300) NOT NULL, 11 `detail` text NOT NULL, 12 `schoolyear` varchar(10) NOT NULL, 13 `subject` varchar(10) NOT NULL, 14 `keyword` varchar(100) NOT NULL, 15 `source` varchar(50) NOT NULL, 16 `created_at` datetime NOT NULL DEFAULT current_timestamp(), 17 `image_name` varchar(256) NOT NULL, 18 `image_type` varchar(64) NOT NULL, 19 `image_content` longblob NOT NULL, 20 `image_size` int(11) NOT NULL, 21 `image_name2` varchar(256) NOT NULL, 22 `image_type2` varchar(64) NOT NULL, 23 `image_content2` longblob NOT NULL, 24 `image_size2` int(11) NOT NULL, 25 `image_name3` varchar(256) NOT NULL, 26 `image_type3` varchar(64) NOT NULL, 27 `image_content3` longblob NOT NULL, 28 `image_size3` int(11) NOT NULL 29) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 30 31-- 32-- ダンプしたテーブルのインデックス 33-- 34 35-- 36-- テーブルのインデックス `jirei` 37-- 38ALTER TABLE `jirei` 39 ADD PRIMARY KEY (`id`); 40 41-- 42-- ダンプしたテーブルの AUTO_INCREMENT 43-- 44 45-- 46-- テーブルの AUTO_INCREMENT `jirei` 47-- 48ALTER TABLE `jirei` 49 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 50COMMIT; 51 52/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 53/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 54/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 55

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

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

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

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

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

Orlofsky

2022/04/17 10:19 編集

質問は修正できます。 現象を再現できるだけの情報をhttps://teratail.com/help/question-tips#questionTips37 の [コード] で提示してください。
Fujiman

2022/04/17 09:56

すみません、簡素すぎました。関連すると思われる部分を追加しました
Fujiman

2022/04/17 12:55

大変申し訳ありません、私の見落としでした。 こちらはXAMPPなので、以下のファイルでの記述を確認したつもりでしたが max_allowed_packetの設定箇所は2箇所ありダンプの方だけを16Mにして もう一方を1Mのままにしていました。 こちらも16Mにしたら正常に受け付けるようになりました /Applications/XAMPP/xamppfiles/etc/my.cnf [mysqldump] max_allowed_packet=16M
guest

回答1

0

自己解決

2箇所ある設定でダンプの方でない方を最大の16Mにしたらエラーが無くなった

投稿2022/04/17 13:00

Fujiman

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問