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

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

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

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

PHP

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

Q&A

解決済

2回答

339閲覧

PHPとMySQLを使った掲示板で画像を選択せず言葉だけ送りたいです。

harusyoui

総合スコア55

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/09/28 14:50

編集2018/09/29 03:32

前提・実現したいこと

現在PHPとMySQLで掲示板の様なものをつくろうとしてまして、
言葉だけ入力して画像は選択せずに送信し言葉だけの投稿を
したいのですが、
そうしようとすると「その他のエラーが発生しました」という
メッセージが出てエラーが出てしまう送信できません。

以下のコードのどこをどうすれば言葉だけを送信できるように
なりますか?

宜しくお願いします。

該当のソースコード

PHP

1 2<?php 3 4/* HTML特殊文字をエスケープする関数 */ 5function h($str) { 6 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 7} 8 9// XHTMLとしてブラウザに認識させる 10// (IE8以下はサポート対象外w) 11header('Content-Type: application/xhtml+xml; charset=utf-8'); 12 13try { 14 15 // データベースに接続 16 $pdo = new PDO( 17 'mysql:host=localhost;dbname=board;charset=UTF8;', 18 'root', 19 '', 20 [ 21 PDO::ATTR_EMULATE_PREPARES => false, 22 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 23 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 24 ] 25 ); 26 27 /* 書き込みがあったとき */ 28 29 30 /* 画像があったとき */ 31 if ($_POST['word']) { 32 33 // バッファリングを開始 34 ob_start(); 35 36 try { 37 38 // $_FILES['upfile']['error'] の値を確認 39 switch ($_FILES['upfile']['error']) { 40 case UPLOAD_ERR_OK: // OK 41 break; 42 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 43 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 44 throw new RuntimeException('ファイルサイズが大きすぎます', 400); 45 default: 46 throw new RuntimeException('その他のエラーが発生しました', 500); 47 } 48 49 // $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので 50 // MIMEタイプを自前でチェックする 51 if (!$info = @getimagesize($_FILES['upfile']['tmp_name'])) { 52 throw new RuntimeException('有効な画像ファイルを指定してください', 400); 53 } 54 if (!in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) { 55 throw new RuntimeException('未対応の画像形式です', 400); 56 } 57 58 59 60 // サムネイルをバッファに出力 61 $create = str_replace('/', 'createfrom', $info['mime']); 62 $output = str_replace('/', '', $info['mime']); 63 if ($info[0] >= $info[1]) { 64 $dst_w = 120; 65 $dst_h = ceil(120 * $info[1] / max($info[0], 1)); 66 } else { 67 $dst_w = ceil(120 * $info[0] / max($info[1], 1)); 68 $dst_h = 120; 69 } 70 if (!$src = @$create($_FILES['upfile']['tmp_name'])) { 71 throw new RuntimeException('画像リソースの生成に失敗しました', 500); 72 } 73 $dst = imagecreatetruecolor($dst_w, $dst_h); 74 imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]); 75 $output($dst); 76 imagedestroy($src); 77 imagedestroy($dst); 78 79 // INSERT処理 80 $stmt = $pdo->prepare('INSERT INTO contributions(word,name,type,raw_data,thumb_data,date) VALUES(?,?,?,?,?,?)'); 81 $stmt->execute([ 82 $_POST['word'], 83 $_FILES['upfile']['name'], 84 $info[2], 85 file_get_contents($_FILES['upfile']['tmp_name']), 86 ob_get_clean(), // バッファからデータを取得してクリア 87 (new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s'), 88 ]); 89 90 $msgs[] = ['green', 'ファイルは正常にアップロードされました']; 91 92 } catch (RuntimeException $e) { 93 94 while (ob_get_level()) { 95 ob_end_clean(); // バッファをクリア 96 } 97 http_response_code($e instanceof PDOException ? 500 : $e->getCode()); 98 $msgs[] = ['red', $e->getMessage()]; 99 100 } 101 102 } 103 104 // 一覧取得 105 $rows = $pdo->query('SELECT id,word,name,type,thumb_data,date FROM contributions ORDER BY date DESC')->fetchAll(); 106 107} catch (PDOException $e) { 108 109 http_response_code(500); 110 $msgs[] = ['red', $e->getMessage()]; 111 112} 113 114?> 115 116<!DOCTYPE html> 117<html xmlns="http://www.w3.org/1999/xhtml"> 118 <head> 119 <title>画像アップロード</title> 120 <style> 121 <![CDATA[ 122 fieldset { margin: 10px; } 123 legend { font-size: 12pt; } 124 img { 125 border: none; 126 float: left; 127 } 128 ]]> 129 </style> 130 </head> 131 132 <body> 133 <form enctype="multipart/form-data" method="post" action=""> 134 <fieldset> 135 <input type="text" name="word" placeholder="言葉を入力" /> 136 137 <legend>画像ファイルを選択(GIF, JPEG, PNGのみ対応)</legend> 138 <input type="file" name="upfile" /><br /> 139 <input type="submit" value="送信" /> 140 </fieldset> 141 </form> 142 143 <?php if (!empty($msgs)): ?> 144 <fieldset> 145 <legend>メッセージ</legend> 146 <?php foreach ($msgs as $msg): ?> 147 <ul> 148 <li style="color:<?=h($msg[0])?>;"><?=h($msg[1])?></li> 149 </ul> 150 <?php endforeach; ?> 151 </fieldset> 152 <?php endif; ?> 153 154 <?php if (!empty($rows)): ?> 155 <fieldset> 156 <legend>サムネイル一覧(クリックすると原寸大表示)</legend> 157 <?php foreach ($rows as $i => $row): ?> 158 <?php if ($i): ?> 159 <hr /> 160 <?php endif; ?> 161 <p> 162 日付: <?=h($row['date'])?><br /> 163 言葉: <?=h($row['word'])?><br /> 164 <?= 165 sprintf( 166 '<a href="?id=%d"><img src="data:%s;base64,%s" alt="%s" /></a>', 167 $row['id'], 168 image_type_to_mime_type($row['type']), 169 base64_encode($row['thumb_data']), 170 h($row['name']) 171 ) 172 ?> 173 <br clear="all" /> 174 </p> 175 <?php endforeach; ?> 176 </fieldset> 177 <?php endif; ?> 178 </body> 179</html> 180

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

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

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

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

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

