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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

1443閲覧

関数化の過程でFatal error:

Wingmacbook

総合スコア17

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/10/23 05:25

編集2021/10/23 05:59
  • 現状

下のfetch部分の関数化しようと試みたところ、下のようなエラーが吐かれた。

function getName(){ $result = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); } $getName = getName(); echo $getName; echo "<br>";
Fatal error: Uncaught Error: Call to a member function fetchAll() on null in /var/www/html/index.php:50 Stack trace: #0 /var/www/html/index.php(60): getName() #1 {main} thrown in /var/www/html/index.php on line 50

エラー文にある「line 50」はfunction内の「$result = $stmt->fetchAll(PDO::FETCH_ASSOC);」に、
「line 60」は「$getName = getName();」にあたります。

  • 考えられること/試してみたこと

エラー文を紐解くと、feachAllが正常に動作しないという事が分かり、
「$result = $stmt->fetchAll(PDO::FETCH_ASSOC);」の「PDO::FETCH_ASSOC」部分に原因があるとまでは考えられました。
しかし、具体的にその先をどのようにするかの筋道が見えません。

どなたか解決策の教授をしてもらえないでしょうか?

  • 追記

コメントいただいた方から、「$stmtの定義がない」という指摘をいただきましたが、
すいません、書いてなかっただけでfunction部分の前の部分であります。
そのため、

$sql = "SELECT * FROM `users`,`user_id` LIMIT 20"; $stmt = $dbh->prepare($sql);//←ここが$stmtの定義 $stmt->execute(); function getName(){ $result = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); } $getName = getName(); echo $getName; echo "<br>";

が、現状のコードです。
DBからusers,user_idを20件取り出し、ブラウザ上に表示させる過程で関数化をしようとしています。
改めて、解決方法をどなたかご教授おねがいします。

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

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

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

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

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

m.ts10806

2021/10/28 22:59

回答に変更はないです。 変数のスコープの問題。
guest

回答3

0

そもそも$stmtという変数が定義なしにいきなり使われています。
未定義変数は扱いとしてはnullなので、「nullにはそんな関数はいない(意訳。正確には”nullから関数が呼び出された”)」 とエラーに書かれています。

すいません、書いてなかっただけでfunction部分の前の部分であります。

スコープが違います。

こうやってるのと同じ。

php

1$a = "test"; 2function b(){ 3 echo $a; 4} 5b();

globalするか(個人的には非推奨)
引数で渡すか(簡単にはできるけど、全体の作りとかにもよる)
クラスにしてプロパティとして参照させるか(個人的には推奨)

して、確実に必要な情報を参照させてください。

投稿2021/10/23 05:32

編集2021/10/23 08:47
m.ts10806

総合スコア80854

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

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

0

とりあえず引数で渡せば解決します。

php

1function getName(&$stmt){ 2 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 3 print_r($result); 4} 5 6$getName = getName($stmt); 7echo $getName; 8echo "<br>";

以下の点気になりますが設計の問題ですね。

  • 引数のPDOStatementexecuteされていることを前提としている
  • getXxxxというメソッドは何かしら返り値を期待する
  • というか返り値を期待した使われ方をしているが実際なにもreturnしてない

m.ts10806さんが指摘されているスコープについても重要な概念なので、
今後もプログラムを書くご予定があるならこの機会に調べてみたほうがいいかと思います。
理解していないとこれからもハマり続けると思います。

投稿2021/10/29 12:05

KAOsaka

総合スコア531

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

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

m.ts10806

2021/11/07 00:04

あぁ質問者さんこちらのコードそのままでしたね。 参照渡しにする意味と返却してないのに返却値を使おうとする意図は何でしょうか
KAOsaka

2021/11/08 08:37

本スレッドは`Uncaught Error: Call to a member function fetchAll() on null`に対する解決策を質問しているスレッドです。まずその点ご理解ください。返却してないのに返却値を使おうとしている部分は質問者さんのコードの原文ママです。意図は分かりかねます。また、参照渡しにしている意味ですが、`$stmt`が破壊的メソッドを含むためです。
guest

0

自己解決

解決しました!

KAOsakaさんの説明の通り、
下のように「&$stmt」を引数で渡すかたちでエラーが解消されました。

function getName(&$stmt){ $result = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); } $getName = getName($stmt); echo $getName;

返信された方のおっしゃる通り、スコープについての理解がまだ曖昧なので、一度調べてみようと思います。
ありがとうございました。

投稿2021/11/06 14:10

Wingmacbook

総合スコア17

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

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

m.ts10806

2021/11/07 00:02 編集

参照渡しにする必要ないのでは。 あと、returnしてないので想定のとおりには動かないと思います。 print_rで出力はしてるでしょうけど、返却してないので空なはず。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問