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

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

解決済

3回答

10205閲覧

php,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クリップ

投稿2016/08/23 05:29

編集2016/08/23 05:55

###前提・実現したいこと
現在独学でphpの勉強をしています。データベースに接続し取得は出来たのですが今度はその取得したデータを繰り返しかつ重複せずに表示したいのですが上手くいきません。データベース内には以下のように情報が入っています。以下のコードだとそのまま表示されてします。

現状

サッカー
バスケットボール
未選択
野球
サッカー
サッカー
バスケットボール
野球

希望

サッカー
バスケットボール
野球

###該当のソースコード

<?php $db_host='ホスト名'; $db_name='データベース名'; $db_user='ユーザー'; $db_pass='パス'; $db_table='mテーブル名'; //PDOでデータベースへ接続 try { $pdo = new PDO("mysql:dbname=$db_name;host=$db_host;charset=utf8","$db_user","$db_pass"); } catch (PDOException $e) { die($e->getMessage()); } if(!$pdo){ die('クエリーが失敗。'); } // SELECT文を変数に格納 $sql = "SELECT * FROM テーブル名"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $pdo->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['テーブル名']; //改行を入れる echo '<br>'; } ?>

###試したこと
データベースに接続。取得した情報を変数に代入。foreachで繰り返し処理。

よろしくお願いします。

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

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

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

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

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

yambejp

2016/08/23 05:42

「野球」が見出しになっていて何がなんだかわかりません
guest

回答3

0

ベストアンサー

Invalid argument supplied for foreach()

PDOStatementクラスはそれ自体をforeachで回せるので,無理にfetch()fetchAll()メソッドを使わなくてもいいのですが,現在falseをforeachで回そうとしている状態です.ここにも条件分岐が必要です.

php

