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

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

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

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

PHP

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

Q&A

解決済

1回答

699閲覧

会員登録の機能が実装できません。

shuma_h

総合スコア1

phpMyAdmin

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

PHP

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

1グッド

0クリップ

投稿2022/04/07 02:02

編集2022/04/07 20:13

表題の件、簡単な会員登録の機能を作っています。
しかし、会員登録がうまく行きません。
言語:PHP
データベースに値を入れるのがうまくいっていないようです。
ページも遷移しません。
デザインはこんな感じです。

イメージ説明

DBには2回接続していて、どちらかを外すと機能するみたいです。
phpmyadminのほうの問題なのかもしれませんが、エラーが表示されないのでよくわかりません。
phpMyAdminではデータを閲覧したり、データを追加したりできます。

common.php <?php function dbconnect(){ $db = new mysqli('localhost:8889', 'root', 'root', 'bbs2'); if (! $db){ die($db->error); } return $db; } ?>
index.php <?php require('../common.php'); $db = dbconnect(); $form = [ 'name' => '', 'email' => '', 'password' => '', ]; $error = []; if ($_SERVER['REQUEST_METHOD'] == 'POST'){ $form['name'] = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING); if ( $form['name'] == '' ){ $error['name'] = 'blank'; } $form['email'] = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); if ( $form['email'] == '' ){ $error['email'] = 'blank'; }else{ // DB接続1回目 $stmt = $db->prepare('SELECT count(*) FROM members WHERE email=? '); if (! $stmt){ die($db->error); } $stmt->bind_param('s', $form['email']); $success = $stmt->execute(); if (! $success){ die($db->error); } $stmt->bind_result($cnt); $stmt->fetch(); if ( $cnt > 0){ $error['email'] = 'duplicate'; } } $form['password'] = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING); if ( $form['password'] == ''){ $error['password'] = 'blank'; }elseif ( strlen($form['password']) < 8 ){ $error['password'] = 'length'; } if ( empty($error)){ // DB接続2回目 $stmt = $db->prepare('INSERT INTO members(name, email, password) VALUES(?, ?, ?) '); if (! $stmt){ die($db->error); } $hash = password_hash( $form['password'], PASSWORD_DEFAULT); $stmt->bind_param('sss', $form['name'], $form['email'], $hash ); $success = $stmt->execute(); if (! $success){ die($db->error); } unset($_SESSION['form']); header('Location: ../login.php'); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="../style.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> <title>Document</title> </head> <body> <header></header> <div class="main-wrapper"> <h3>会員登録</h3> <form action="" method="post"> <div class="mb-3"> <label for="exampleFormControlInput1" class="form-label">ニックネーム</label> <input type="text" class="form-control" id="exampleFormControlInput1" name="name" value="<?php echo h($form['name']) ?>" placeholder=""> <?php if ( isset($error['name']) && $error['name'] == 'blank') :?> <p class="error">ニックネームを入力してください</p> <?php endif ?> </div> <div class="mb-3"> <label for="exampleFormControlInput1" class="form-label">メールアドレス</label> <input type="email" class="form-control" id="exampleFormControlInput1" name="email" value="<?php echo h($form['email']) ?>" placeholder="name@example.com"> <?php if ( isset($error['email']) && $error['email'] == 'blank') :?> <p class="error">メールアドレスを入力してください</p> <?php endif ?> <?php if ( isset($error['email']) && $error['email'] == 'duplicate') :?> <p class="error">指定されたメールアドレスはすでに登録されています</p> <?php endif ?> </div> <div class="mb-3"> <label for="exampleFormControlInput1" class="form-label">パスワード</label> <input type="password" class="form-control" id="exampleFormControlInput1" name="password" value="<?php echo h($form['password']) ?>" > <?php if ( isset($error['password']) && $error['password'] == 'blank') :?> <p class="error">パスワードを入力してください</p> <?php endif ?> <?php if ( isset($error['password']) && $error['password'] == 'length') :?> <p class="error">パスワードは8文字以上で入力してください</p> <?php endif ?> </div> <button type="submit" class="btn btn-primary">送信</button> </form> </div> </body> </html>

MySQLのポート番号が3306ではなく8889である理由。
→MAMPのMySQL情報が見れるところにそう書いてありました。

最後まで見ていただきありがとうございます。
もしお気づきの点がありましたら教えていただけると大変幸いです。
よろしくお願いいたします。

sarutoru👍を押しています

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

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

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

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

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

miyabi-sun

2022/04/07 09:56 編集

> phpmyadminのほうの問題なのかもしれません そのphpMyAdminは数あるMySQLクライアントの選択肢の中の一つです。 つまり、MySQLサーバが稼働しているか、使えるかを「確認する目的」に使えるツールではありますが、 MySQLサーバそのものとは何の相関もありません。 phpMyAdminでMySQLのデータ部分にアクセス出来るなら「質問文のコードが悪かったね」という事で 改めて問題の切り分けが出来て質問文のコードに集中できますし、 phpMyAdminで閲覧出来ないのであれば、そもそもMySQLサーバの準備すら出来ていない可能性などがあり、質問文の大部分が関係ないノイズになってしまうわけです。 その辺のニュアンスが「phpmyadminのほうの問題なのかもしれませんが……」では読み取れず「知らんがな」としか返せません。 一度phpMyAdmin越しにあれこれ触ってみて、値を閲覧したり登録出来るか試してみてください。 そしてそれが可能か、不可能かを「編集」機能を用いて回答者達に知らせてください。 > `$db = new mysqli('localhost:8889', 'root', 'root', 'bbs2');` 何故MySQLのポート番号が3306ではなく8889なんですか? これに関しての言及もほしいとこですね。 例えば利用しているレンタルサーバの設定がそうなってますとかで大丈夫です。 phpMyAdmin等でこのポート番号で動作する事を確認しました等の情報が添えてあると完璧です。 > `?>\n\n<!DOCTYPE html>` HTMLはファイルの先頭1文字目がDOCTYPE宣言である必要があります。 今回のコードではこの箇所で改行2個挟んでいる為、不正なHTMLファイルになってしまっています。 これ理解しているエンジニアであってもうっかり改行の罠があるため、 PHPのコードしか記述しないケースでは`?>`の記述を省略するというテクニックがありまして、 このテクニックを公式が推奨していたりします。 https://www.php.net/manual/ja/language.basic-syntax.phptags.php
miyabi-sun

2022/04/07 10:10

追記ありがとうございます。 なるほど、MAMPで環境構築したんですね。
guest

回答1

0

ベストアンサー

一見いけそうな気もしますね。
いきなり大型機能に取り組む大博打をしてしまうと、どこが動いていないのか判断出来ないという失敗に陥りがちです。
銀の弾丸はなく、こういう時は小さな単位で絞り込んでいく地道な作業が重要になります。

長い目で見たら細かく関数に分けるとか、
オブジェクト指向プログラミングで作業を分担させていく事になります。
そのうちパーツ片があちこち散らばって覚えるのが辛い……という事になるので、
Laravelみたいなフレームワークを使う事を視野に入れると良いです。

さて、mysqliのエラー処理を探してみましょう。

参考記事: PHP: mysqli

例3 手動によるエラーハンドリング
エラーの報告機能が無効になっている場合、 開発者がエラーのチェックとエラー処理を行う必要があります。

php

1$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 2if ($mysqli->connect_errno) { 3 throw new RuntimeException('mysqli connection error: ' . $mysqli->connect_error); 4} 5 6/* Set the desired charset after establishing a connection */ 7$mysqli->set_charset('utf8mb4'); 8if ($mysqli->errno) { 9 throw new RuntimeException('mysqli error: ' . $mysqli->error); 10}

エラーが出たらこういう確認してくださいねと公式が言ってますが、

質問文ではif (! $db)で確認してます。
クラスをnewしてインスタンス作ったら常にtrueとして判定される値になるのでは?
なので多分if文の中身は実行されませんね。
そして中身のdie($db->error)$dbがnullなのを期待してるはずなのに、->というプロパティアクセスになってしまっています。

PHPでDBを操作する記事を読んで作ってみたけど、
この箇所のエラー部分は想像で書いてしまったとかでしょうか?
まぁありがちっちゃありがちです。

php

1// common.php 2<?php 3function dbconnect(){ 4 $db = new mysqli('localhost:8889', 'root', 'root', 'bbs2'); 5 if ($mysqli->connect_errno){ 6 throw new RuntimeException('mysqli connection error: ' . $db->connect_error); 7 } 8 return $db; 9}

commonはこれで一旦様子を見るとして、
もっとしょぼい、確認するだけのファイルを作って動作を検証してみるのが分かりやすいですね。
これ動作しますか?確認してみてください。

php

1// check.php 2<?php 3require('../common.php'); 4$db = dbconnect(); 5 6$result = $mysqli->query("SELECT * FROM members"); 7print_r($result->fetch_all(MYSQLI_ASSOC));

これが動作するのであれば、
DBを操作する箇所ではなく、フォームのPOST値を管理している条件分岐のコードが駄目な可能性が高いという推測が出来ます。

投稿2022/04/07 10:45

miyabi-sun

総合スコア21158

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

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

shuma_h

2022/04/07 11:13

回答ありがとうございます。 試したところ、DBの内容がfetchできていました。 条件分岐のほうが間違えていないか確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問