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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

2回答

2152閲覧

【PHP】画像・文字をPDOを利用してDBに格納したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/08/28 07:42

編集2022/01/12 10:55

PHPを利用して、
服のブランド名・カテゴリー・カラー・コメント(特徴)・画像
をDBに格納したいです。
PDOを利用したいのですが、この書き方ですとDBに格納できません。
表示、入力まではできるのですが、phpmyadminを確認しますと格納できていないようです。
データベース接続のコードを書くところが間違っているのかなと思っております
どのように書き換えたらいいのでしょうか。

PHP

1<?php 2session_start(); 3 $name = 'g031o050'; 4 $pass = 'g031o050'; 5 $errors = array(); 6 7 8 9 10// エラー確認 11if(!empty($_POST)) { 12 if (!isset($_POST['brand']) || $_POST['brand'] === '') { 13 $errors['brand'] = 'ブランドが入力されていません'; 14 } else { 15 $brand = htmlspecialchars($_POST['brand'], ENT_QUOTES); 16 } 17 18 if (!isset($_POST['cate']) || $_POST['cate'] === '') { 19 $errors['cate'] = 'カテゴリーが入力されていません'; 20 } else { 21 $cate = htmlspecialchars($_POST['cate'], ENT_QUOTES); 22 } 23 24 if (!isset($_POST['color']) || $_POST['color'] === '') { 25 $errors['color'] = 'カラーが入力されていません'; 26 } else { 27 $color = htmlspecialchars($_POST['color'], ENT_QUOTES); 28 } 29 30 if (!isset($_POST['comm']) || $_POST['comm'] === '') { 31 $errors['comm'] = 'ポイントが入力されていません'; 32 } else { 33 $comm = htmlspecialchars($_POST['comm'], ENT_QUOTES); 34 } 35} 36 // 画像をリサイズして保存 37if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) { 38 try { 39 // $_FILES['upfile']['error'] の値を確認 40 switch ($_FILES['upfile']['error']) { 41 case UPLOAD_ERR_OK: // OK 42 break; 43 case UPLOAD_ERR_NO_FILE: // ファイル未選択 44 throw new RuntimeException('ファイルが選択されていません'); 45 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 46 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 47 throw new RuntimeException('ファイルサイズが大きすぎます'); 48 default: 49 throw new RuntimeException('その他のエラーが発生しました'); 50 } 51$info = @getimagesize($_FILES['upfile']['tmp_name']); 52 if (!$info = @getimagesize($_FILES['upfile']['tmp_name'])) { 53 throw new RuntimeException("[{$k}] 有効な画像ファイルを指定してください"); 54 } 55 if (!in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) { 56 throw new RuntimeException("未対応の画像形式です"); 57 } 58// 画像処理に使う関数名 59 $create = str_replace('/', 'createfrom', $info['mime']); 60 $output = str_replace('/', '', $info['mime']); 61// 縦横比を維持、120 * 120 以下に収まるサイズを求める 62 if ($info[0] >= $info[1]) { 63 $dst_w = 120; 64 $dst_h = ceil(120 * $info[1] / max($info[0], 1)); 65 } else { 66 $dst_w = ceil(120 * $info[0] / max($info[1], 1)); 67 $dst_h = 120; 68 } 69// リサンプリング先画像リソースを生成 70 $dst = imagecreatetruecolor($dst_w, $dst_h); 71// 元画像リソースを生成 72 if (!$src = @$create($_FILES['upfile']['tmp_name'])) { 73 throw new RuntimeException("画像リソースの生成に失敗しました"); 74 } 75// getimagesize関数で得られた情報も利用してリサンプリング 76 imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]); 77ob_start(); 78 $output ($dst); 79 $content = base64_encode(ob_get_contents()); 80ob_end_clean(); 81imagedestroy($dst); 82 $_SESSION['content'] = $content; 83 $msg = ['green', 'ファイルは正常に読み込まれています。']; 84 } catch (RuntimeException $e) { 85 $msg = ['red', $e->getMessage()]; 86 } 87} 88 89 90// リライトするときの設定 91if(isset($_GET['action']) && $_GET['action'] === 'edit'){ 92 $brand = $_SESSION['brand']; 93 $cate = $_SESSION['cate']; 94 $color = $_SESSION['color']; 95 $comm= $_SESSION['comm']; 96} 97// エラーがなかったら、 98if(count($errors) === 0){ 99 $_SESSION['brand'] = $brand; 100 $_SESSION['cate'] = $cate; 101 $_SESSION['color'] = $color; 102 $_SESSION['comm'] = $comm; 103 } 104 105 106// 登録ボタンが押されたらインサート処理開始 107if(!empty($_POST['register'])){ 108 require_once 'dbmanager.php'; 109 try{ 110 $pdo = new PDO("mysql:host=localhost;dbname=g031o050;charset=utf8",'g031o050', 'g031o050', array(PDO::ATTR_EMULATE_PREPARES => false)); 111 $sql = 'INSERT INTO images(brand,cate,color,comm,picture) VALUES(:brand, :cate, :color, :comm,:picture)'; 112 $stmt = $pdo->prepare($sql); 113 $stmt->bindParam(':brand', $_SESSION['brand'], PDO::PARAM_STR); 114 $stmt->bindParam(':cate', $_SESSION['cate'], PDO::PARAM_STR); 115 $stmt->bindParam(':color', $_SESSION['color'], PDO::PARAM_STR); 116 $stmt->bindParam(':comm', $_SESSION['comm'], PDO::PARAM_STR); 117 $stmt->bindParam(':picture', $_SESSION['content'], PDO::PARAM_STR); 118 $stmt->execute(); 119 header('Location: thanks.php'); 120 } catch (PDOException $e) { 121 echo $e->getMessage(); 122 } 123} 124 125?> 126 127

