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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

3回答

10934閲覧

複数行をSELECT文で取得しようとしたのですが1行しか取得できません

TSKT

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

1クリップ

投稿2020/01/12 11:43

編集2020/01/12 12:45

前提・実現したいこと

PHPでmysqlを使用するためにsql文とsql文に代入するデータを引数として渡すと処理して成功したかどうかとsqlの結果を返すデータベース関数を作成しました。
これを使用していたんですが1行のみの結果を取得する時は正常に動いていたと思うのですが、複数行を所得使用とした際に1行のみしか取得できないという状態になりました。
試しにmysql側で直接sql文を実行した結果、正しく複数行取得されていたのでsql文に間違えがあるとかではないと思います。

発生している問題・エラーメッセージ

エラーメッセージは発生していません データベースから複数行の取得を行いたいのですが1行しか所得できません

該当のソースコード

php

1$sql = "SELECT id FROM tbl WHERE name_0=? AND name_1=? AND name_2=? AND name_3=? AND name_4=?"; 2$data = [$name[0],$name[1],$name[2],$name[3],$name[4]]; 3$wk = db($sql,$data); 4$result = $wk[0]; 5$data = $wk[1]; 6 7function db($sql,$data){ 8 $dsn = 'mysql:dbname=testdb;host=localhost;charset=utf8mb4;'; 9 $user = 'testuser'; 10 $password = 'pass'; 11 try{ 12 $dbh = new PDO($dsn, $user, $password); 13 14 $stmt = $dbh->prepare($sql); 15 $result = $stmt->execute($data); 16 $row = []; 17 if(isset($stmt)){ 18 foreach($stmt as $row){} 19 } 20 return [$result,$row]; 21 }catch (PDOException $e){ 22 print('Error:'.$e->getMessage()); 23 die(); 24 } 25 $dbh = null; 26}
PHP,MYSQL

試したこと

returnされた後の$resultと$rowをvar_dump()した結果、$result=true、$rowは1行の取得が行われていました。

補足情報(FW/ツールのバージョンなど)

mysql:5.7.x
php:7.2.17

データベース構造です

mysql

1CREATE TABLE `tbl` ( 2 `id` INT(9) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT , 3 `name_0` VARCHAR(20) NOT NULL , 4 `name_1` VARCHAR(20) NOT NULL , 5 `name_2` VARCHAR(20) NOT NULL , 6 `name_3` VARCHAR(20) NOT NULL , 7 `name_4` VARCHAR(20) NOT NULL , 8 `name_x_0` VARCHAR(20) NOT NULL , 9 `name_x_1` VARCHAR(20) NOT NULL , 10 `name_x_2` VARCHAR(20) NOT NULL , 11 `name_x_3` VARCHAR(20) NOT NULL , 12 `name_x_4` VARCHAR(20) NOT NULL , 13 `num` INT(10) NOT NULL , 14 `num_e` INT(10) NOT NULL , 15 `user_id` INT(9) UNSIGNED ZEROFILL NOT NULL , 16 `date` TIMESTAMP NOT NULL , 17 PRIMARY KEY (`id`) 18) ENGINE = InnoDB;

複数行を取得しようとしているsql文です
SELECT id FROM tbl WHERE name_0=? AND name_1=? AND name_2=? AND name_3=? AND name_4=?

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

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

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

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

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

m.ts10806

2020/01/12 12:34

所得→取得 あとCREATE TABLEもコードブロックにしてください。正しくコピペできませんので。
m.ts10806

2020/01/12 12:36

>foreach($stmt as $row){} これだと回してるだけで何もセットしてないので $rowは [] が返るのでは。
TSKT

2020/01/12 12:48

一応、$rowは値が入っているみたいです
guest

回答3

0

ベストアンサー

foreachの特徴をおさえておくべきです。

foreach($stmt as $row){}

同じ状況が再現できるコードを下記に示します。

php

1<?php 2$data = [1,2,3,4,5,6]; 3foreach($data as $r){} 4 5echo $r; 6//出力結果 7//6

これがなぜ6になるのか分かったらとるべき手法も決まります。

ただ、これはこれでforeachの特性をおさえておくべきですけど、
そもそも取得のためだけに回すのってコストの無駄遣いなので、
その場で処理が発生しないのでしたらfetchAll()で一気に全部取った方が良いと思います。

投稿2020/01/12 12:53

m.ts10806

総合スコア80765

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

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

TSKT

2020/01/12 13:44

foreachを誤解していました。 foreachで何も処理をしてなかったので最後の行のみが返されていたんですね。 解決しました。 ありがとうございました。
m.ts10806

2020/01/12 13:51

解決されたようで何よりです。 >foreachで何も処理をしてなかったので最後の行のみが返されていた そうですね。おおよそその理解であっています。 あくまで「配列のコピーから値を1つずつ取り出している」だけなので、「取り出した」結果をasに入れていきます。 変数は何もしなければ上書きされ続けるので最後の情報しか残らないということになります。
guest

0

php

1function db($sql,$data){ 2 $dsn = 'mysql:dbname=;host=;charset=utf8mb4;'; 3 $user = ''; 4 $password = ''; 5 try{ 6 $dbh = new PDO($dsn, $user, $password); 7 8 $stmt = $dbh->prepare($sql); 9 $result = $stmt->execute($data); 10 $row = $stmt->fetchAll(); 11 return [$result,$row]; 12 }catch (PDOException $e){ 13 print('Error:'.$e->getMessage()); 14 die(); 15 } 16 $dbh = null; 17}

投稿2020/01/14 10:10

TSKT

総合スコア16

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

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

0

テーブル定義はCREATE TABLE文で載せましょう。

複数行を所得しようとしているsql文です

SELECT id FROM tbl WHERE name_0=? AND name_1=? AND name_2=? AND name_3=? AND name_4=?

が質問のコードの中にないからでは?
コードは実行できる最小限の内容を載せた方が適切なコメントが付き易いです。

PHPでデータベースに接続するときのまとめ PDO も参考に。

投稿2020/01/12 12:09

Orlofsky

総合スコア16415

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

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

TSKT

2020/01/12 12:26

create table文を追加しました。 関数の呼び出し元のコードを追加しました。 助言ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問