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

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

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

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

PHP

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

Q&A

解決済

1回答

1136閲覧

PHPに関して、データベースへの値の登録ができません

cawauchi

総合スコア4

PDO

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

PHP

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

0グッド

0クリップ

投稿2020/05/17 08:17

編集2020/05/17 08:55

前提・実現したいこと

データベースへの値の登録

発生している問題・エラーメッセージ

データベースと連携はできているのに入力した値がデータベースに登録されません
エラーは出ておらず、DB連携のtryは接続に成功しています。

該当のソースコード

php

1register.php 2<?php 3// ここでセッションに記録しないとページが遷移した時にPOSTの情報が保持されない 4session_start(); 5 6if (!empty($_POST)) { 7 8// フォームのバリデーション 9 if ($_POST['your_name'] =='') { 10 $error['your_name'] = 'blank'; 11 } 12 13 if ($_POST['email'] =='') { 14 $error['your_email'] = 'blank'; 15 } 16 17 if ($_POST['your_name'] =='') { 18 $error['your_name'] = 'blank'; 19 } 20 21 // 最初ここcount()で判定してたけどcountは配列の要素の数にしか使えないのだった 22 if (strlen($_POST['password']) < 4) { 23 $error['password'] = 'lnegth'; 24 } 25 26 if ($_POST['password'] != $_POST['password2']) { 27 $error['password'] = 'wrong'; 28 } 29 if (!isset($_POST['check'])) { 30 $error['check'] = 'empty'; 31 } 32 33 if (empty($error)) { 34 // $_POSTの情報を$_SESSION['join']の中に格納している 35 // 次のページで使うには$_SESSION['join']['hogeehoge']で利用できる 36 $_SESSION['join'] = $_POST; 37 header('Location:confirm.php'); 38 exit(); 39 } 40} 41 42print_r($error); 43 44?> 45<!DOCTYPE html> 46<html lang="ja"> 47 <head> 48 <meta charset="UTF-8" /> 49 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 50 <title>Document</title> 51 </head> 52 <body> 53 <form action="./register.php" method="post"> 54 <label for="name" 55 >お名前<br /> 56 <?php if($error['your_name'] === 'blank'): ?> 57 <p>空白です</p> 58 <?php endif; ?> 59 <input type="text" name="your_name" id="name" /> </label 60 ><br /><br /> 61 <label for="email" 62 >メールアドレス<br /> 63 <?php if($error['email'] === 'blank'): ?> 64 <p>空白です</p> 65 <?php endif; ?> 66 <input type="email" name="email" autocomplete="off"/> </label 67 ><br /><br /> 68 <label for="password" 69 >パスワード<br /> 70 <?php if($error['password'] === 'blank'): ?> 71 <p>空白です</p> 72 <?php endif; ?> 73 <?php if($error['password'] === 'length'): ?> 74 <p>長さがたりません</p> 75 <?php endif; ?> 76 <?php if($error['password'] === 'wrong'): ?> 77 <p>確認用のパスワードと違います</p> 78 <?php endif; ?> 79 <input type="password" name="password" id="password" /> </label 80 ><br /><br /> 81 <label for="password2" 82 >パスワード再入力<br /> 83 <input type="password" name="password2" id="password2" /> </label 84 ><br /><br /> 85 <label for="url" 86 >ホームページ<br /> 87 <input type="text" name="url" /> </label 88 ><br /><br /> 89 <label for="gender" 90 >性別<br /> 91 <input type="radio" name="gender" value="man" />男性 92 <input type="radio" name="gender" value="woman" />女性 </label 93 ><br /><br /> 94 <label for="age" 95 >年齢<br /> 96 <input 97 type="number" 98 name="age" 99 id="age" 100 placeholder="選択してください" 101 /> </label 102 ><br /><br /> 103 <label for="check"> <input type="checkbox" name="check" /> </label 104 >注意事項に同意する<br /><br /> 105 <?php if($error['check'] === 'empty'): ?> 106 <p>チェックがされていません</p> 107 <?php endif; ?> 108 <input type="submit" value="送信する" name="submited" /> 109 </form> 110 </body> 111</html> 112

PHP

