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

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

ただいまの
回答率

88.77%

【MySQL】【PHP】一部のデータベース挿入ができません。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 317

Masa-Y

score 22

以下の流れでお問い合わせフォームを作っています。

PHPエントリーフォーム入力(index.php)、確認ボタン押下
>(confirm.php遷移)送信内容確認、送信ボタン押下→送信完了

画像ファイルにphpバリデーションをかけたうえで、
データベースにPDO接続→mysqlサーバーに記録
この段階まで構築できたのですが、
設定した6つのフィールドのうち、
no/job/img_file の3つの値がNULLになってしまいます。

値を変数にした項目と、$_FILEの項目のようなんですが、
考えられる原因や、修正が必要な箇所を教えていただきたいです。
(img_file(jpegファイル)は、保管場所までのパスとファイル名を入れたいです)

イメージ説明
イメージ説明

【confirm.php】

$page_flag = 0;

if( !empty($_POST['confirm']) ) {
    $page_flag = 1;


function validation(){

    try {

        if (!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])) {
            throw new RuntimeException('パラメータが不正です');
        }

        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('その他のエラーが発生しました');
        }


        if ($_FILES['upfile']['size'] > 1000000) {
            throw new RuntimeException('ファイルサイズが大きすぎます');
        }


        if (!$ext = array_search(
            mime_content_type($_FILES['upfile']['tmp_name']),
            array(
                'jpg' => 'image/jpeg',
            ),
            true
        )) {
            throw new RuntimeException('ファイル形式が不正です');
        }

        if (!move_uploaded_file(
            $_FILES['upfile']['tmp_name'],
            $path = sprintf('./files/%s.%s',
                sha1_file($_FILES['upfile']['tmp_name']),
                $ext
            )
        )) {
            throw new RuntimeException('ファイル保存時にエラーが発生しました');
        }

        chmod($path, 0644);

        return null;

    } catch (RuntimeException $e) {

        return $e->getMessage();

    }

}


    if (isset($_POST['job']) || is_array($_POST['job'])) {
      $your_job = implode("、", $_POST["job"]);
    }
} elseif( !empty($_POST['submit']) ) {
    $page_flag = 2;

  //データベース接続
    define('DB_DATABASE', 'xxxxxxx_db');
    define('DB_USERNAME', 'xxxxxx_user');
    define('DB_PASSWORD', 'xxxxxx');
    define('DB_DSN', 'mysql:host=mysqlxxx.xxxxxx.ne.jp;dbname=' . DB_DATABASE. ';charset=utf8');

    try {
        $pdo = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

    } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
    }

    try {
        $pdo->beginTransaction();
        $sql = "INSERT INTO engineer(no, name, job, mail, img_file, message) VALUES(?,?,?,?,?,?)";
        $stmh = $pdo->prepare($sql);
        $id = null;
        $stmh->bindValue(1, $id, PDO::PARAM_INT);
        $stmh->bindValue(2, h($_POST["name"]), PDO::PARAM_STR);
        $stmh->bindValue(3, $your_job, PDO::PARAM_STR);
        $stmh->bindValue(4, h($_POST["mail"]), PDO::PARAM_STR);
        $stmh->bindValue(5, h($_FILES["upfile"]["name"]), PDO::PARAM_STR);
        $stmh->bindValue(6, h($_POST["message"]), PDO::PARAM_STR);
        $stmh->execute();
    } catch (PDOException $e){
        $pdo->rollBack();
        echo "エラー:" . $e->getMessage();
    }

    //自動返信メール送信
    require_once('mail.php');
}
?>
【confirm.php】
                     <div class="contact_form_wrapper px-3">
                         <form class="confirm_form" action="" method="post">
                          <input type="hidden" name="scroll_top" value="" class="st">

                             <div class="form_flex">
                                <div class="form_titles">
                                    お名前
                                </div>
                                <div class="confirm_item">
                                    <p><?php echo h($_POST["name"]); ?></p>
                                </div>
                             </div>

                             <div class="form_flex">
                                <div class="form_titles">
                                    ご職業
                                </div>
                                <div>
                                    <p class="confirm_item"><?php echo $your_job; ?></p>
                                </div>
                             </div>

                             <div class="form_flex">
                                <div class="form_titles">
                                    メールアドレス
                                </div>
                                <div>
                                    <p class="confirm_item"><?php echo h($_POST["mail"]); ?></p>
                                </div>
                             </div>

                             <div class="form_flex">
                                <div class="form_titles">
                                    添付ファイル
                                </div>
                                <div>
                                    <p class="confirm_item"><?php echo h($_FILES["upfile"]["name"]). "&emsp;"; echo round(h($_FILES["upfile"]["size"])/1000) . "KB"; ?><br />
                                    <span id="error_msg"><?= validation() ?></span></p>
                                </div>
                             </div>

                             <div class="form_flex">
                                <div class="form_titles">
                                    その他
                                </div>
                                <div>
                                    <p class="confirm_item"><?php echo nl2br(h($_POST["message"])); ?></p>
                                </div>
                             </div>

                             <div class="btn_wrapper">
                                 <p class="submit" id="submit">
                                     <input type="submit" name="submit" value="送信する" />
                                 </p>
                                 <p class="goback">
                                 <button type="button" onclick=history.back() name="goback" value="もどる" />もどる</button>
                                 </p>
                             </div>
                             <input type="hidden" name="name" value="<?php echo h($_POST["name"]); ?>">
                             <input type="hidden" name="job" value="<?php echo $your_job; ?>">
                             <input type="hidden" name="mail" value="<?php echo h($_POST["mail"]); ?>">
                            <input type="hidden" name="upfile" value="<?php echo h($_FILES["upfile"]["name"]); ?>">
                             <input type="hidden" name="message" value="<?php echo h($_POST["message"]); ?>">
                            <input type="hidden" name="recaptchaResponse" id="recaptchaResponse">
                         </form>
                     </div>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Masa-Y

    2019/05/14 08:17

    データベースは勉強を始めたばかりで、まだよく理解できていません。
    そちらから先に確認してみます。ありがとうございました。

    キャンセル

  • m.ts10806

    2019/05/14 10:33 編集

    「identification」 身分証明。また、識別番号 
    「識別番号」というほうが近いですね。「一意である」「一意でない」という表現は頻繁に出てくるので覚えておいてください。
    日本でいうと「マイナンバー」が最もいい例でしょう。1人1つしかありません。でも公開される情報ではなく、それだけ取扱注意のセキュアな情報です。
    要は「設定必須の項目でこれを指定して検索するだけで必ず1つだけが選択される特定可能な項目」です。
    良く分からないで使っているとセキュリティ的にもNGでバグだらけのシステムができあがります(もちろん作った人の手に負えないのでそのまま終了ですね)

    キャンセル

  • Masa-Y

    2019/05/14 11:36

    id の意味、覚えておきます
    本を買ったので読み込んでからもう一度やり直してみます。

    キャンセル

回答 1

0

入れ子構造がそもそもおかしいです。
function validation() を外に出すところからはじめて下さい。
インデントを整えると、どの{}が対応しているかわかりやすくなります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/14 08:21

    エラーメッセージを任意の場所に表示させたくて、関数で囲んでいました。
    見た目上は問題なく動いているので、大丈夫かと思ってしまいましたが、
    修正します、ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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