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

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

ただいまの
回答率

90.50%

  • PHP

    24437questions

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

  • MySQL

    7107questions

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

  • データベース

    851questions

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

  • PDO

    388questions

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

  • DB2

    76questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 394
退会済みユーザー

退会済みユーザー

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

<?php
session_start();
    $name = 'g031o050';
    $pass = 'g031o050';
    $errors = array();




// エラー確認
if(!empty($_POST)) {
    if (!isset($_POST['brand']) || $_POST['brand'] === '') {
        $errors['brand'] = 'ブランドが入力されていません';
    } else {
    $brand = htmlspecialchars($_POST['brand'], ENT_QUOTES);
    }

    if (!isset($_POST['cate']) || $_POST['cate'] === '') {
        $errors['cate'] = 'カテゴリーが入力されていません';
    } else {
    $cate = htmlspecialchars($_POST['cate'], ENT_QUOTES);
    }

    if (!isset($_POST['color']) || $_POST['color'] === '') {
        $errors['color'] = 'カラーが入力されていません';
    } else {
        $color = htmlspecialchars($_POST['color'], ENT_QUOTES);
    }

    if (!isset($_POST['comm']) || $_POST['comm'] === '') {
        $errors['comm'] = 'ポイントが入力されていません';
    } else {
        $comm = htmlspecialchars($_POST['comm'], ENT_QUOTES);
    }
}
 // 画像をリサイズして保存
if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) {
    try {
        // $_FILES['upfile']['error'] の値を確認
        switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK: // OK
                break;
            case UPLOAD_ERR_NO_FILE:   // ファイル未選択
                throw new RuntimeException('ファイルが選択されていません');
            case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
            case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
                throw new RuntimeException('ファイルサイズが大きすぎます');
            default:
                throw new RuntimeException('その他のエラーが発生しました');
        }
$info = @getimagesize($_FILES['upfile']['tmp_name']);
            if (!$info = @getimagesize($_FILES['upfile']['tmp_name'])) {
                throw new RuntimeException("[{$k}] 有効な画像ファイルを指定してください");
            }
            if (!in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) {
                throw new RuntimeException("未対応の画像形式です");
            }
// 画像処理に使う関数名
            $create = str_replace('/', 'createfrom', $info['mime']);
            $output = str_replace('/', '', $info['mime']);
// 縦横比を維持、120 * 120 以下に収まるサイズを求める
            if ($info[0] >= $info[1]) {
                $dst_w = 120;
                $dst_h = ceil(120 * $info[1] / max($info[0], 1));
            } else {
                $dst_w = ceil(120 * $info[0] / max($info[1], 1));
                $dst_h = 120;
            }
// リサンプリング先画像リソースを生成
            $dst = imagecreatetruecolor($dst_w, $dst_h);
// 元画像リソースを生成
            if (!$src = @$create($_FILES['upfile']['tmp_name'])) {
                throw new RuntimeException("画像リソースの生成に失敗しました");
            }
// getimagesize関数で得られた情報も利用してリサンプリング
            imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_w, $dst_h, $info[0], $info[1]);
ob_start();
  $output ($dst);
  $content = base64_encode(ob_get_contents());
ob_end_clean();
imagedestroy($dst);
  $_SESSION['content'] = $content;
        $msg = ['green', 'ファイルは正常に読み込まれています。'];
    } catch (RuntimeException $e) {
        $msg = ['red', $e->getMessage()];
    }
}


// リライトするときの設定
if(isset($_GET['action']) && $_GET['action'] === 'edit'){
 $brand = $_SESSION['brand'];
 $cate = $_SESSION['cate'];
 $color = $_SESSION['color'];
 $comm= $_SESSION['comm'];
}
// エラーがなかったら、
if(count($errors) === 0){
    $_SESSION['brand'] = $brand;
    $_SESSION['cate'] = $cate;
    $_SESSION['color'] = $color;
    $_SESSION['comm'] = $comm;
    }


// 登録ボタンが押されたらインサート処理開始
if(!empty($_POST['register'])){
    require_once 'dbmanager.php';
    try{
      $pdo = new PDO("mysql:host=localhost;dbname=g031o050;charset=utf8",'g031o050', 'g031o050', array(PDO::ATTR_EMULATE_PREPARES => false));
        $sql = 'INSERT INTO images(brand,cate,color,comm,picture) VALUES(:brand, :cate, :color, :comm,:picture)';
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':brand', $_SESSION['brand'], PDO::PARAM_STR);
        $stmt->bindParam(':cate', $_SESSION['cate'], PDO::PARAM_STR);
        $stmt->bindParam(':color', $_SESSION['color'], PDO::PARAM_STR);
        $stmt->bindParam(':comm', $_SESSION['comm'], PDO::PARAM_STR);
        $stmt->bindParam(':picture', $_SESSION['content'], PDO::PARAM_STR);
        $stmt->execute();
         header('Location: thanks.php');
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
}

