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

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

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

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

Q&A

解決済

1回答

9738閲覧

Uncaught Error: Call to a member function execute() on booleanが出てしまう。

kalon

総合スコア198

PHP

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

0グッド

0クリップ

投稿2018/04/21 04:49

編集2018/04/21 05:06

皆様いつもお世話になっております。

実行環境は以下の通りです:
PHP:7.2.1
phpMyAdmin:4.7.7
MySQL:5.6.38

各商品に商品コードを付けようと思い、ランダムに商品コードを生成し、すでに同じ商品コードが存在する場合、もう一度商品コードを生成するようなプログラムを書いています。しかし、以下のようなエラーが起きてしまい手詰まりしてしました。

エラー文は

Fatal error: Uncaught Error: Call to a member function execute() on boolean in /Applications/MAMP/htdocs/Practices/checkDouble.php:14

と出てしまいます。

以前ご指導いただいたコードを参考に2時間以上、試行錯誤を繰り返してみましたが、どうしてもこのエラーが出てしまいます。原因となるカ所も特定し、?プレースメントやバインドなどいろいろな手を尽くしましたが、結局分からずじまいでした。

PHP

1<?php 2 3function connectSQL(){ 4 $user = "root"; 5 $pass = "root"; 6 $dbh = new PDO("mysql:host=localhost;dbname=todo;charaset=utf8", $user, $pass); 7 return $dbh; 8} 9 10function checkDouble($code){ 11 $dbh = connectSQL(); 12 $stmt = $dbh->query("select count(*) from test where code = ?"); 13 //$stmt->bindParam(':code',$code, PDO::PARAM_STR); 14 $stmt->execute([$code]); 15 echo "バグチェック:異常なし"; //↑がエラーの原因と思われる。 16 $totalCode = (int)$stmt->fetchColumn(); 17 $stmt = NULL; 18 if ($totalCode > 0){ 19 $newCode = remakeCode(); 20 echo "重複あり"; 21 return $newCode; 22 }else{ 23 echo "重複なし"; 24 25 } 26 27} 28 29function remakeCode(){ 30 $prod_code = substr(str_shuffle("1234567890"), 0, 5); 31 return $prod_code; 32} 33 34$code = 12345; 35$code = checkDouble($code);

何故このようなエラーが起き、どうしたらこのエラーを解決できるでしょうか、ご教授のほどよろしくお願いします。

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

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

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

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

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

s8_chu

2018/04/21 05:02

質問者さんがそのコードを何をするために書いたのか、を追記したほうが良いと思います。
kalon

2018/04/21 05:07

ご指摘ありがとうございます。修正いたしました。
guest

回答1

0

ベストアンサー

以下のようなテーブルを作り、

SQL

1CREATE TABLE `todo`.`test` ( 2 `id` INT(255) UNSIGNED NOT NULL AUTO_INCREMENT, 3 `code` VARCHAR(255) NOT NULL, 4 PRIMARY KEY (`id`) 5) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE utf8mb4_unicode_ci;

このようなデータを入れました。

SQL

1INSERT INTO `test` (`id`, `code`) 2VALUES 3 (NULL, '123'), 4 (NULL, '124'), 5 (NULL, '125'), 6 (NULL, '126'), 7 (NULL, '127')

質問文のコードを以下のように修正したところ、無事質問者さんの想像する動作になることが確認できました。

PHP

1<?php 2 3function connectSQL() 4{ 5 $user = "root"; 6 $pass = "password"; 7 $dbh = new PDO("mysql:host=localhost;dbname=todo;charaset=utf8", $user, $pass); 8 return $dbh; 9} 10 11function checkDouble($code) 12{ 13 $dbh = connectSQL(); 14 $stmt = $dbh->prepare("select count(*) from test where code = ?"); 15 $stmt->execute([$code]); 16 $totalCode = (int)$stmt->fetchColumn(); 17 if ($totalCode > 0) { 18 $newCode = remakeCode(); 19 echo "重複あり"; 20 return $newCode; 21 } else { 22 echo "重複なし"; 23 } 24} 25 26function remakeCode() 27{ 28 $prod_code = substr(str_shuffle("1234567890"), 0, 5); 29 return $prod_code; 30} 31 32$codes = [ 33 123, 34 12345, 35 68, 36 125, 37 1 38]; 39foreach ($codes as $code) { 40 echo " 入力されたコード: $code, 再作成されたコード" . (checkDouble($code) ?? "なし") . "<br>"; 41}

投稿2018/04/21 05:28

s8_chu

総合スコア14731

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

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

kalon

2018/04/21 05:53

ありがとうございます。こちらでの正常動作を確認いたしましt。 $dbh->queryではなく$dbh->prepareとすべきだったのですね。勉強になしました。
s8_chu

2018/04/21 05:59

> $dbh->queryではなく$dbh->prepareとすべきだったのですね。 原因を書き忘れていましたが、そのとおりです。2つの違いについてはこちら(https://teratail.com/questions/38928)が参考になると思います。
kalon

2018/04/22 09:03

親切にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問