1confirm.php 2<?php 3// if(!isset($_SESSION['join'])) { 4// header('Location:register.php'); 5// exit(); 6// } 7session_start(); 8 9require './db_connetction.php'; 10 11// htmlspecialcharsで入力でのXSS防止 12function h($str) { 13 return htmlspecialchars($str,ENT_QUOTES); 14} 15 16// データベースに入力ができない 17if(!empty($_POST)) { 18 $stmt = $pdo->prepare('INSERT INTO users SET name = ? , email = ? , password = ? , gender = ? , age = ?'); 19 $stmt->bindValue(1 , $_SESSION['join']['your_name']); 20 $stmt->bindValue(2 , $_SESSION['join']['email']); 21 $stmt->bindValue(3 , sha1($_SESSION['join']['password'])); 22 $stmt->bindValue(4 , $_SESSION['join']['gender']); 23 $stmt->bindValue(5 , $_SESSION['join']['age']); 24 $stmt-> execute(); 25} 26 27var_dump($_SESSION['join']); 28 29 30?> 31 32<!DOCTYPE html> 33<html lang="ja"> 34<head> 35<meta charset="UTF-8"> 36<meta name="viewport" content="width=device-width, initial-scale=1.0"> 37<title>Document</title> 38</head> 39<body> 40<form action="./thanks.php" method="post"> 41 <label for="name">お名前:<?php echo h($_SESSION['join']['your_name']) ?><br> 42 </label><br><br> 43 <label for="email">メールアドレス:<?php echo h($_SESSION['join']['email']) ?><br> 44 </label><br><br> 45 <label for="password">パスワード:表示されません<br> 46 </label><br><br> 47 <label for="url">ホームページ:<?php echo h($_SESSION['join']['url']) ?> 48 </label><br><br> 49 <label for="gender">性別:<?php echo h($_SESSION['join']['gender']) ?><br> 50 </label><br><br> 51 <label for="age">年齢<?php echo h($_SESSION['join']['age']) ?><br> 52 </label><br><br> 53 <p>この情報でお間違い無いですか?</p> 54 <input type="submit" value="間違い無いので送信する" name="submited"> 55</form> 56</body> 57</html>

php

1db_connection.php 2<?php 3 4const DB_HOST = 'mysql:dbname=udemy_php;host=127.0.0.1'; 5const DB_USER = 'php_user'; 6const DB_PASSWORD = 'password123'; 7 8 9try { 10 $pdo = new PDO(DB_HOST,DB_USER,DB_PASSWORD,[ 11 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 12 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 13 PDO::ATTR_EMULATE_PREPARES => false, 14 ]); 15 echo '接続成功'; 16 17} catch(PDOException $e){ 18 echo '接続失敗' . $e->getMessage() . "\n"; 19 exit(); 20};

試したこと

PDOメソッドの記入方法について調べ、それと同じように記述しました

補足情報(FW/ツールのバージョンなど)

PHP7.3

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

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

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

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

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

m.ts10806

2020/05/17 08:20

コードやエラーはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 また、質問テンプレート文言は削り、項目はなるべくすべて書いて埋めてください。 質問は編集できます。
guest

回答1

0

ベストアンサー

ざっとしか見てませんが

php

1$stmt =bindValue(1 , $_SESSION['join']['your_name']); 2$stmt =bindValue(2 , $_SESSION['join']['email']); 3$stmt =bindValue(3 , sha1($_SESSION['join']['password'])); 4$stmt =bindValue(4 , $_SESSION['join']['gender']); 5$stmt =bindValue(5 , $_SESSION['join']['age']); 6$stmt = execute();

ここ、エラー出てるんではないでしょうか。
PHP標準でbindValue()やexecute()という関数は存在しませんし提示されたコードにもそういう関数は存在しません。

本来PDOであればexecute()はPDOStatement のメソッドなので、PDO::prepareの返却値から呼び出すべきと思います。

※提示したPHPマニュアルのページをしっかり読み、機能確認してください。


蛇足:
header()の前に出力を書いてはいけません。

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

投稿2020/05/17 08:25

m.ts10806

総合スコア80850

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

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

cawauchi

2020/05/17 08:32

ありがとうございます! 質問文のマークアップの件失礼しました 確かにPDOメソッドなので記述が足りなかったかもしれません試してみます!
m.ts10806

2020/05/17 08:34

質問は編集できます。なるべく速やかに対応願います。 足りないのは「記述」ではなく「根本的なオブジェクト志向の理解」かと思います。書くことが目的になっていては理解に繋がりません。
cawauchi

2020/05/17 08:56

編集しました 回答ありがとうございました
cawauchi

2020/05/17 09:05

足りないのは「記述」ではなく「根本的なオブジェクト志向の理解」かと思います。書くことが目的になっていては理解に繋がりません。 正直なところ解決はしていませんがあなたがいうようにオブジェクト志向の理解が乏しく、理解するために時間がかかりそうなので一旦この問題から離れることにします
m.ts10806

2020/05/17 09:14

「実際は解決してないのに解決済みにする」のも問題ですよ。 後から見た人の参考になりません。(回答内容で解決は可能ですが、質問者が理解してない状態となると別です)
cawauchi

2020/05/17 09:19

なるほど、おっしゃる通りですね ただもうこの質問自体は解決済から戻すことができなそうなので次回の教訓とさせていただきますね
m.ts10806

2020/05/17 09:24

「受付中に戻す」ことはできますよ。 私自身は質問したことはないですが、何度も質問者のほうで受付中に戻してもらったことがあります。 オブジェクト指向への根本理解は確かに必要ですが、まずPHPマニュアルを確認してみませんか? そこで分からないことがあれば聞いてください。
cawauchi

2020/05/17 09:33

助かりますありがとうございます 受付中に戻すがどこを探しても出てこないです...
m.ts10806

2020/05/17 09:35

んーたぶん、そういうボタンがあるというより、高評価したあとにもう1回高評価押すみたいな感じだと思うんですが、質問したことがないゆえに、質問者本人の質問画面のUIが分からないので、色々やってみるしかないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問