クイズ形式サイトの復習機能の構造

このQ&Aのポイント
  • PHP+MYSQLを使ってクイズ形式で学習問題を提供するサイトの復習機能の構造について。
  • ユーザが間違った問題を復習リストに記録し、DBから順に取得して問題に正解するとリストから削除される。
  • 復習方法はユーザ情報のミス問題を格納するフィールドを作成する方法と、問題テーブルにミスユーザのIDを記録する方法がある。
回答を見る
  • ベストアンサー

クイズ形式サイトの復習機能の構造

ここのカテゴリでよいのか自信はないですが質問させていただきます。当方、PHP+MYSQLを使ってクイズ形式で学習問題(教科別)を提供するサイトを運営しています。 ユーザのアカウントを例えば間違った問題について、復習リストに記録してそれを元にしてDBから該当問題を順に取得し、問題に正解した場合はリストから削除するなどの機能を実現しているのですが・・・ DBのテーブルとしては ユーザ情報のテーブル 問題のテーブル があります。 やり方には2種類あるとおもうのですが・・・ 1.例えばユーザ情報のミス問題の番号を格納するフィールドを作成して、そのユーザ情報からミス問題リストを取得する方法。 2.問題テーブルに間違ったユーザのIDを記録するフィールドを作成し、復習する場合はMYSQLでユーザIDがミスフィールドに含まれいるものを検索する方法があると思います。 そこで、現在は1のやりかたで運用しているのですが、2に変更しようかなと思っています。理由は、教科別なので、PHPの配列でいろいろいじるより、問題リストを取得する際にMYSQLにやらせたほうが楽であろうと思うからなのですが・・・ 普通はこういうプログラムをする場合って、 プロ?の方はどのような制御をやられているのでしょうか? 簡略にまとめると各テーブルのフィールドはこんな感じです 1. user[ id/miss問題[22,339,292(問題id)] 2. user[ id ] 問題DB[ 問題/missuser[3922/2932(userid)]

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

1つのフィールドに複数のデータが入るのは好ましくないですね。 データベースの正規化がうまくできていないということになります。 私なら復習リスト用のテーブルを別に作ります。

widoww
質問者

補足

つまり、フィールドにカンマ区切りの 複数データをいれるのがまずいってことですよね? 第一正規化するとなると 復習リストテーブル [Primary][間違えた人のuserid][ミス問題の教科][ミス問題のid] のようなものを作成し 発生ごとにレコード挿入ということでしょうか? これだと確かに複数データは入ることはないですね。 これが一般的でしょうか?

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

>復習リストテーブル >[Primary][間違えた人のuserid][ミス問題の教科][ミス問題のid] > >のようなものを作成し >発生ごとにレコード挿入ということでしょうか? そうですね これならユーザが間違えた問題も検索できますし問題を間違えたユーザも検索できます。

widoww
質問者

お礼

なるほど。 よく理解できました。 ありがとうございました^^ 大変参考になりました。

関連するQ&A

  • PHPでMySQLテーブルロック一覧取得

    PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。 Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。 単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか? PHPから実施できるやり方をご教授頂けると幸いです。 -------Test Program()--------- <?php $link = mysql_connect('localhost', 'login_id', 'login_pass'); mysql_select_db('db_name'); mysql_query('LOCK TABLES table1 WRITE'); mysql_query('INSERT INTO table1 SET field1 = "test", field2 = "1"'); //$result = mysql_list_processes($link); 以下のSQL文とも入れ替えて試しました。 $result = mysql_query('show processlist'); while ($row = mysql_fetch_assoc($result)){ printf("%s %s %s %s %s %s %s %s\n", $row["Id"], $row["User"], $row["Host"], $row["db"], $row["Command"], $row["Time"] , $row["State"], $row["Info"]); } mysql_free_result($result); mysql_query('UNLOCK TABLES'); ?>

    • ベストアンサー
    • MySQL
  • テーブルのレコード数を取得したいのですが、返り値が1になってしまいます。

    最近MySQLやPHPを触り始めたものです。マニュアルを参考に、テーブルのレコード数を取得しようとしてみたのですが、返り値が1になってしまいます。なぜこのような結果になるのでしょうか? http://jp.php.net/manual/ja/function.mysql-num-rows.php : : $db = mysql_connect($db_host,$db_user,$db_password); mysql_select_db($db_name,$db); $count = mysql_query("select count(*) from $db_table", $db); $num_rows = mysql_num_rows($count); echo "<p>{$num_rows}</p>"; どこに問題があるのかわかりません……。初歩的なミスをしているのだと思うのですが、数時間このままの状態で困っています。

    • ベストアンサー
    • PHP
  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHPデータベース・テーブルの移行

    PHPとMySQLを使ってサイト構築しています。 MySQLのデータベース「group_color」にはテーブル「pink」とテーブル「blue」があります。 サイトでログインしている会員ユーザーの情報が「pink」に入っていてユーザーが ”ブルーグループに変更する”というボタンを押すと、テーブルpinkに入っている情報がテーブルblueに移行するようにしたいのですが、PHPの表記はどのようになりますか? 「ログインしている会員の情報」を移行させたいです。 テーブルのフィールドは ・id ・name ・birthday となっています。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 構造を教えてください。

    php5mysql5にてホテルの予約システムのようなものを作りたく思っております。 予定の仕様としては2月分の(今月が9月だった場合は翌月の10月分)のカレンダーを表示させます。 2月分を一気に表示させるのではなく1月分づつ表示させる感じです。 管理側はいつの日に何人空いてるかを管理ページから変更できるようにしユーザーは空いてる日に 予約を入れるというよくありそうなものです。 一番悩んでいる箇所はmysqlのテーブル構造です。 基本的にはカレンダー表示なので単純ですが全ての月日をdbに登録する事になるのでしょうか? その場合例えば以下のようなテーブルになると思うのですが1年だけでも365日あるので厳しすぎるような・・・ id,data,base,num 1(ホテルid),2009-09-25(日付),5(全部屋数),3(空いている部屋数) としてbase-numで空いてる部屋数を割り出しユーザーが見るページに表示させるよう感じなのでしょうか? そして上記で割り出した数字が0でなければyoyaku.php?id=1&data2009-09-25とリンクにパラメータをつけ 予約ページへと移動する? と思っているのですがどのような方法で作るのが一般的なのでしょうか? 構造が明確になればイメージがわくのですが基本がわからずあやふやな状態です。 方法についてのアドバイスや参考になるようなurlの情報でも構いませんのでご存知の方が いらっしゃいましたら宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 一つのフィールドに複数の情報を持たせたいです。

    データベースに詳しい方!一つのフィールドに複数の情報を持たせたいです。 例えば複数のユーザを管理するテーブルにあるID(フィールド)を 複数個をデータベースに保存する場合どうすればいいのでしょうか? 言語はJavaで、データベースはMySQLを使っています。 ↓↓各フィールド(例) -------------------------- || userName || userID || ○○ID || -------------------------- 上記の 「○○ID」というフィールド に複数の値を持たせたいのです。 String型の配列、もしくはXMLをMySQLの一つのフィールドに保存する 事はできるのでしょうか? (もし出来るのならこちらを採用したいです) それとも○○IDに関連するテーブルを作成する(?) それか最悪の場合、ユーザが増えるたびにテーブルを一つ作成 して管理するか・・・・(避けたいです) 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • mysql_field_lenの返り値がvarcharで3倍になる

    PHPの関数「mysql_field_len」で、わからない点がありました。 $id = mysql_list_fields ( 'DbName', 'TableName' ); $num = mysql_num_fields ( $id ); for ( $i=0; $i<$num; $i++ ) { print mysql_field_name ( $id, $i ) ."<BR>\n"; print mysql_field_len ( $id, $i ) ."<BR>\n"; print mysql_field_type ( $id, $i ) ."<BR>\n"; print mysql_field_flags ( $id, $i ) ."<BR><BR>\n"; } として、各フィールドの情報を表示させました。 すると、mysql_field_typeが「string」(実際にはvarchar)の時、 mysql_field_lenの返す値が3倍になって返ってきます。 例:varchar(8)→24 これは何の値を返しているのか、また設定の問題なのか、 ご存知の方はいらっしゃいますでしょうか。 よろしくお願いいたします。 環境: PHP4.3.10 MySQL4.1.10

    • 締切済み
    • PHP
  • Flash→PHP→MySQLへの値の受け渡しについて

    現在、Flashのフォームで受け取った値をPHP経由でMySQLへデータを格納するシステムを作成しています。 現在、詰まっている点とは、Flashで送信したデータがMySQLまで到達できないというところです。 少し分析してみたところ、PHPを単独でブラウザにて開くと "フィールドが取得できません。" と出力されていました。 これは、 ----- <?php $setsuzoku = mysql_connect("localhost", "*****", "*****"); if (! $setsuzoku) { die ("データベースに接続できません"); } if (! mysql_select_db ("test")) { die ("データベースが取得できません"); } mysql_query("INSERT INTO rank VALUES('".$HTTP_GET_VARS['nickname']."', ".$HTTP_GET_VARS['score']); if (!$fd) { die ("フィールドが取得できません。"); } // 処理が終わったことを知らせる print('OK'); ----- というプログラムで動かしていまして、『mysql_select_db ("test")』まで動作しているのではないかと思われます。 ですので、もしかしたらFlash以前にPHPとSQLの連携がうまくいっていないような気がするのですが…どうでしょうか? Flashからの情報を送信するシステムである以上、PHPで表示すると必ずこのような形になるのでしょうか? ちなみにMySQLには、必要なDatabaseとテーブルを作成しました。 問題の切り分けは一応してみましたが、間違っているかもしれません。何かご教授頂ければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • PHP phpMyAdmin

    hetemlのmysqlを利用しているのですが phpからmysqlへの格納が上手くいきません。 ■phpソース <?php $link = mysql_connect('サーバー名','ユーザー名','パスワード'); mysql_select_db('データベース名'); mysql_query("INSERT INTO myname VALUES ('test')"); echo mysql_errno($link); echo mysql_error($link); ?> ■phpMyAdmin テーブル myname を作成済 phpはエラーを出していないのですが テーブル myname のフィールドに test が格納されません。(変化ありません)

    • 締切済み
    • PHP
  • MySQLに格納できない

    INSERT INTOの構文が間違っていると、エラーが出ます。 DB接続はできています。 テーブル名:db_touroku フィールド: id mailaddress created(登録日) としています。 ユーザーにはテキストのフォームにメールアドレスのみを入力してもらい、「submit」でtouroku.phpのページへ移動。 idにはDBでauto_increment をつけています。 //touroku.php $sql = sprintf('INSERT INTO db_touroku VALUE("%d" ,"%s" ,"%s"', 0,mysql_real_escape_string($_SESSION['join']['mailaddress']),date('Y-m-d H:i:s')); mysql_query($sql,$link) or die(mysql_error()); 構文が間違っているでしょうか? どなたかご教授お願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう