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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

XAMPP

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

Q&A

解決済

3回答

6047閲覧

このコードでなんでエラーになるのか分からないのですが理由を教えて頂けませんでしょうか。

potet

総合スコア17

PHP

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

XAMPP

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

0グッド

0クリップ

投稿2020/05/20 11:30

編集2020/05/20 12:17
<?php try{ $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51'); }catch(PDOException $e){ echo 'DB接続エラー:'.$e->getMessage(); } ?>
<?php require('dbconnect.php');?> <!doctype html> <html lang ="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel ="stylesheet" href="css/style.css"> </head> <body> <h2>practice</h2> <?php $memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5'); ?> <article> <?php while ($memo=$memos->fetch()):?> <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50));?></a></p> <time><?php print($memo['created_at']);?></time> <hr> <?php endwhile; ?> </article> </body>

15行目を下記に変更するとエラーが出なくなりますが、h2タグで囲ったPracticeだけが表示されます。

<?php require('dbconnect.php');?> <!doctype html> <html lang ="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel ="stylesheet" href="css/style.css"> </head> <body> <h2>practice</h2> <?php $memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5'); $memos->bindParam(1,$_REQUEST['page'],PDO::PARAM_INT); $memos->execute(); ?> <article> <?php while ($memo=$memos->fetch()):?> <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50));?></a></p> <time><?php print($memo['created_at']);?></time> <hr> <?php endwhile; ?> </article> </body>

Fatal error: Uncaught Error: Call to a member function fetch() on bool in C:\xampp\htdocs\memo\index.php:19 Stack trace: #0 {main} thrown in C:\xampp\htdocs\memo\index.php on line 19

上記がエラー文です。
![イメージ説明]
イメージ説明

15行目のlimit句が使えず困っています。データは入れていてlimit句を使おうとしたらエラーが出ました。
よろしくお願いします。

利用環境:win10
xamppを使ってます。

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

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

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

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

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

y_waiwai

2020/05/20 11:32

コードをテキストで提示しましょう
potet

2020/05/20 11:38

変更させて頂きました。
guest

回答3

0

ベストアンサー

PHP

1$memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5');

PHP

1$memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5');

LIMITの前に全角スペースが入っています

SQL文法ミスに気づけない原因

PHP

1 $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51');

が学習用としては最悪なコードです。

PDOはデフォルトではSQLの文法ミスがあった場合にエラーを吐いてくれません。
PHPマニュアル: エラーおよびエラー処理

PHP

1<?php 2$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 3$user = 'dbuser'; 4$password = 'dbpass'; 5 6try { 7 $dbh = new PDO($dsn, $user, $password); 8 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9} catch (PDOException $e) { 10 echo 'Connection failed: ' . $e->getMessage(); 11}

の様な形で、オプションを指定してげることでSQLに文法エラーがあった時に例外が発生し、エラー内容を補足することが出来るようになります。


質問にあるコードだと、dbconnect.php

PHP

1try{ 2 $db=new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8','root','s@kana51'); 3 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4}catch(PDOException $e){ 5 echo 'DB接続エラー:'.$e->getMessage(); 6} 7

PHP

1try{ 2 $memos=$db->query('SELECT * FROM memos ORDER BY id LIMIT 0,5'); 3 $memos->bindParam(1,$_REQUEST['page'],PDO::PARAM_INT); 4 $memos->execute(); 5}catch(Exception $e){ 6 die($e->getMessage()); 7} 8

という感じにすればSQLエラーがあるという事に気づけたはずです。


デバッグが出来ないコードを掲載する教材は変えた方が良いと思います。

投稿2020/05/20 13:06

編集2020/05/20 13:17
tanat

総合スコア18727

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

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

potet

2020/05/20 13:27

ご回答ありがとうございます。 全角スペースが原因でした。ありがとうございました。 教材変更は考えておきます。
tanat

2020/05/20 13:33

解決したようでよかったです。 全角スペースはありがちな問題なので `atom 全角スペースを表示`あたりで検索してみて、全角スペースの混入に気づきやすい設定にするのもお勧めです。
potet

2020/05/20 14:23

ご回答ありがとうございます。 全角スペースの設定にしました。ありがとうございました。
guest

0

function fetch() on bool
って書いてるからbool型に対してfetch関数呼び出してるからだと思います
PDO::query
FALSE返すときもあるから何らかの原因で失敗してるのでは

投稿2020/05/20 11:41

rururu3

総合スコア5545

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

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

potet

2020/05/20 11:56

ご回答ありがとうございます。 limit句を付け足す前はエラー出ずに表示されていたので、limit句だと思っていたのですが違ったのですね。$memosがfalseを返しているという事ですかね。
potet

2020/05/20 12:13

ご回答ありがとうございます。そういう事なんですね。 ありがとうございます。あまりよく分かってないですが調べてみます。
guest

0

PHP - [PHP,SQLite,PDO]Call to a member function fetch() on boolean|teratail と同じパターンじゃないですかね。そもそも $memos が false になっているという。

未解決のまま、放置されてるけど…

今一度、SQL が実行可能か確認されてはいかがでしょうか?

投稿2020/05/20 11:47

Yasumichi

総合スコア1773

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

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

potet

2020/05/20 12:03

ご回答ありがとうございます。 SQLの実行可能か確認ってどうやるんですか。limit句を消せば一応SQLは動きます。
Yasumichi

2020/05/20 12:13

mysql のコマンドなり、phpMyAdmin で実行できるかを確認できると思います。 LIMIT 0,5 → LIMIT 5 にしたらどうなりますか?
Yasumichi

2020/05/20 12:23

あとは、上に書いたリンク先で try { } catch (PDOException $e) { var_dump($e); } を使ってみるかですかね。
potet

2020/05/20 12:31

ご回答ありがとうございます。 LIMIT5にしたら 今までと変わらずエラーが出ます。 SQL実行できないです。ちょっと出来るようにやってみます。
potet

2020/05/20 12:32

それを貼り付ければいいんですね。やってみます。
Yasumichi

2020/05/20 13:00 編集

try { エラーが出るコード } catch (PDOException $e) { var_dump($e); } みたいにしないと別のエラーになると思います。  あと、PDO の内部で LIMIT を使っている場合があるらしく、二重で LIMIT が指定されてエラーになるという記事も見かけました。裏は取れてないですが。
potet

2020/05/20 13:21

わざわざありがとうございます。頭に入れておきます。
Yasumichi

2020/05/20 13:23 編集

とりあえず、tanat さんの回答とおり、全角スペースが原因みたいですね。
potet

2020/05/20 13:26

基本的ミスですみませんでした。yasumichiさんに教えて頂いたこと覚えておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問