html

1<!DOCTYPE html> 2<html> 3<head> 4 <title>画像登録画面</title> 5</head> 6<body> 7 <center> 8<?php 9// エラーメッセージ表示 10echo "<ul>"; 11foreach($errors as $value){ 12echo"<li>"; 13echo $value; 14echo"</li>"; 15} 16echo "</ul>"; 17?> 18<?php if (!isset($_POST['submit']) || $_POST['submit'] === '') : ?> 19<form enctype="multipart/form-data" method="post" action=""> 20<dl> 21<dt>ブランド<span class="required">必須</span></dt> 22<dd><input type="text" name="brand" size="35" maxlength="255" value="<?php if(isset($brand)){ echo $brand; } ?>"> 23</dd> 24<dt>カテゴリー<span class="required">必須</span></dt> 25<select name="cate" id ="pref"> 26//ここに各カテゴリーを書いています 27</select> 28<dt>カラー<span class="required">必須</span></dt> 29<dd><input type="text" name="color" size="10" maxlength="20" value=""> 30</dd> 31<dt>特徴<span class="required">必須</span></dt> 32<dd><input type="text" name="comm" size="10" maxlength="20" value=""> 33</dd> 34<dt>プロフィール画像など(GIF, JPEG, PNGのみ対応)</dt> 35<dd><input type="file" name="upfile" /></dd> 36<p><input type="submit" value="送信" name="submit"/></p> 37</dl> 38 </form> 39 40 41<?php elseif( count($errors) > 0) : ?> 42<form enctype="multipart/form-data" method="post" action=""> 43<dl> 44<dt>ブランド<span class="required">必須</span></dt> 45<dd><input type="text" name="brand" size="35" maxlength="255" value="<?php if(isset($brand)){ echo $brand; } ?>"> 46</dd> 47<dt>カテゴリー<span class="required">必須</span></dt> 48<select name="cate" id ="pref"> 49//ここに各カテゴリーを書いています 50 51</select> 52<dt>カラー<span class="required">必須</span></dt> 53<dd><input type="text" name="color" size="10" maxlength="20" value=""> 54</dd> 55<dt>特徴<span class="required">必須</span></dt> 56<dd><input type="text" name="comm" size="10" maxlength="20" value=""> 57</dd> 58<dt>プロフィール画像など(GIF, JPEG, PNGのみ対応)</dt> 59<dd><input type="file" name="upfile" /></dd> 60<p><input type="submit" value="submit" name="submit"/></p> 61</dl> 62 </form> 63 64<?php else: ?> 65<form action="" method="post" enctype="multipart/form-data"> 66<dl> 67<dt>ブランド<span class="required">必須</span></dt> 68<dd><?php if(isset($brand)){ echo $brand; } ?></dd> 69<dt>カテゴリー<span class="required">必須</span></dt> 70<dd><?php if(isset($cate)){ echo $cate; } ?></dd> 71<dt>カラー<span class="required">必須</span></dt> 72<dd><?php if(isset($color)){ echo $color; } ?></dd> 73<dt>ポイント<span class="required">必須</span></dt> 74<dd><?php if(isset($comm)){ echo $comm; } ?></dd> 75<dt>プロフィール画像など</dt> 76<dd> 77<?php if (isset($info)): ?> 78<img src="data:<?php echo$info[mime] ?>;base64,<?php echo $content;?>" alt="sample" /><br> 79<?php endif; ?> 80<?php if (isset($msg)): ?> 81 <span style="color:<?=$msg[0]?>;"><?=$msg[1]?></span> 82<?php endif; ?> 83</dd></dl> 84<div><a href="?action=edit">&laquo;&nbsp;書き直す</a>|<input type="submit" name="register" value="登録する" /></div> 85</form> 86<?php endif; ?> 87 88</center> 89</body> 90</html> 91

