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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

解決済

1回答

9768閲覧

【エラー解決できない】Fatal error: Uncaught Error: Call to a member function bind_param() on bool in …

narururu

総合スコア170

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

0クリップ

投稿2020/06/16 04:09

解決したい課題

エラーを解決したい。

コード

check_buyer.php

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <?php if(!empty($_POST["username"]) && !empty($_POST["password"])){ $DBHOST = "localhost"; $DBUSER = "root"; $DBPWD = "xxxxx"; $DBNAME = "xxxxxx"; $conn = new mysqli($DBHOST, $DBUSER, $DBPWD, $DBNAME); if($conn->connect_error){ die("接続失敗".$conn->connect_error); } $username = $_POST["username"]; $password = $_POST["password"]; $hashed = password_hash($password, PASSWORD_DEFAULT); $statement = "SELECT * FROM buyer WHERE username=?"; $stmt = $conn->prepare($statement); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows>=1){ $value = "duplicate"; header("Location:add_buyer?buyer=$value"); }else{ $statement = "INSERT INTO buyer(username, password) VALUES(?,?)"; $stmt = $conn->prepare($statement); $stmt->bind_param("ss", $username, $hashed); $stmt->execute(); $value = "successful"; header("Location:add_buyer?buyer=$value"); } /* ユーザが重複していないか確認 */ $conn->close(); } else{ header("Location:add_buyer.php"); } ?> </body> </html>

エラー

ブラウザでcheck_buyer.phpを読み込むと以下エラーが表示される。

Fatal error: Uncaught Error: Call to a member function bind_param() on bool in C:\xampp2\htdocs\check_buyer.php:30 Stack trace: #0 {main} thrown in C:\xampp2\htdocs\check_buyer.php on line 30

30行目は

$stmt->bind_param("s", $username);

の箇所です。

原因が全く分からず。。
上記コードで何か不備がありましたらご指摘お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接のエラー原因の特定

まずはエラーを読んで問題個所を厳密に特定しましょう

Fatal error: Uncaught Error: Call to a member function bind_param() on bool in C:\xampp2\htdocs\check_buyer.php:30 Stack trace: #0 {main} thrown in C:\xampp2\htdocs\check_buyer.php on line 30

なので、
bind_param()on boolから使っているというエラーです。
(booltrueとかfalseの事です。)

で、bind_param()を使っているのは
$stmt->bind_param("s", $username);
です。
$stmtが想定してるオブジェクトでは無く、trueかfalseが入ってしまっている訳です。

PHP

1var_dump($stmt); 2die(); 3$stmt->bind_param("s", $username); 4

とすれば、$stmtに実際のところ何が入っているか確認できます。
多分falseが入っているんだと思います。
(出来ればvar_dump()では無く、xdebugを導入してブレークポイントを仕掛けられる環境を作ることをお勧めします)

直接のエラー原因は
$stmtにbool値が入っているのにチェックせずにbind_param()を使っていること
となります。

エラー発生個所の特定

$stmtに想定外の値が入っているという事は、$stmtが生まれているところに何か問題があるという事になるので、

PHP

1 $statement = "SELECT * FROM buyer WHERE username=?"; 2 3 $stmt = $conn->prepare($statement);

この辺に問題がありそうです。

発生個所のメソッドの仕様確認

この場合、まずはprepare()がどの様な値を返却する可能性があるのかをPHPマニュアルで確認します。
https://www.php.net/manual/ja/book.mysqli.php
にあるリンクから

mysqli::prepare
を確認してみると

返り値 ¶
mysqli_prepare() はステートメントオブジェクトを返します。 エラー時には FALSE を返します。

とあるので、何かエラーが発生しているっぽいです。

エラー出力

エラーを以下を参考にして出力して、エラーに沿った解決を図ります。
mysqli::$error
Mysqliのプリペアドステートメントのエラーレポートについて(PHP)

エスパー的に予想すると、
テーブル定義とSQL文の記述が一致していないとかだと思います。

修正方針

エラーをなくすだけであれば、出力したエラーに沿って修正すればとりあえず動く様になるはずです。

が、各ページのサンプルでも書いてありますが、mysqli関係の関数/メソッドは失敗時にfalseを返すことがあるので、

php

1if($stmt = $conn->prepare($statement)){ 2 //成功時の処理を書く 3}else{ 4 //失敗時のエラー出力を書く 5} 6 7

という感じにしないと実用に耐えません。
それぞれのメソッドの仕様をPHPマニュアルで確認しつつ、都度都度チェックを挟む必要があります。

感想

コードの質としては、以下の理由から学習にはかなり向いていないコードの品質です

  1. mysqli関数で必須となるチェックが省かれており、学習者がデバッグが出来ない(まさに今の状態)になるため、ちょっとでもミスったら書籍の最初から全部なぞりなおさないと解決できない
  2. mysqli関数自体が古く、新しく作られるプロダクトで採用されることは無いためとても微妙。WordPress等既存のプロダクトを主に触る等の明確な目的が無い限りはPDO以外で学習するのはとても微妙です。

投稿2020/06/16 05:02

編集2020/06/16 05:06
tanat

総合スコア18709

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

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

narururu

2020/06/16 05:22

ご回答ありがとうございます!tanatさん☺ ご丁寧に解説していただき助かります。 他の方たちも同様に、PDO以外での学習はおすすめしていないと言われました。 折角購入した教材ですが、思い切って捨てることにしました。 PDO形式で学習し直したいと思いますが、現在、今使っている教材以外無くて困りました。 オークションシステムを構築して仕組みを理解できるようになりたいのですが、 何かおすすめの教材などありますでしょうか。。 初心者なので、教材と目的の成果物を決めないと、進めることができず。。
tanat

2020/06/16 05:37

私もなのですが、teratailで回答している人って初学者向けの入門書を買う機会が無いので中々お勧めできる教材が無いというのと 教材は人によって向き不向きがるので、実際に使ってみないとわからない(特に独学だとその傾向が強い) というところがあるので、ご自身で色々買ってみる(大きめの書店があるなら実際に読んでみる)のをお勧めします。 合わないものはAmazonマーケットプレイス等で売っちゃえば結構な割合を回収できるので、そこまで思い切った投資は必要ないと思います。 また、 progateなどのweb教材を無料コースで試してみて、良い感じだったら有料コースを使うというもの良い選択肢の一つだと思います。
narururu

2020/06/16 05:43

今使ってる教材は返品しました。 そして、これからprogateでPHPを学習し、自分でオークションサイトを作ってみます! がんばります。 何から何までご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問