ホームページから画像ファイルを選択しそれを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
回答1件
あなたの回答
tips
プレビュー