guest

回答2

0

ベストアンサー

case UPLOAD_ERR_NO_FILE:を作って、そのときはエラーをthrowせずに進むようにしたら良いのでは?

投稿2018/09/28 15:18

papinianus

総合スコア12705

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

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

harusyoui

2018/09/29 03:53

試してみたら少し先に進めました、ありがとうございます。
guest

0

PHP

1switch ($_FILES['upfile']['error']) { 2case UPLOAD_ERR_OK: // OK 3break; 4case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 5case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 6throw new RuntimeException('ファイルサイズが大きすぎます', 400); 7default: 8throw new RuntimeException('その他のエラーが発生しました', 500); 9}

しっかりとは読んでいませんが、エラーメッセージから推測するとここですよね。
そもそもの構造として、UPLOAD_ERR_OKであればbreakする、UPLOAD_ERR_INI_SIZEかUPLOAD_ERR_FORM_SIZEであればファイルサイズが大きすぎるエラー、まではいいと思うんですが、defaultがその他のエラーになっていますよね。
そこまでの条件に当てはまらなかった場合にdefaultに回されるので、例えばファイルをアップロードしていない、つまり$_FILES['upfile']['error']が空のときもdefaultに回されているのだと思います。

画像のアップの有無や結果の有無を事前にチェックする構造にされてみてはいかがでしょうか。

投稿2018/09/28 15:17

Takumiboo

総合スコア2534

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問