• ベストアンサー

重複したフィールドに関して

こんばんは。お世話になっております。 PHPにてMySQLを用いて掲示板のようなものを作成しているのですが、初心者なりの考えで、新規投函のときに、あるフィールドにUNIXタイムスタンプを登録し、返信に関しては初回投函した際のタイムスタンプを登録する事により、スレッドを分別しようと考えております。 出来上がりのイメージとしては、この「教えて!goo」のように、初回投函したタイトルを一覧表示し、その先にその件に関する回答が表示させたいと思います。 先にも述べたように、初心者なりの考えで、新規投函・回答・返信、すべて新規レコードを追加という流れで、タイムスタンプによる同一の数値により、新規投函か否か、と分別できれば・・と考えておりました。 しかし、初心者故にか、普段用いている下記コードでは、全てのレコードが対象となってしまい、同一の数値(タイムスタンプ)による分別(初回投函のみを検索結果として表示させたい)が出来ない事に気付きました。 フィールドの考え方も含めて、ご教授いただけたら幸いです。お忙しい中恐縮ですが宜しくお願い致します。 mysql_connect('localhost','root','*****'); mysql_select_db('test'); $sql= "select * from member_bbs where id = '$id'; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows <> 0){ while($row = mysql_fetch_array($result)){    ・    ・    ・ MYSQL(カテゴリー)での質問かとも思いましたが・・・宜しくお願い致します。

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がるです。 ちぃとテーブル構造一気に作り変えてみます(苦笑 id int Key auto_increment これは概ねこのままで。ただ、「新規投函・回答・返信」を全部一意にあつかいます。 # 個人的には「charでトークナイザ(ユニークな文字列を作成するクラス)」を使うのですが。 # とりあえずintサイズくらいあれば問題ないかと。 date datetime 日付は、やはりdatetime型が一番扱いやすいです。 keyrandam 削除 これは使わずに削除してしまいます。理由は後述。 answering_agency_id int default -1 回答元ID。もし投稿が「回答」だった場合に、その元記事になるもののidをココに設定します。 reply_agency_id int default -1 返信元ID。もし投稿が「返信」だった場合に、その記事元になるもののidをここに設定します。 subject以下は概ねそのままでよろしいのかなぁ、と。 こうやりますと。例えば「投稿記事」だけを引っ掛けたい場合、 answering_agency_id = -1 and reply_agency_id = -1 で引っかかりますし。「回答のみ」を引っ掛けたいのなら、 answering_agency_id = 回答元の記事のid で片付きます。 こんな風にすると大分に楽かと思うのですが、どうでしょうか?

sadacha
質問者

お礼

がる様 こんにちは。お世話になっております。 返信が送れて申し訳ありません。只今アドバイスの内容を拝見させていただきました。 取り急ぎ、お礼も兼ねてご挨拶とさせて頂きますが、とても興味深い内容(テーブル設定)、改めて補足欄にて報告(お礼)をさせて頂きます。 きちんとアドバイス頂いた内容を自分でも考えたいので・・・宜しくお願い致します。

sadacha
質問者

補足

がる様 こんばんは。報告ではないのですが、アドバイスにある、 >answering_agency_id int default -1 とは、どういった事なのでしょうか? 検索して調べれば・・とは思っていたものの、調べ方が悪いのか、分からずじまいでして…(汗 がる様のアドバイス、39jin様のアドバイス共に印刷して流れを思い描きながら…とは思っていましたが、ココのところで突き当たってしまいました(汗)。お手数お掛けいたしますが宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • 39jin
  • ベストアンサー率34% (125/359)
回答No.4

教えてgooと同じ動作表示であれば >先にも述べたように、初心者なりの考えで、新規投函・回答・返信、すべて新規レコードを追加という流れで、タイムスタンプによる同一の数値により、新規投函か否か、と分別できれば・・と考えておりました。 ○この分に関しては、#3と同じdatetimeですが、カラムにNoとidを作成します 「新規投稿」と「投稿に対しての回答」とを区別する 新規投稿の「番号を持って」、回答すると「データが一つ増加」する >初心者故にか、普段用いている下記コードでは、全てのレコードが対象となってしまい、同一の数値(タイムスタンプ)による分別(初回投函のみを検索結果として表示させたい)が出来ない事に気付きました。 ○ここでNoとidを区別して表示させます 文章表現がうまくないですが、上の動作を数量的に判断します Noかidかを補助的に使います。質問に対しては量が増える。回答に対しては、質問番号を抱(かか)えてゆくです。 どちらかに対して+1が登録スクリプト上で必要になります 上のアドバイスはワン(1)テーブルを想定しています 質問テーブルと、回答テーブルを別途作成すればリレーションで解決できます 補足要求されてもこれ以上の難しいことは理解できていません。ただ教えてgooと同じようなプログラムはこの方式で完成して機能しています・・ 一覧表示をlook(タイトルをクリックしてviewへ) 詳細表示をview(回答全数も表示されます)

sadacha
質問者

お礼

39jin様 はじめまして、こんにちは。ご親切なアドバイスを有難う御座います。 下の、がる様へのお礼でも述べましたが、自分でもきちんと(アドバイスの基)考えたいので、取り急ぎご挨拶とさせて頂きますが、改めてご報告も兼ねて返信させて頂きたいと思います。有難う御座いました。

sadacha
質問者

補足

補足欄から失礼します。 まだまだ完成には程遠いもの、皆様の有難いアドバイスをヒントに、描いていた表示結果を得る事が出来ました! 完成(自分が描いているもの)までに躓き、また改めてご質問させていただく事もあるかもしれませんが、今回の投函、「重複したフィールドに関して」においては有難いアドバイスの基、満足のいく結果を得られたと思っております。皆様のご厚意に感謝しております。有難う御座いました!

全文を見る
すると、全ての回答が全文表示されます。
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

回答とは異なりますが。 記事固有のIDは auto_increment を指定し、ユニークな値にしたほうがいいです。 偶然にも同じ時間に投稿されると、不具合が起こることが容易に想像できます。 その上で親記事か、回答か、返信かを分けるフィールドを用意したほうがいいでしょう。 記事ごとにユニークな値があれば削除や修正もやりやすいですし。

sadacha
質問者

お礼

moon_night様 こんにちは。お世話になっております。 #1のがる様へのお礼でも記載しましたが、idに重複を避けるため連番として登録するよう設定しております。 手持ちの書籍などを見ながらヒントになるものはないか?と色々と調べてはいるものの、見つけ出す事が出来ずにおります。 >その上で親記事か、回答か、返信かを分けるフィールドを用意したほうがいいでしょう。 >記事ごとにユニークな値があれば削除や修正もやりやすいですし。 なるほど、その通りかもしれませんね。初心者なりに色んな角度から考えてはいましたが、気付かないところも多々あるようです。 引き続きアドバイスなどしていただけたら幸いです。有難う御座いました。

全文を見る
すると、全ての回答が全文表示されます。
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 色々と想像はつくのですが…もしよろしければ、テーブルレイアウトを見せていただいてもよろしいですか? 差し支えなければ、create table文を直接貼り付けていただいても全然OKですので。

sadacha
質問者

お礼

がる様 こんにちは。お世話になっております。 テーブル内容は以下の通りです。^^; お恥ずかしいのですが、アドバイス頂けたら幸いです。 table:member_bbs +-----------------+--------------+------+-----+---------+----------------+ | Field    | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | id       | int(11)    |     | MUL | NULL | auto_increment | | date      | varchar(12)  | YES  |  | NULL |  | | keyrandam   | varchar(16)  | YES  |  | NULL | | | subject     | text     | YES  |  | NULL | | | naiyou     | text     | YES  |  | NULL | | | to_id      | varchar(30)  | YES  |  | NULL | | | to_read     | varchar(4) | YES  |  | NULL | | | from_id     | varchar(30) | YES |  | NULL | | | from_name    | varchar(30) | YES  |  | NULL | | | from_todoufuken| varchar(20) | YES  |  | NULL | | | from_mail    | varchar(40) | YES  |  | NULL | | | from_tel     | varchar(20) | YES |  | NULL | | | from_fax     | varchar(20) | YES  |  | NULL | | +-----------------+--------------+------+-----+---------+----------------+ keyrandam というフィールドに、UNIXタイムスタンプにランダムな文字列を組み合わせたものを登録しております。 to_id が宛先、from_id が送信者としているわけですが、思うようなスクリプトを記述できなくて・・・ 引き続きアドバイスなど頂けたら幸いです。宜しくお願い致します。 追伸:見難くてすみません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MySQLのINSERT時にたまに重複になる

    下記の通り同じデータが無かった場合に限りインサートしています。 //同じデータが既にあるか確認 $sql = "select * from `reg_data` where "; $sql .= "`Date` = '".$date."' and "; $sql .= "`ID` = '".$id."' and "; $sql .= "`No` = '".$no."'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); //データが0なら今日のレコード作成 if($rows == 0){ $sql = "insert into `reg_data` values('0', '".$date."', '".$id."', '".$no.")"; mysql_query($sql); } しかし、3%ぐらいの確立で重複インサートになってしまいます。 重複といっても 1個目のフィールドはAUTO_INCREMENTになっておりまして AUTO_INCREMENTの値が重複する事は無いです。 $date、$id、$noがまったく同じテーブルがいくつか重複した場合でも AUTO_INCREMENTの値は全て連番になっています。 重複インサートが発生しないよう改善するには どうしたら良いでしょうか。 日付を2フィールド目に書いているので 0時0分1秒辺りでインサートが集中してしまいます。 分散させられたら改善するような気がしますが いい案が思いつきません。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 検索結果表示について

    こんにちは。お世話になっております。 あるテーブルからの検索結果をPHPにてブラウザ上に表示させる際のコードに関しての質問なのですが、これまで、検索したいレコードが1つである事を条件にした場合、以下のコードのどちらが適切なのでしょうか? if($rows==1){ while($row = mysql_fetch_array($result))   ・   ・ echo $row["id"]; または、 if($rows ==1){ $id = mysql_result($result, 0, "id"); echo $id; どちらもブラウザでは同じ結果が返ってくるかと思われますが、諸先輩方々からのアドバイスを頂ければと、投函させて頂きました。 お忙しい中恐縮ですが宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • mysql_query等でレコード数を変数に格納

    mysql> SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' ) ; で +------+ | rows | +------+ | 9 | +------+ と出すことができます。 この rows の数「9」を php の変数に入れたいのです。 <?php // DB接続省略 $sql = "SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' )" ; $result = mysql_query($sql, $conn); var_dump($sql."<br />"); echo ($result."--result"."<br/>"); $rows= mysql_num_rows($result); echo ($rows."--rows"."<br/>"); ?> として、ブラウザで確認すると string(80) "SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' ) " Resource id #3--result 1--rows となって、 $rows に値’9’が入りません。$rows にレコード数を取得させるには、どうすれば良いでしょうか?

    • ベストアンサー
    • PHP
  • MySQLのエラー出力

    MySQLで、テーブルのnumberフィールドのレコードでidフィールドのレコードとpwフィールドのレコードを取り出すことをしています。 $sql = mysql_connect('mysql.example.com', 'user', 'pass'); mysql_select_db('exampledb'); $result = mysql_query("SELECT * FROM `memberlist` WHERE `number` = '{$number}'"); while ($row = mysql_fetch_object($result)){ echo "ID:{$row->id}"; echo "PW:{$row->pw}"; } +------+------+------+ |number|id----|pw----| +------+------+------+ |000001|userid|userpw| +------+------+------+ この場合、$numberに000001を代入することで object(stdClass)#1 (3) { ["number"]=> string(6) "000001" ["id"]=> string(6) "userid" ["pw"]=> string(6) "userpw" } となりますが、 これが、もし$numberにnumberフィールドのレコードに無い値が代入された場合、どうやってエラーを出せばいいのですか?

    • ベストアンサー
    • PHP
  • グループ化したSQLの書き方について

    XP&MySQL5&PHP5 ID,PASSWORD,name,tokutenn,zyukennbi,syozoku,bangou というフィールド(すべてテキスト型)を持つテーブル(result)があります。 (ID,PASSWORD,名前、得点、受験日、所属、社員番号) 全個人が最高得点を記録したレコードだけはSQLで書けます。 select ID, name ,max(result.tokuten) as maxtokuten from result group by ID, name ただ、最高得点を出したと同じレコードのそれ以外のフィールド(zyukennbi,syozoku,bangou) を表示させるSQLがわかりません。 何方か、ご存知の方おられましたら、ご教授ください。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHP、MySQLのUpdateで数式の答えをそれぞれのセルに挿入

    こんにちは。PHPの初心者です。PHP内でのMySQL Updateの使い方で苦労しています。 table02に4つのフィールドがあります。このうちで使うのは「num」と「percent」です。結局、numにあるセルの数を一定数($total_num_rows)で割って100を掛けたいのですが。 $sql = "SELECT * FROM $table02"; $result = mysql_query($sql,$my_sql_connection) or die(mysql_error()); WHILE ($row = mysql_fetch_array($result)) { $num = $row["num"]; $percent = $num/$total_num_rows*100; $update_percent = "UPDATE $table02 SET percent = '$percent'"; $update_result = mysql_query($update_percent,$my_sql_connection); $percentをprintとすると、それぞれの行に適した数字が数式に従って表示されます。でも結局テーブル上では同じ数字が「percent」のフィールド下のセルに挿入されてしまいます。どうやったらそれぞれのセルにprintで表示されるような正しい数字を挿入することができるでしょうか? どうぞ宜しくお願いします。

    • 締切済み
    • PHP
  • 複数のフィールドにまたがる、ワード検索

    お世話になっております。 1つのテーブル内にある複数のフィールドを対象とした、DB内の検索スクリプトを以下の様に作っているのですが、半角などで区切り、いくつかのキーワードを入力すると、検索結果が返ってきません。 こちらの過去ログ等でも色々調べ、参考になりそうなものも数多くありましたが、スキルが乏しく解決に結びつける事が出来ずにいる次第です。 お忙しい中恐縮ですが、コードを記述するに当り、考え方などを踏まえた使用する関数などをご教授頂けたら幸いです。 ・・・結果的にお手数をお掛けしてしまう事となりますが、コードの丸投げだけは避けたいもので。。宜しくお願い致します。 mysql_connect('localhost','root','*******'); mysql_select_db('test'); //全てのカテゴリ if($category == 1){ if($ktype == 1){ $sql = "select * from member where nam like '%$nam%' or gyoushu like '%$nam%'…"; $result = mysql_query($sql); $rows = mysql_num_rows($result);

    • ベストアンサー
    • PHP
  • 10行ごとに罫線を入れて書き出したいのですが

      ・   ・ $result=mysql_query($sql); $rows=mysql_num_rows($result); として得られた複数の結果を10行ごとに横の罫線"--------"を入れてブラウザに表示したいのですがどのようにコーディングすればよいですか?

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • PHP-mysql フィールドの値を取得

    認証ページを作成していますが、 フィールドの値を取得できずに困っています。 $r = ?????????????????????; の部分の記述が分かりません。 ($rに、フォームで入力した$idのデータを参照して、もしあったら、その行のPasswdフィールドとフォームで入力した$passを比較したい) よろしくお願いいたします。 $id・・・formの入力内容(Emailフィールドに該当) $pass・・・formの入力内容(Passwdフィールドに該当) <? $hostname = "*"; $username = "*"; $password = "*"; $dbname = "*"; $tablename = "*"; $connect = mysql_connect($hostname, $username, $password) or die ("サーバに接続できません"); mysql_select_db($dbname) or die ("データベースに接続できません"); $sql = "SELECT Passwd FROM $tablename where Email='$id'"; $result = mysql_query($sql, $connect) or die ("クエリーを実行できません"); $num_rows = mysql_num_rows($result); $r = ?????????????????????; print "$num_rows\n"; print "$r\n"; if( $num_rows = 0 ) { print "ユーザ登録されていません。"; print '<a href="">こちらから登録してください。</a>'; session_destroy(); exit; } if( $r != $pass ) { print "パスワードが違います。"; session_destroy(); exit; } print "認証OK"; mysql_close($connect); ?>

    • ベストアンサー
    • PHP