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

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

ただいまの
回答率

89.52%

PHPのカテゴリー作成・表示方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,050
退会済みユーザー

退会済みユーザー

前提・実現したいこと

現在PHPを使った投稿型サイトを作成しています。
データベースに接続し、選択、取得したカテゴリー名を表示したいのですが重複してしまい困っています。どなたか初心者にもわかりやすくご説明していただけないでしょうか。

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

エラーメッセージ

該当のソースコード

<?php

    $db_host='ホスト名';
    $db_name='データベース名';
    $db_user='ユーザー';
    $db_pass='パスワード';

    //データベースへ接続する
    $link=mysql_connect($db_host,$db_user,$db_pass,$db_name);
    if(!$link){
      die('接続失敗です。'. mysql_error());
    }

    //print('</p>接続に成功しました。</p>');

    $db_selected=mysql_select_db('データベース名',$link);
    if(!$db_selected){
      die('データべース選択失敗'. mysql_error());
      }

    //print('</p>データベース名 データデータベースを選択しました</p>');

    mysql_set_charset('utf8');

    $result=mysql_query('select コラム名,テーブル名 from テーブル名 order by コラム名');
    if(!$result){
      die('クエリーが失敗しました。'. mysql_error());
    }

    while ($row = mysql_fetch_assoc($result)) {

    $category=($row['コラム名']);

    echo  "<a href=\"\">$category</br></a>";
}
    // MySQLに対する処理

    $close_flag=mysql_close($link);

    //  if($close_flag){
    //    print('<p>切断に成功しました。</p>');
    //}

     ?>

試したこと

データベースに接続、選択、取得。それらを変数に代入して呼び出しています。本当は複数あるカテゴリーを変数配列に代入してforeachなどで繰り返し処理で表示したいのですがやり方がわかりません。このコードだと

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

みたいに重複して表示されてしまいます。上記の表示を以下のようにしたいです。

サッカー
野球
バスケット

よろしくお願いします。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/08/22 17:19

    コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。また、質問フォームのタイトル横にある初心者マークを押すことで「初心者である」ということはわかりますので、本文に「初心者」と書かなくても大丈夫です。

    キャンセル

  • yambejp

    2016/08/22 17:22

    mysql_query()のようにmysql_から始まる関数は廃止されます(ました)、特に初心者の方は使わないようにしてください(多分参考にした書籍やサイトが古いです)

    キャンセル

回答 2

checkベストアンサー

+2

ユニークなカテゴリ名を得たいというだけであれば

$sql='SELECT DISTINCT コラム名 FROM テーブル名 ORDER BY コラム名';


のように参照してください

カテゴリを表示して、それぞれの明細を表示するなら
前回のカテゴリーを覚えておいて、比較すればいいでしょう。

$pre_category="";
while(・・・){
$category=($row['コラム名']); 
if($pre_category!==$category){
print "<a href=\"\">".htmlspecialchars($category)."</a><br>\n"; 
}
print htmlspecialchars($row['別のカラム'])."<br>\n";
$pre_category=$category;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/22 19:56

    回答ありがとうございます。

    sqlの方は初なのでよくわからないです。とりあえずmysql_の部分は以下に変更してみました。

    mysqlで接続していた部分はsqlに変更してします。
    ```
    <?php

    $db_host='ホスト名';
    $db_name='データベース名';
    $db_user='ユーザー';
    $db_pass='パス';
    $db_table='テーブル名';

    //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('クエリーが失敗。');
    }

    //DBの取得
    $sql = $pdo ->prepare("SELECT * FROM ".$db_table);
    $sql->execute();
    $result = $sql->fetchAll(PDO::FETCH_ASSOC);
    $pdo = null;


    $sql='SELECT DISTINCT コラム名 FROM テーブル名 ORDER BY コラム名';

    if(!$sql){
    echo('クエリーが失敗');
    }
    ?> ```
    -----ここまではなんとか出来たのですが接続、選択した後今度はカテゴリー(コラム名)を取得して表示するコードがわかりません。前回のコードをアレンジして対応しようと試みましたが上手くいきません。以下のmysqlの代わりになるsql文があるのでしょうか。

    while ($row = mysql_fetch_assoc($sql)) {

    $category=($row['コラム名']);

    echo "<a href=\"\">$category</br></a>";
    }

    よろしくお願いします。

    キャンセル

+1

select コラム名,テーブル名 from テーブル名 order by コラム名
でデータを取ってくるのであれば、PHP で配列の重複をなくす関数を探してみてください。

SQLを工夫することで、重複をなくすことも可能です。
個人的には DB の正規化も行ったほうが良いと思います。

本を数冊読んで、基本を体系だって学ばれるのが一番上達が早いかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/22 17:53

    ご連絡ありがとうございます。
    DBの正規化とは何でしょうか。またオススメの本はありますか?
    よろしくお願いします。

    キャンセル

  • キャンセル

  • 2016/08/22 19:26

    ありがとうございます。参考にしてみます。

    キャンセル

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる