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

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

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

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

Q&A

解決済

1回答

2534閲覧

phpのオブジェクトの中身を全て確認する

pegy

総合スコア243

PHP

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

0グッド

0クリップ

投稿2019/07/28 07:20

非常に初歩的なことなのですが

以下のようなコードで、なぜcountとfetchColumn()の組み合わせで該当する("username="smith")行の個数を取得することができるのかがわからず(マニュアルには結果セットの次行から単一カラムを返すということだけ触れられていて、例を見ても意味がわかりませんでした)
そこでそもそもオブジェクトがどうなっているのか見に行こうとすると以下のように全貌を見せてはくれません。

phpでは配列はvar_dumpで要素を全て確認することができたり、javascriptではdevelopertoolでコンソール出力して、オブジェクトの中身をツリー状の追跡してくことができるのですが**phpのオブジェクトについてその中身の全貌を見る方法がわかりません**。phpオブジェクトの中身を全て出力等で検索してもわからかったため、基本的なことかもしれませんがお問い合わせさせていただきました。

object(PDOStatement)#3 (1) { ["queryString"]=> string(57) "SELECT COUNT(*) FROM good_table WHERE username = "smith"" }

php

1try { 2 $pdo->beginTransaction(); 3 try { 4 $stmt = $pdo->query('SELECT COUNT(*) FROM good_table WHERE username = "smith"'); 5 $stmt->execute(); 6 $result = $stmt->fetchColumn();//ここがわからないので 7   $result = $stmt//あえてオブジェクトの中身を見に行く 8 9 $pdo->commit(); 10 } catch (PDOException $e) { 11 $pdo->rollback(); 12 throw $e; 13 } 14} catch (PDOException $e) { 15 exit('データベース接続失敗。'.$e->getMessage()); 16} 17var_dump(result);/*object(PDOStatement)#3 (1) { ["queryString"]=> string(57) "SELECT COUNT(*) FROM good_table WHERE username = "smith"" } 18と言われてもobjectの中がどんな構造になっているのかがわかりません。。*/

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜcountとfetchColumn()の組み合わせで該当する("username="smith")行の個数を取得することができるのかがわからず

当該のSQLを投げた場合、SQLがPHPに返してくる結果は、COUNT(*)の結果1列×1行となります。なので、fetchColumn()に何も指定しなくても、最初の行の最初の列のデータが選択されます。

phpのオブジェクトについてその中身の全貌を見る方法がわかりません。

executeしただけでは、クエリの結果はオブジェクトに入っておらずfetch***で取得しないと得られません。全部取得したいならfetchAllで一括取得できます。

投稿2019/07/28 07:40

maisumakun

総合スコア145184

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

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

pegy

2019/07/28 08:02 編集

コメントいただきありがとうございます。 最初のご回答について、以下のようなテーブルの場合には"1a"を返してくるという(id="1a"なので)という意味でしょうか?なぜ結果1列×1行を返してくれることが結果的に、期待する行の個数"2"を返すことになるのでしょうか。。 id name sex 1a smith male 2a smith male 3a kate female また”「fetchColumn()に何も指定しなくても、最初の行の最初の列のデータが選択されます。”というのは引数に何も指定しなくてもという意味でしょうか? 重ねてのご質問、誠に申し訳ございません。 後者については、なんとなく理解ができました。 アロー演算子はオブジェクトのプロパティやメソッドにアクセスするためのものであると理解していたので、これを使用するということは、その直前においては、当然オブジェクトには全てアクセス可能なプロパティやメソッドが備わっていて、そのメソットの一つのfetchColumn()にアクセスしているだけだと思っていました。。。phpのクラスがまた一つ難解なものになりましたが、この点はもう少し調べてみます。
maisumakun

2019/07/28 09:24

> なぜ結果1列×1行を返してくれることが結果的に、期待する行の個数"2"を返すことになるのでしょうか。。 その1行1列の中身として、COUNT(*)の結果が入っています。GROUP BYしていない以上、テーブル全体に対してCOUNT(*)の結果は1つ(1行)ですし、SELECTしているのはCOUNT(*)だけなので、列もこれ1つだけです。 そして、fetchColumnは行については「先頭から順に」、列は「引数で指定しなければ先頭の列」を読むというようになっていますので、1回の呼び出しで目的のものを取得できます。 https://www.php.net/manual/ja/pdostatement.fetchcolumn.php
maisumakun

2019/07/28 09:30

> 以下のようなテーブルの場合には"1a"を返してくるという(id="1a"なので)という意味でしょうか? このクエリでは、元のテーブルを取得しているわけではありません。「2」だけが入った結果セットが得られます。
pegy

2019/07/28 10:10

重ねて御礼申し上げます。 間違っていたら、誠に申し訳ないのですが、 1) COUNT(*)の結果が、以下のようにセットされる   行 列 2 2) これをfetchColumnで1行目の1列目を取りに行っているだけなので当然2が返ってくる ということであっていますでしょうか? PDOでない通常のSQL文であれば。COUNTだけで単純に欲しい個数を取得できるのに、PDOの場合には非常に回りくどいやり方(COUNTの結果を取得してから、オブジェクトのfetchColumn()で個数にアクセスする)が求められるのはやはり、PDOクラスを使用することでオブジェクトとして扱わなければならないからなのでしょうか。。 それともそもそもPDOでこのように個数を取得するやり方としてCOUNT+fetchColumn()で試みるアプローチが不適切なのでしょうか? *ちなみに上記は簡易的にusername="smith"としていますが、変数にしていてプリペアドステイトメントを使用しています。 本当に申し訳ございません。あまりご迷惑をおかけするのも恐縮なので、これで最後の質問にしようと思います。よろしくお願い申し上げます。
maisumakun

2019/07/28 10:46 編集

> 1) COUNT(*)の結果が、以下のようにセットされる はい、そのとおりです。 > PDOでない通常のSQL文であれば。COUNTだけで単純に欲しい個数を取得できるのに えっと、どんなSQL文にしてもPDOから投げる場合は「クエリの発行」と「(結果セットが必要なSELECTなどの場合)結果の取得」はそれぞれ行わないといけないです(COUNTに限ったことではありません)。「PHPから」結果を使うために必要な手順です。
pegy

2019/07/28 13:26

ありがとうございます。前者はとてもクリアになりました。 後者のことは正直、腹落ちしていない部分もあり、PDOの仕組み自体を正しく理解できて使っていないことがわかりました。基礎から読み直してみます。 本当にお付き合いいただき、ありがとうございました! 最後に改めて御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問