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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

2回答

1135閲覧

sqlで値が取得できない原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2022/03/03 02:10

提示コードですが参考画像の通りでPostというテーブルのデータをthread_UUIDと一致していてかつenable=trueのデータを全て取得して
その数をカウントするという処理なのですがなぜかcountの値が0になりvar_dump()をすると何も入っていませんこれは何が原因なのでしょうか?

確認したこと

テーブル名が合っているかどうか確認
thread_UUIDが文字列のためそのテーブルに存在するかどうかを文字列検索で確認
var_dump()で中身がどうなっているかどうか確認

実行画面

実行画面

mysql(ハイライト部は文字列検索)

イメージ説明

php

1 2 /*####################### 投稿数を取得 #######################*/ 3 function GetPostNum($uuid) 4 { 5 try 6 { 7 echo $uuid."<br>"; 8 9 $database = GetDataBase(); 10 $database->beginTransaction(); 11 $sql = 'SELECT * FROM Post WHERE `enable`=true AND `thread_UUID`=:uuid'; 12 $stmt = $database->prepare($sql); 13 $stmt->bindValue(":uuid",$uuid,PDO::PARAM_STR); 14 $stmt->execute(); 15 $database->Commit(); 16 17 if($stmt->fetchAll() == false) 18 { 19 20 return false; 21 } 22 else 23 { 24 //echo $stmt->rowCount(); 25 var_dump($stmt->fetchAll()); 26 return count($stmt->fetchAll()); 27 } 28 } 29 catch(PDOException $e) 30 { 31 die($e->getMessage()); 32 } 33 } 34

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

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

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

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

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

m.ts10806

2022/03/03 02:17

SELECTでトランザクションをなぜ入れてるんでしょうか。
yambejp

2022/03/03 02:23 編集

質問の意図がわかりませんが 「var_dump($stmt->fetchAll())」が空なら 「count($stmt->fetchAll())」が0なのは当たり前ですけど・・
退会済みユーザー

退会済みユーザー

2022/03/03 02:30

phpMyAdmin上で正常に結果が得られたSQL文でしょうか? カラム名やテーブル名が実態と合ってるかどうかは第三者では確認できないので。
guest

回答2

0

仕様通り。

https://www.php.net/manual/ja/pdostatement.fetchall.php
PDOStatement::fetchAll — 結果セットから、残っている行を取得する

未取得が10件あったら10件取得されます。
残りは何件でしょう。
あなたはfetchAll()を同じステートメントに対して何回実行しているでしょう?


それに「取得できなかったらfalse」という仕様ではないので、
if($stmt->fetchAll() == false)という条件式は不適当。


「トランザクション」「コミット」が必要な実装か判断できるくらいには基礎を身につけましょう。

投稿2022/03/03 02:19

編集2022/03/03 02:23
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2022/03/03 03:01

なるほど質問ですがfetchAll()は一回参照されたら使われたら次から結果が変わる関数なのでしょうか?
m.ts10806

2022/03/03 03:04

回答読んでなおその質問がでるのはなぜ?読んでないからか。
m.ts10806

2022/03/03 03:11 編集

あなたは自分で缶ジュースの中身を飲み干した後に「なんでなくなるの?」って他人に聞いてるんだけど。
m.ts10806

2022/03/03 03:10

今回に限らず、全部ね。 一字一句読み込んで全部理解して理解できないところを聞くように。 「なるほど」なんて理解してないのに使っていい語句ではない。
guest

0

enableがtrueでないか、thread_UUIDが$uuidではないのだと思います

追記

m.ts10806さんのご指摘の通り、fetchAllは複数回実行できないので
一旦変数で受けておいてください

PHP

1$rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 2if( empty($rows)){ 3 return false; 4}else{ 5 var_dump($rows); 6 return count($rows); 7}

投稿2022/03/03 02:24

編集2022/03/03 02:41
yambejp

総合スコア114775

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

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

m.ts10806

2022/03/03 02:27

例えヒットしてても if($stmt->fetchAll() == false) ↑ここで全部取り出されているからだと思います。
yambejp

2022/03/03 02:30

ああ、たしかに変数にいれて再利用しないといけないですね・・・ 追記しておきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問