1$stmt = $pdo->query($sql); 2if (!$stmt) { 3 die('クエリが失敗'); // これが本当の「クエリが失敗」であって,最初のものは「接続が失敗」なのでエラーメッセージが不適切 4}

しかしこれでは何が悪いのかわからないため,根本的な解決にはなりません.そもそもPDOのコンストラクタでエラーモードを変更して,このような条件分岐を全て不必要にすべきです.全体的に書き方が微妙な感じなので,大きく書きなおしてみます.以下で言及していることを根拠とします.

html

1<?php 2 3$db_host = 'ホスト名'; 4$db_name = 'データベース名'; 5$db_user = 'ユーザー'; 6$db_pass = 'パス'; 7 8try { 9 10 // new PDO() の部分以外でもPDOExceptionが異常時に飛ぶように設定しながら接続 11 $pdo = new PDO("mysql:dbname=$db_name;host=$db_host;charset=utf8", $db_user, $db_pass, [ 12 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 13 ]); 14 15 // 一気に全行2次元配列として取得 16 $rows = $pdo->query("SELECT * FROM テーブル名")->fetchAll(PDO::FETCH_ASSOC); 17 18} catch (PDOException $e) { 19 20 // 「500 Internal Server Error」にして,HTMLではなくテキストでエラーメッセージを表示して終了 21 header('Content-Type: text/plain; charset=UTF-8', true, 500); 22 exit($e->getMessge()); 23 24} 25 26// テキストデータをHTML内に埋め込む際には必ずこの関数を通さなければならない 27function h($str) 28{ 29 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 30} 31 32?> 33<!DOCTYPE html> 34<meta charset="UTF-8"> 35<title>Example</title> 36<?php if (empty($rows)): ?> 37<h1>データがありません</h1> 38<?php else: ?> 39<h1>データ一覧</h1> 40<table border="1"> 41 <tr> 42<?php foreach ($rows[0] as $key => $_): ?> 43 <th><?=h($key)?></th> 44<?php endforeach; ?> 45 </tr> 46<?php foreach ($rows as $row): ?> 47 <tr> 48<?php foreach ($row as $value): ?> 49 <td><?=h($value)?></td> 50<?php endforeach; ?> 51 </tr> 52<?php endforeach; ?> 53</table> 54<?php endif; ?>

追記: 指定した1つのカラムにおける一意な値のみを1次元配列で選択するサンプル

html

1<?php 2 3$db_host = 'ホスト名'; 4$db_name = 'データベース名'; 5$db_user = 'ユーザー'; 6$db_pass = 'パス'; 7 8try { 9 10 // new PDO() の部分以外でもPDOExceptionが異常時に飛ぶように設定しながら接続 11 $pdo = new PDO("mysql:dbname=$db_name;host=$db_host;charset=utf8", $db_user, $db_pass, [ 12 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 13 ]); 14 15 // 一気に全行1次元配列として取得 16 $values = $pdo->query("SELECT DISTINCT カラム名 FROM テーブル名")->fetchAll(PDO::FETCH_COLUMN); 17 18} catch (PDOException $e) { 19 20 // 「500 Internal Server Error」にして,HTMLではなくテキストでエラーメッセージを表示して終了 21 header('Content-Type: text/plain; charset=UTF-8', true, 500); 22 exit($e->getMessge()); 23 24} 25 26// テキストデータをHTML内に埋め込む際には必ずこの関数を通さなければならない 27function h($str) 28{ 29 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 30} 31 32?> 33<!DOCTYPE html> 34<meta charset="UTF-8"> 35<title>Example</title> 36<h1>データ一覧</h1> 37<ul> 38<?php foreach ($values as $value): ?> 39 <li><?=h($value)?></li> 40<?php endforeach; ?> 41</ul>

投稿2016/08/23 06:29

編集2016/08/23 07:46
mpyw

総合スコア5223

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

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

退会済みユーザー

退会済みユーザー

2016/08/23 07:10

ご連絡ありがとうございます。 教えていただいたコードで書き直したところ綺麗にテーブルに収まって表示されました。 ありがとうございます。 今回知りたいのはこのデータベース(table内)から得た情報の内、コラム名にカテゴリーがありまして(このカテゴリーはhtmlの方でselectタグで3つの種類から選ぶ方式でデータベース内に収納されています。)それを今回ページ内の左側に表示したいです。 教えていただいたコードの最後に ``` foreach ($rows as $row){ echo $row['コラム名']; echo '</br>'; } ?> ``` と追加すると サッカー バスケットボール 野球 サッカー サッカー バスケットボール 野球 となってしまいます。 それを サッカー 野球 バスケット *順不同 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/08/23 07:11

それを サッカー 野球 バスケット *順不同 のように表示したいです。よろしくお願いします。
mpyw

2016/08/23 07:52 編集

ああ,重複なしで表示したいということでしたね.DISTINCT句を使うと重複が除外されます.(別の回答でも指摘されていますが,* よりもカラム名を明示してSELECTをかけるほうが望ましいです) SELECT DISTINCT カラム名 FROM テーブル名 それと,今回表として表示したサンプルはあくまで例に過ぎないので,実際はご自分の希望されるデザインに併せて適宜編集してください. (少なくとも,先ほど引用した記事の「初心者がやりがちなミス」の中にある「echo() や print() をベタ書きしている」は確認しておくべきです.正しいPHPの使い方をしていればこれらが必要になることはほとんどありません.ほぼすべてecho短縮構文のみで済みます)
退会済みユーザー

退会済みユーザー

2016/08/23 07:47

ご連絡ありがとうございます。 とても助かりました。記事の添付に気づきませんでした。今から読んでみます。 ありがとうございました。
guest

0

$sql = "SELECT * FROM テーブル名";

$sql = "SELECT DISTINCT * FROM テーブル名";

投稿2016/08/23 05:44

ttyp03

総合スコア16996

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

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

退会済みユーザー

退会済みユーザー

2016/08/23 06:01

回答ありがとうございます。 教えていただいたコードを入力すると「Invalid argument supplied for foreach() 」とエラーが返ってきます。 型が配列じゃない変数でforeachを実行した時にでるエラーみたいで、という事は$sqlに上手くデータが入っていないという事でしょうか。 よろしくお願いします。
guest

0

問題の切り分けができなくなるので「SELECT * 」など使わずに
正しいカラム名を列記する癖をつけてください

PHP

1$sql = "SELECT DISTINCT `テーブル名` FROM テーブル名"; 2

※カラム名がテーブル名というのは非常に違和感がありますが
そういう仕様ならばしかたありません

追記

データ抽出については

PHP

1while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 2 echo $row['テーブル名'].'<br>'.PHP_EOL; 3}; 4

のようなやり方になります

投稿2016/08/23 05:41

編集2016/08/23 06:12
yambejp

総合スコア114572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問