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

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

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

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

PHP

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

Q&A

1回答

345閲覧

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

Masa-Y

総合スコア30

MySQL

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

PHP

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

0グッド

1クリップ

投稿2019/05/13 22:13

編集2019/05/13 22:35

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

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

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

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

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

php

1【confirm.php】 2 3$page_flag = 0; 4 5if( !empty($_POST['confirm']) ) { 6 $page_flag = 1; 7 8 9function validation(){ 10 11 try { 12 13 if (!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])) { 14 throw new RuntimeException('パラメータが不正です'); 15 } 16 17 switch ($_FILES['upfile']['error']) { 18 case UPLOAD_ERR_OK: // OK 19 break; 20 case UPLOAD_ERR_NO_FILE: // ファイル未選択 21 throw new RuntimeException('ファイルが選択されていません'); 22 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 23 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 (設定した場合のみ) 24 throw new RuntimeException('ファイルサイズが大きすぎます'); 25 default: 26 throw new RuntimeException('その他のエラーが発生しました'); 27 } 28 29 30 if ($_FILES['upfile']['size'] > 1000000) { 31 throw new RuntimeException('ファイルサイズが大きすぎます'); 32 } 33 34 35 if (!$ext = array_search( 36 mime_content_type($_FILES['upfile']['tmp_name']), 37 array( 38 'jpg' => 'image/jpeg', 39 ), 40 true 41 )) { 42 throw new RuntimeException('ファイル形式が不正です'); 43 } 44 45 if (!move_uploaded_file( 46 $_FILES['upfile']['tmp_name'], 47 $path = sprintf('./files/%s.%s', 48 sha1_file($_FILES['upfile']['tmp_name']), 49 $ext 50 ) 51 )) { 52 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 53 } 54 55 chmod($path, 0644); 56 57 return null; 58 59 } catch (RuntimeException $e) { 60 61 return $e->getMessage(); 62 63 } 64 65} 66 67 68 if (isset($_POST['job']) || is_array($_POST['job'])) { 69 $your_job = implode("、", $_POST["job"]); 70 } 71} elseif( !empty($_POST['submit']) ) { 72 $page_flag = 2; 73 74 //データベース接続 75 define('DB_DATABASE', 'xxxxxxx_db'); 76 define('DB_USERNAME', 'xxxxxx_user'); 77 define('DB_PASSWORD', 'xxxxxx'); 78 define('DB_DSN', 'mysql:host=mysqlxxx.xxxxxx.ne.jp;dbname=' . DB_DATABASE. ';charset=utf8'); 79 80 try { 81 $pdo = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 82 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 83 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 84 85 } catch (PDOException $e) { 86 echo $e->getMessage(); 87 exit; 88 } 89 90 try { 91 $pdo->beginTransaction(); 92 $sql = "INSERT INTO engineer(no, name, job, mail, img_file, message) VALUES(?,?,?,?,?,?)"; 93 $stmh = $pdo->prepare($sql); 94 $id = null; 95 $stmh->bindValue(1, $id, PDO::PARAM_INT); 96 $stmh->bindValue(2, h($_POST["name"]), PDO::PARAM_STR); 97 $stmh->bindValue(3, $your_job, PDO::PARAM_STR); 98 $stmh->bindValue(4, h($_POST["mail"]), PDO::PARAM_STR); 99 $stmh->bindValue(5, h($_FILES["upfile"]["name"]), PDO::PARAM_STR); 100 $stmh->bindValue(6, h($_POST["message"]), PDO::PARAM_STR); 101 $stmh->execute(); 102 } catch (PDOException $e){ 103 $pdo->rollBack(); 104 echo "エラー:" . $e->getMessage(); 105 } 106 107 //自動返信メール送信 108 require_once('mail.php'); 109} 110?>

php

1【confirm.php】 2 <div class="contact_form_wrapper px-3"> 3 <form class="confirm_form" action="" method="post"> 4 <input type="hidden" name="scroll_top" value="" class="st"> 5 6 <div class="form_flex"> 7 <div class="form_titles"> 8 お名前 9 </div> 10 <div class="confirm_item"> 11 <p><?php echo h($_POST["name"]); ?></p> 12 </div> 13 </div> 14 15 <div class="form_flex"> 16 <div class="form_titles"> 17 ご職業 18 </div> 19 <div> 20 <p class="confirm_item"><?php echo $your_job; ?></p> 21 </div> 22 </div> 23 24 <div class="form_flex"> 25 <div class="form_titles"> 26 メールアドレス 27 </div> 28 <div> 29 <p class="confirm_item"><?php echo h($_POST["mail"]); ?></p> 30 </div> 31 </div> 32 33 <div class="form_flex"> 34 <div class="form_titles"> 35 添付ファイル 36 </div> 37 <div> 38 <p class="confirm_item"><?php echo h($_FILES["upfile"]["name"]). "&emsp;"; echo round(h($_FILES["upfile"]["size"])/1000) . "KB"; ?><br /> 39 <span id="error_msg"><?= validation() ?></span></p> 40 </div> 41 </div> 42 43 <div class="form_flex"> 44 <div class="form_titles"> 45 その他 46 </div> 47 <div> 48 <p class="confirm_item"><?php echo nl2br(h($_POST["message"])); ?></p> 49 </div> 50 </div> 51 52 <div class="btn_wrapper"> 53 <p class="submit" id="submit"> 54 <input type="submit" name="submit" value="送信する" /> 55 </p> 56 <p class="goback"> 57 <button type="button" onclick=history.back() name="goback" value="もどる" />もどる</button> 58 </p> 59 </div> 60 <input type="hidden" name="name" value="<?php echo h($_POST["name"]); ?>"> 61 <input type="hidden" name="job" value="<?php echo $your_job; ?>"> 62 <input type="hidden" name="mail" value="<?php echo h($_POST["mail"]); ?>"> 63 <input type="hidden" name="upfile" value="<?php echo h($_FILES["upfile"]["name"]); ?>"> 64 <input type="hidden" name="message" value="<?php echo h($_POST["message"]); ?>"> 65 <input type="hidden" name="recaptchaResponse" id="recaptchaResponse"> 66 </form> 67 </div>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/05/13 22:26

コードにバリデーションを行う箇所がありません。 質問とコードが矛盾しているので、提示内容のいずれかが間違っています。 質問がブレますので整理して提示し直して下さい。
Masa-Y

2019/05/13 22:36

追加修正しました。
m.ts10806

2019/05/13 22:41

idがnull固定の意味がわかりません。idという意味を理解して使っているのでしょうか。 このテーブルにはPrimaryKeyは設定されてますか? どうやって「この投稿」と特定させるつもりですか? DBの正規化のほうが先のように思います
Masa-Y

2019/05/13 23:17

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

2019/05/14 01:35 編集

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

2019/05/14 02:36

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

回答1

0

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

投稿2019/05/13 22:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Masa-Y

2019/05/13 23:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問