?>
<!DOCTYPE html>
<html>
<head>
  <title>画像登録画面</title>
</head>
<body>
  <center>
<?php
// エラーメッセージ表示
echo "<ul>";
foreach($errors as $value){
echo"<li>";
echo $value;
echo"</li>";
}
echo "</ul>";
?>
<?php if (!isset($_POST['submit']) || $_POST['submit'] === '') : ?>
<form enctype="multipart/form-data" method="post" action="">
<dl>
<dt>ブランド<span class="required">必須</span></dt>
<dd><input type="text" name="brand" size="35" maxlength="255" value="<?php if(isset($brand)){ echo $brand; } ?>">
</dd>
<dt>カテゴリー<span class="required">必須</span></dt>
<select name="cate" id ="pref">
//ここに各カテゴリーを書いています
</select>
<dt>カラー<span class="required">必須</span></dt>
<dd><input type="text" name="color" size="10" maxlength="20" value="">
</dd>
<dt>特徴<span class="required">必須</span></dt>
<dd><input type="text" name="comm" size="10" maxlength="20" value="">
</dd>
<dt>プロフィール画像など(GIF, JPEG, PNGのみ対応)</dt>
<dd><input type="file" name="upfile" /></dd>
<p><input type="submit" value="送信" name="submit"/></p>
</dl>
  </form>


<?php elseif( count($errors) > 0) : ?>
<form enctype="multipart/form-data" method="post" action="">
<dl>
<dt>ブランド<span class="required">必須</span></dt>
<dd><input type="text" name="brand" size="35" maxlength="255" value="<?php if(isset($brand)){ echo $brand; } ?>">
</dd>
<dt>カテゴリー<span class="required">必須</span></dt>
<select name="cate" id ="pref">
//ここに各カテゴリーを書いています

</select>
<dt>カラー<span class="required">必須</span></dt>
<dd><input type="text" name="color" size="10" maxlength="20" value="">
</dd>
<dt>特徴<span class="required">必須</span></dt>
<dd><input type="text" name="comm" size="10" maxlength="20" value="">
</dd>
<dt>プロフィール画像など(GIF, JPEG, PNGのみ対応)</dt>
<dd><input type="file" name="upfile" /></dd>
<p><input type="submit" value="submit" name="submit"/></p>
</dl>
  </form>

<?php else: ?>
<form action="" method="post" enctype="multipart/form-data">
<dl>
<dt>ブランド<span class="required">必須</span></dt>
<dd><?php if(isset($brand)){ echo $brand; } ?></dd>
<dt>カテゴリー<span class="required">必須</span></dt>
<dd><?php if(isset($cate)){ echo $cate; } ?></dd>
<dt>カラー<span class="required">必須</span></dt>
<dd><?php if(isset($color)){ echo $color; } ?></dd>
<dt>ポイント<span class="required">必須</span></dt>
<dd><?php if(isset($comm)){ echo $comm; } ?></dd>
<dt>プロフィール画像など</dt>
<dd>
<?php if (isset($info)): ?>
<img src="data:<?php echo$info[mime] ?>;base64,<?php echo $content;?>" alt="sample" /><br>
<?php endif; ?>
<?php if (isset($msg)): ?>
    <span style="color:<?=$msg[0]?>;"><?=$msg[1]?></span>
<?php endif; ?>
</dd></dl>
<div><a href="?action=edit">&laquo;&nbsp;書き直す</a>|<input type="submit" name="register" value="登録する" /></div>
</form>
<?php endif; ?>

</center>
</body>
</html>

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/08/28 17:09

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

    キャンセル

  • mts10806

    2018/08/28 17:11

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

    キャンセル

  • yambejp

    2018/08/28 20:16

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

    キャンセル

回答 2

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/28 17:21

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

    キャンセル

  • 2018/08/28 17:29

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

    キャンセル

0

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

<?PHP
if(isset($_FILES["f"])){
  $fp=fopen($_FILES["f"]["tmp_name"],"r");
  $content="";
  while(!feof($fp)){
    $content.=fread($fp,1024);
  }
  fclose($fp);
  print strlen($content);//読み込んだデータのサイズ
}

?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="f">
<input type="submit" value="go">
</form>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    24437questions

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

  • MySQL

    7107questions

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

  • データベース

    851questions

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

  • PDO

    388questions

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

  • DB2

    76questions

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