長いのでhtmlは省略しました。

PHP初心者なのでわからないことが多いですが、よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/08/28 07:46

質問編集画面タイトル横にある「初心者アイコン」をご活用ください。「初心者」と質問で書くよりも伝わりますし、質問一覧に表示されるのでわかりやすくなります。
m.ts10806

2018/08/28 07:47

「できません」だけですと起きた現象が分かりません。エラーなど出ているのでしたらそのエラーメッセージを追記し、そうでなくとも実行したときに起きた現象を具体的に記載してください。
m.ts10806

2018/08/28 07:51

ちなみに「至急」 とつけると回答が途端につきにくくなります。タイトルで避けられます。急いでいるかどうかは見ている人は知ったこっちゃありません。
m.ts10806

2018/08/28 07:53

至急と書く人ほど質問内容が薄くなり、何度も確認、質問を修正する羽目になり、結果的に時間を浪費します。「至急」 とか書いてる暇があったら質問内容を充実させてください。
m.ts10806

2018/08/28 07:58

html省略されたら正しく再現確認とれませんしね。DB定義も必要です。
退会済みユーザー

退会済みユーザー

2018/08/28 08:09

ご指摘ありがとうございます。文字数を超えてしまう場合どのようにするのでしょうか。初心者のため至らないところが多くすみません。
m.ts10806

2018/08/28 08:11

<form>~</form>だけでも無理ですか?さいあく入力コントロール部分だけでも構いません。仮で回答してますが、追記内容次第では回答も追記します。
yambejp

2018/08/28 11:16

さすが至急だけに退会が速い(苦笑)
guest

回答2

0

色々追記されるのを期待して、現時点での気づき(実際に問題がありそうなところ以外も含む)。

  • ボタン押されてたら画像が正しくアップロードされてなくてもInsert文実行されるように見受けられます。
  • つまり入力のバリデーションに引っかかっていたり、画像アップロードのエラーがあっても関係なく実行されるはず
  • エラー確認しましょう。
  • 最初に折角$nameと$pass宣言したのに使わないのはなぜ
  • $errorsに貯めていったエラーメッセージは使わないの?エラーが「あったら」の処理は省略すべきではないですね。
  • 終盤出てくる$_GETはどこで渡しているのか(やはりHTMLは必要ですね)
  • htmlspecialchars()はHTML上に表示する情報に対して利用するものなので、HTML上に表示しないものに利用しても意味はありません。SQLインジェクション対策におけるエスケープを期待しているのであればPDOのbindParam()がやってくれます。

投稿2018/08/28 08:09

編集2018/08/28 08:17
m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2018/08/28 08:21

回答ありがとうございます。 上記の点を変更してみたいと思います。
m.ts10806

2018/08/28 08:29

html確認しましたがかなり冗長になっていますね。 変わるところだけを変数にしてフォーム内のinputなどは共通でされた方が何か変更があったときに楽ですよ
guest

0

セッションとかどうせわかっていないのでしょうから
まずはもっと簡単な仕組みからはじめれば
どこでつまっているかわかると思いますよ

PHP

1<?PHP 2if(isset($_FILES["f"])){ 3 $fp=fopen($_FILES["f"]["tmp_name"],"r"); 4 $content=""; 5 while(!feof($fp)){ 6 $content.=fread($fp,1024); 7 } 8 fclose($fp); 9 print strlen($content);//読み込んだデータのサイズ 10} 11 12?> 13<form method="post" enctype="multipart/form-data"> 14<input type="file" name="f"> 15<input type="submit" value="go"> 16</form>

投稿2018/08/28 08:26

yambejp

総合スコア114581

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問