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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

1回答

502閲覧

プレースホルダーを利用して、DB追加をしたい。

hurozuki

総合スコア49

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2022/03/17 05:51

編集2022/03/17 07:48

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

前提・実現したいこと

プレースホルダーを使い、SQLへデータを追加したいです。

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

Warning: Undefined variable $dbh in C:\xampp\htdocs\プログラミング\result.php on line 13 Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\プログラミング\result.php:13 Stack trace: #0 C:\xampp\htdocs\プログラミング\register.php(21): UserLogic::createUser(Array) #1 {main} thrown in C:\xampp\htdocs\プログラミング\result.php on line 13

該当のソースコード

index.php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>ユーザー登録画面</title> 8</head> 9<body> 10 11 12 13<h2>ユーザー登録フォーム</h2> 14<form action="register.php" method="POST"> 15 <label for="username">ユーザー名:</label> 16 <input type="text" name="username" id="username"><br> 17 18 <label for="email">メールアドレス:</label> 19 <input type="email" name="email" id="email"><br> 20 21 <label for="password">パスワード:</label> 22 <input type="password" name="password" id="password"><br> 23 24 <label for="password_conf">パスワード確認:</label> 25 <input type="password" name="password_conf" id="password_conf"><br> 26 <input type="submit" value="新規登録"> 27</form> 28 29 30 31</body> 32</html>

register.php

1<?php 2require_once("result.php"); 3$err=[]; 4if(!$username=filter_input(INPUT_POST,"username")){ 5$err[]="ユーザー名を記入して下さい"; 6} 7if(!$email=filter_input(INPUT_POST,"email")){ 8 $err[]="メールアドレスを記入して下さい"; 9 } 10 $password=filter_input(INPUT_POST,"password"); 11 if(!preg_match("/\A[a-z\d]{8,100}+\z/i",$password)){ 12 $err[]="パスワードは英数字8文字以上100文字以下にして下さい"; 13 } 14 $password_conf=filter_input(INPUT_POST,"password_conf"); 15 if($password!==$password_conf){ 16 $err[]="確認用パスワードと異なっています。"; 17 } 18 19 if(count($err)===0){ 20 // ユーザー登録の処理 21 $hasCreated=UserLogic::createUser($_POST); 22 if(!hasCreated){ 23 $err[]="登録に失敗しました"; 24 } 25 } 26?> 27<!DOCTYPE html> 28<html lang="ja"> 29<head> 30 <meta charset="UTF-8"> 31 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 32 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 33 <title>ユーザー登録完了画面</title> 34</head> 35<body> 36 <?php if(count($err)>0): ?> 37 <?php foreach($err as $e): ?> 38 <p><?php echo $e ?></p> 39 <?php endforeach ?> 40 <?php else: ?> 41 <p>ユーザー登録が完了しました</p> 42 <?php endif ?> 43 <a href="index.php">戻る</a> 44 45</body> 46</html>

result.php

1<?php 2 3 4require_once("dbconnect.php"); 5class UserLogic{ 6 public static function createUser($userData){ 7 $sql="insert into users(name,email,password)values(:username,:email,:password)"; 8 $username=$userData["username"]; 9 $email=$userData["email"]; 10 $password=password_hash($userData["password"],PASSWORD_DEFAULT); 11 12 try{ 13 $stmt= $dbh->prepare($sql); 14 $stmt->bindParam(':username', $username, PDO::PARAM_INT); 15 $stmt->bindParam(':email', $email); 16 $stmt->bindParam(':password', $password); 17 $stmt->execute(); 18 19 }catch(PDOExeption $e){ 20 21 } 22 23 24 25 } 26} 27?> 28

dbconnect.php

1<?php 2 $dsn = 'mysql:host=localhost;dbname=portfolio2;charset=utf8'; 3 $user = 'root'; 4 $password = 'パスワードです'; 5 6 7 try{ 8 $dbh = new PDO($dsn, $user, $password,[ 9 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 10 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 11 ]); 12 }catch(PDOExeption $e){ 13 echo '接続失敗です'.$e->getMessage(); 14 exit(); 15 } 16?>

試したこと

$dbhがきちんと定義されているか
誤字脱字がないか

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

XAMPP
VSCodeを使ってます。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/03/17 06:16

パスワード文字列、晒しちゃって、いいのでしょうか?(そのまま本番環境では使わないでくださいね。)
hurozuki

2022/03/17 07:49

ご指摘ありがとうございます! ホントですね! 全く気づきませんでした。 ありがとうございます!
hurozuki

2022/03/17 07:50

パスワード変更致しました! 悪意ある人から嫌がらせを受けずに済みそうです!
guest

回答1

0

ベストアンサー

class UserLogic の
public static function createUser() における
$dbhが未定義ですね。

あまりお勧めしませんが、
global キーワード を使うとまずは解決する話です。

あるいは、classの初期化の際に$dbhを引き渡す方をお勧めします。
クラスのメンバーとして$dbhを保持しておくのが良いかもしれません。
クラス内からあまりグローバル変数を参照するのは、
どのクラスで何の変数を参照しているかを管理する必要が生じて良くないです。
(その class UserLogic を使うときは、必ず $dbh である必要が生じ、new PDO()しておく必要が生じるのは、面倒で使いづらいと感じます。)

DB接続周りを受け持つクラス(もしくはユーザー関数)が$dbhを設けたら、
class UserLogic のコンストラクタ __construct()
もしくは別途$dbhを渡すためのメソッドを定義して渡すのが
理想的ではないかなと思います。
PHP: コンストラクタとデストラクタ - Manual

繰り返しますが、グローバル変数の変数名に依存しない実装が良いです。
クラスの中で勝手にグローバル変数を参照してしまうことで、想定外のトラブルを招いたり、
変数名がバッティングしてしまったりすると、もう大変です。
(具体例を挙げられず、伝わりにくいとは思いますが。)

投稿2022/03/17 06:21

編集2022/03/17 09:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hurozuki

2022/03/17 08:09 編集

なるほど! createUser()の中に、 $dsn,$user,$password,$dbhを 入れたのですが、今度は、 エラーメッセージ Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'password' cannot be null in C:\xampp\htdocs\プログラミング\result.php:24 Stack trace: #0 C:\xampp\htdocs\プログラミング\result.php(24): PDOStatement->execute() #1 C:\xampp\htdocs\プログラミング\register.php(21): UserLogic::createUser(Array) #2 {main} thrown in C:\xampp\htdocs\プログラミング\result.php on line 24 と出てきました。 $stmt->execute(); が問題あるのでしょうか?
退会済みユーザー

退会済みユーザー

2022/03/17 09:57 編集

「createUser()の中に、$dsn,$user,$password,$dbhを入れた」とのことですが、どのように直したのかが見えないので、何とも言えません。 回答内に示した「global キーワード」を説明するページは、変数のスコープについても説明しているため、 一度お読みいただきたいです。 でないと、話が通じないので。 同じ変数名を使っているから、同じ値を使えるはず、という思い込みは捨ててください。
hurozuki

2022/03/22 03:56

返信遅れて申し訳ありません。 スコープについて無知でした。 クラス初期化の際に$dbhを引き渡したら上手くいきました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問