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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

3575閲覧

LEFTJOINで接合したテーブルから取得し、PHPで表示させる方法

awazon042

総合スコア13

SQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2016/01/22 09:31

PHPでデータベースから取得して表示したいと思っています。
まず以下に
SELECT * FROM AA LEFT JOIN BB ON AA.id = BB.id LEFT JOIN CC ON AA.id=BB.id
で生成されるテーブルと現在のコード
そして表示される理想の形を書いてみました。

<?= $detail_name ?>と<?= $height ?>は表示できるのですが、

**<?php foreach ($st as $row): ?>

<li><a href="<?= $row("link") ?>"><?= $row("link") ?></a></li> <?php endforeach; ?>**

ここが上手く表示できません。
■■■

<?php $link = htmlspecialchars($row['link']); ?> <body> <?=$link?> </body> ■■■ とすると一件だけ表示できるのですが、表示したいリンクは二件あります。 どうしたらいいかご教授ください。

■■■テーブル図■■■■■■■■

【id】【detail_name】【heigh】【link】
1 鈴木 168 http://AAA
1 鈴木 168 http://BBB
2 坂本 176 http://CCC
2 坂本 176 http://ABC

■■■■■コード■■■■■■

<?php function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } $id = h($_GET['id']); if (!empty($_GET['id'])) { try { /////~接続は省略~ $st = $pdo->prepare("SELECT * FROM AA LEFT JOIN BB ON AA.id = BB.id LEFT JOIN CC ON AA.id=BB.id WHERE AA.id=?"); $st->execute(array($id)); while ($row = $st->fetch()) { $detail_name = htmlspecialchars($row['detail_name']); $height = htmlspecialchars($row['height']); } ?> <head>~省略~</head> <body> **名前:<?= $detail_name ?><!--表示される--> 身長:<?= $height ?><!--表示される-->** <ul> <?php foreach ($st as $row): ?> **<li><a href="<?= $row("link") ?>"><?= $row("link") ?></a></li> <!--ここの表示が上手くいかない--> <?php endforeach; ?>** </ul> </body> ■■■この様に表示したい■■■■■■■■ 名前:<?= $detail_name ?> 身長:<?= $height ?> http://AAA http://BBB

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

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

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

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

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

guest

回答2

0

こんにちは。

ええと・・・・前段で

PHP

1 while ($row = $st->fetch()) { 2 $detail_name = htmlspecialchars($row['detail_name']); 3 $height = htmlspecialchars($row['height']); 4 } 5?>

とやってしまったので、$rowは最終行になってます。
$stは、ファイヤフォースなので、先頭から一個一個読み込んで、後戻りは(多分)できないはずです。

ですから

PHP

1<?php 2$link = htmlspecialchars($row['link']); 3?>

これは最後の行だけでているわけです。

PHP

1<?php foreach ($st as $row): ?> 2<li><a href="<?= $row("link") ?>"><?= $row("link") ?></a></li> 3<?php endforeach; ?>

とやっても、$stはもう読み込み終わって空っぽなんでしょう・・・。

なので、$stを回してる最初のwhileで、値を保持しておきます。

PHP

1$st->execute(array($id)); 2$links = array(); 3 4 while ($row = $st->fetch()) { 5 $detail_name = htmlspecialchars($row['detail_name']); 6 $height = htmlspecialchars($row['height']); 7 8 //ここで保存しておく 9 $links[] = htmlspecialchars($row['link']); 10 }

そのあと、$linkをループさせながら出力させます。

追記します。

PHP

1名前:<?= $detail_name ?><!--表示される--> 2身長:<?= $height ?><!--表示される-->

しかし、これだと、最後の一人しか表示されないのでは・・・?

もしも全件出したい場合は、whileループ内で、$row["link"]も含めて表示させないとダメですよ・・・。

投稿2016/01/26 07:57

編集2016/01/26 08:01
Toyoshima

総合スコア422

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

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

0

ベストアンサー

コードがこの通りだとしたら、$row("link")$row['link']にかえれば望む結果になるのでは?と思いますが、いかがでしょうか。

投稿2016/01/22 10:30

ao_love

総合スコア441

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

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

awazon042

2016/01/22 10:49

出来ませんでした。。 foreachかrowが違うのかなと思っています・・
ao_love

2016/01/25 02:26

$st を var_dumpさせたものと、現在の表示がどのようになっているか教えて頂けますか?
awazon042

2016/01/25 05:37

無知ですいません。これであっていますか? var_dump($st); を追加したところ、ヘッダーあたりに object(PDOStatement)#4 (1) { ["queryString"]=> string(122) "SELECT * FROM cast LEFT JOIN cast_add ON cast.id = cast_add.id LEFT JOIN cast_link ON cast.id=cast_link.id WHERE cast.id=?" } object(PDOStatement)#4 (1) { ["queryString"]=> string(122) "SELECT * FROM cast LEFT JOIN cast_add ON cast.id = cast_add.id LEFT JOIN cast_link ON cast.id=cast_link.id WHERE cast.id=?" } と表示されています
ao_love

2016/01/26 07:47

ありがとうございます。 $idはGETしているということは、結果は複数人のデータの列挙ではなく、該当idの人の分だけ表示する、ということでしょうか?? あと、根本的なことを聞いていなかったのですが、それぞれのテーブルにはどのような情報が入っていますか? コメント欄が長くなってしまいましたし、私よりさらっと回答してくださる方もいそうなので もし面倒でなければ、この質問は自己回答か何かでいったん締め切った後 ・現在のコード ・現在のテーブル構成(AAとBBの両方) ・現在表示されているもの ・最終的に表示させたい結果 をコードをくくってわかりやすく整理して再質問するのをお勧めします。 ※コードはマークダウン方式で囲ってあげると可読性があがりますのでぜひ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問