データ保存について

このQ&Aのポイント
  • phpで会員制サイトの制作を勉強しています。
  • データベースへはPDOで接続しています。MySQLデータベースを使用しています。
  • 記事投稿サイトの作成を勉強しており、投稿者のページへのリンクと記事の履歴表示を実装したいと考えています。
回答を見る
  • ベストアンサー

データの保存について

phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 現在、記事投稿サイトの作成を勉強しています。 できれば、記事の内容に「記事を投稿した投稿者のページ」へのリンクと、 投稿者のページに「今まで投稿した記事の履歴」がリンクつきで表示されるようにしたいです。 そこで、まだ勉強を始めたばかりなので、今ある知識だと下のような方法しか思いつきませんでした。 1、記事データ保存用のテーブルと、ユーザー情報保存用のテーブルを作成 2、記事データ保存用のテーブルのカラムにユーザーIDを格納するカラムを作成 3、記事ページからはユーザーIDを元にユーザー情報保存用のテーブルからユーザー情報を検索して投稿者のページのリンクを設置 4、投稿者ページの記事履歴には記事テーブルの全てデータからユーザーIDカラムのIDが一致するものをSELECTする 勉強とはいえ、作成中のサイトを少しでもしっかりした作りにしたいので、他にもっと良い方法があれば知りたいです! ご回答、よろしくお願いします。

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

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>できれば記事IDは乱数を格納してプライマリーキーに指定することで >重複しないようにして付与できたらいいなと思っていますが、やはり >A_Iの方が良いのでしょうか? 自分で生成すると新規作成時の重複チェックが必要になりますからねぇ。それが面倒でなければ、substr(md5(microtime()),0,8) とかでも実用にはなると思います。

mmm5orz
質問者

お礼

上記補足ですが、トランザクション処理を勘違いしていました。 try~catchでエラーを吐かれたら再処理が正しいですかね・・・

mmm5orz
質問者

補足

ご回答、ありがとうございます! >自分で生成すると新規作成時の重複チェックが必要になりますからねぇ。 >それが面倒でなければ、substr(md5(microtime()),0,8) とかでも実用 >にはなると思います。 「重複チェック」についてですが、記事IDをプライマリーキーに設定した場合、同じ記事IDをINSERTしようとするとエラーを吐かれると思いますので、 IDの生成やINSERT処理を全てトランザクションでまとめて、エラーを吐かれたらロールバックしてIDの再生成など再度処理を行うようにすれば重複チェックになるでしょうか? また、前の補足コメントで質問させて頂いたことについて再質問になりますが、検索条件として使用するカラムは全てインデックスにしても問題ないでしょうか?複数インデックス設定した場合、デメリットはあるのでしょうか? お返事、頂けると有難いです。

その他の回答 (1)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>今ある知識だと下のような方法しか思いつきませんでした。 他に方法はないと思う。 記事テーブルの投稿者IDをインデックスにしておくように(プライマリキーは記事IDをAUTO_INCREMENTで付与すると思うので)。 なお >記事ページからはユーザーIDを元にユーザー情報保存用のテーブルから >ユーザー情報を検索して投稿者のページのリンクを設置 投稿者ページはユーザIDを引き渡してそのユーザの内容を表示するので、わざわざこの時点でユーザ情報テーブルを読む必要はない(記事テーブルとjoinして一緒に読んでおいてもかまわないけど)。

mmm5orz
質問者

補足

ご回答ありがとうございます! >記事テーブルの投稿者IDをインデックスにしておくように >(プライマリキーは記事IDをAUTO_INCREMENTで付与すると思うので) インデックス設定について知らなかったので調べました。複数カラムにインデックス設定することができるようですが、 投稿者ID以外にもタイトル格納カラム等も検索条件に使用するので、 検索条件として使用するカラムは全てインデックスにした方が良いですかね? また、記事IDは$GETで記事内容のページのURLに含めたいので、 あまり通し番号にしたくないです。(URLで記事の識別番号が数字のみの連番であきらかに通し番号になっているようなサイトをあまり見かけないため、個人的にちょっと投稿された順番がURLで見え見えになってしまうのが嫌なので) できれば記事IDは乱数を格納してプライマリーキーに指定することで重複しないようにして付与できたらいいなと思っていますが、やはりA_Iの方が良いのでしょうか? A_Iは内部管理用のIDに付与しようと思います。(あまりカラムとして意味を成さないかもしれませんが・・・) >投稿者ページはユーザIDを引き渡してそのユーザの内容を表示するので、 >わざわざこの時点でユーザ情報テーブルを読む必要はない >(記事テーブルとjoinして一緒に読んでおいてもかまわないけど)。 確かにその通りですね! ご指摘頂きありがとうございます! お返事頂けると有難いです。 よろしくお願いします。

関連するQ&A

  • テーブルデータをSESSIONに保存し、使いまわす

    お世話になります。 現在、ユーザーが記事を作成、編集、削除できるブログシステムを作成しています。 MYSQLのデータベーステーブルには以下の3つを用意しています。 ・usersテーブル:ユーザー名(name)、パスワード等(pw)、記事保存先ディレクトリ(dir)等のユーザ情報 ・articleテーブル:ブログ記事タイトルや本文等の情報 ・imagesテーブル:ブログ記事に使用している画像情報 ここで質問があります。 現在ユーザーがログイン成功時にセッションにはユーザーIDのみを $_SESSION["id"]として保存しています。 そして、記事投稿処理時や、記事編集処理時など、各場面で必要になった情報はそのときselectを使ってテーブルから毎回取り出しています。 しかし、こんなことをしなくても、ユーザーがログイン成功時に、セッションにユーザーID以外の情報も 保存しておけば、以後データベースから取り出す必要がなくなり便利かと思うのですが、セキュリティ面などからこのようなやり方はNGなのでしょうか? 1,まったく問題ないのか? 2,パスワード等の重要データはNGなのか? 3,ユーザーidのみにしておくべきなのか? 問題がある場合、その理由も教えていただけるとありがたいです。 例)ユーザーログイン時に、 $_SESSION["id"]=ユーザーID格納。 $_SESSION["name"]=ユーザー名を格納。 $_SESSION["dir"]=記事保存先ディレクトリを格納。 $_SESSION["article"]=ログインユーザーの記事情報を格納。 お分かりの方、教えていただけたら幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • データの受け渡し

    お世話になっております。 知り合いからの相談で、ドメイン(サーバ)の違うサイトの間でデータの受け渡しを行うにはどのような流れになるのでしょうか? 詳細を説明すると、同じ形式のテーブル(MySQL)を設定されているサイトが複数(サーバも違う)あるとします。 例え言うと、教えて!GooでIDを取得したとき、yahoo!にもミクシィにもその情報が送信され、同じIDが作られそれぞれのデータベースに保存される。 と、このようなものなのですが、このように、データベースはそれぞれ設定した中にデータを保存させたい。ということを考えた場合、PHPで出来るのか?また、出来るとしたらどのような流れになるのか?知人の相談からはじまった事ですが、勉強のためにも考えてみたいと投稿させていただきました。 お忙しい中恐縮ですが、些細なことでも結構です。アドバイスなど頂戴できたら幸いです。

    • ベストアンサー
    • PHP
  • ブログのデーターの作り方

    PHPでブログを作りたいのですが、データベースの テーブルのカラムをどのようにするかで悩んでいます。 メインの作者の記事と閲覧者コメントのデータはどのようにデータベースで管理しているのでしょうか? テーブルは別々に分けているのでしょうか? テーブル一つで考えていたのですが、そうすると id,本文,コメントを一行にすると管理しやすいのですが それだとコメントが一人分とかになってしまいます。 それともコメントを最大10人分までとかとするのも 良しとするべきでしょうか? 一つの記事で何十ものコメントを付けることも個人の ブログではないことですよね。。 通常の考え方を教えてください。

    • 締切済み
    • PHP
  • データベースに"や'を保存できない

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 自己紹介文のような長めの文章をデータベースのTEXT型カラムにUPDATEで保存したいです。 $stmt = $db->prepare("UPDATE member SET text=:text WHERE id=:id"); $stmt -> bindParam(':text ',$text,PDO::PARAM_STR); $stmt -> bindParam(':id',$id,PDO::PARAM_INT); $stmt -> execute(); というSQL文を作成し、 文字列データを保存することはできたのですが、 「"」や「'」のような記号を含めるとそれ以降の文章が消えた状態で保存されてしまいます。 例えば顔文字などで「"」や「'」のような記号を使用する場合もあると思うので、 できれば、データベースに保存したいです。 どうしたら安全に「"」や「'」が保存できるでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLのデータファイルの位置について

    MySQLでテーブル、データベースを作成したのですが、 OS上から作成したテーブル・データベースが保存されているファイル(データファイル?) が見つけられません。 テーブルにデータをインサートしてコミットして、 セレクトを行ってデータは反映されていることは確認しています。 OSはWindows 7 MySQLのバージョンは5.5です。 user_dbというデータベースを作成し、 show databasesを行った結果、 information_schema mysql performance_schema test user_db が表示されることから、データベースuser_dbは正常に作られていると思います、 user_dbに対して、インサートは可能で、一度データベースを停止して、 再起動後、インサートしたデータがみれています。 しかし、インストールフォルダのMy.iniのdatadirで指定されているフォルダには mysql performance_schema のフォルダしかない状態です。(ここにuser_dbフォルダが作成されると思うのですが) どこにデータが保存されているのでしょうか?

    • ベストアンサー
    • MySQL
  • mysqlのデータベース設計(1テーブルで管理)

    お世話になります。 現在、会員がログインしてブログ管理できる(記事を作成・編集できるシステム)を考えています。 そこでデータベース設計について質問があります。 一般的には、 ・ユーザー情報に関するテーブル ・ブログ記事に関するテーブル この2つを以下のような感じで設計すると思うのですが↓ ■usersテーブル ・id ・ユーザー名 ・パスワード ■articleテーブル ・id ・user_id(記事投稿者のid) ・contents(ブログタイトル、ブログ本文) ・created ・modified 私は、この2つを1つのテーブルですべてまとめて管理することを考えているのですが、 何かデメリットはあるのでしょうか?↓ ■usersテーブル(このテーブル1つですべてまとめて管理) ・id ・ユーザー名 ・パスワード ・contents(ブログタイトル|ブログ本文|記事投稿日|記事編集日) ・created ・modified ちなみにブログ記事は、区切り文字で分けながらcontentsにどんどん詰め込んでいき(updateする)、 取り出すときは区切り文字をexplodeしていく形を考えています。 実際にはもっと項目が多くなるのですが、1ユーザーの情報をすべて1つのテーブルで管理することで個人的に非常にわかりやすい、さらに単純なのでこちらのほうが速度も速いのではないかと思っているのですが、良くないのでしょうか?(あまり見かけないので) どなたか教えていただけると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ブログサイトのデータベース処理

    ブログサイトのデータベース処理 FC2やライブドア、アメーバなどのブログサービスを展開しているサイトはユーザの記事や情報をどのように保存、処理しているのでしょうか。 一番気になるのは、ユーザごとにデータベースがあるのか、それとも記事テーブルがあり、そこに複数のユーザの記事が混在しているのかなのですが。。。 どうぞよろしくお願い致します。

  • 各ユーザーの記事が閲覧できるブログシステム

    (複数人の)ユーザーが記事を投稿し、各ユーザーのURLでそのユーザーの記事が閲覧できるブログシステムを考えております。 しかし、各ユーザのURLにアクセスしたとき、そのユーザーのデータをどのような方法で取得すれば良いのかわからず質問させていただきました。 以下、詳細となります。 ※MYSQLデータベーステーブル ・user_table id 名前 10 山田 11 鈴木 12 伊藤 ・,article_table id user_id url     text 1 10    yamada  山田です。 2 11    suzuki   鈴木です。 3 12    itou     伊藤です。 ※流れ 1,各ユーザーは管理画面にログイン 2,記事投稿ページで本文を入力し、投稿ボタンを押すとarticle_tableにデータが格納される。 3,domain.com/○○○(〇に入るのはyamadaなど、各ユーザーのurl) にアクセスすると、そのユーザーが投稿したarticle_tableのtextが表示される。) ※質問内容 domain.com/〇〇〇に、そのユーザーが投稿したtextを表示されるには、 <?php $st=$db->prepare("select * from article_table where user_id=:user_id"); $st->execute(array(":user_id"=>$user_id)); $data=$st->fetch(); echo $data["text"]; 、、、、 ?> といったように、$user_idによってそのユーザーのデータを引っ張ってくるかと思いますが、このとき$user_idの値はどのように得る方法が一般的なのでしょうか? ・方法(1) URLをdomain.com/〇〇〇?user_id=△△△として$_GETで取得すれば可能ですが、 一般的なアメブロなどのブログシステムでは、そのような変数はURLについていないかと思います。 ・方法(2) あらかじめユーザーごとのフォルダにuser_id.txtのようなファイルを用意し、そこに書かれているidを読み込んでいるのでしょうか? ・方法(3) 管理画面からユーザーが記事を投稿した時に、$user_idをファイルに埋め込んだ動的なphpファイルを生成して保存しているのでしょうか? <?php $user_id=10; $st=$db->prepare("select * from article_table where user_id=:user_id"); $st->execute(array(":user_id"=>$user_id)); $data=$st->fetch(); echo $data["text"]; 、、、、 ?> このソースごと含めてユーザーファイルを生成してしまう。 ただ、やり方が今のところわかっておりません。 ・方法(4) 別のなんらかの方法 ご存知の方いらっしゃれば、ご回答いただければ幸いです。 尚、各ユーザーURLのページは、静的なページ(html)ではなく、動的なページ(php)となります。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • SQL内でのデータコピー

    おはようございます! 今私が扱っているSQLデータであるコラムデータを違うコラムに移行したいのですがその方法が分かりません。 このSQLデータは「顧客」テーブルと言うものがあり、 「顧客」テーブルの「コメント」と言うコラム内データを「ノート」というコラムに移動したいです。 「顧客ID」があるので 「顧客ID」が同じという条件で 「顧客」テーブルの「コメント」内データを、「顧客」テーブルの「ノート」内に移動する 為にはどう言った構文を作成すればよろしいのでしょうか? かなり切羽詰まっているので宜しくお願いします!

  • 【MySQL】1対1でテーブルをあえて分ける

    mysqlを使用してデータベースを作成しているのですが データベースでテーブルを分けるときって 【アカウントテーブル】 ID アカウント 名 アカウント パスワード 名前 住所 電話番号 職業 【職業テーブル】 職業ID 職業名 というような1対多というのはよく組むとおもうんですが 下記のような 【アカウント情報テーブル(アカウント情報)】 アカウントID アカウント 名 アカウント パスワード 【アカウント情報テーブル(プロフィール情報)】 アカウントID 名前 住所 電話番号 職業 1対1の関係でテーブルをジャンル(エンティティ)ごとに複数にわけて あとでリレーションして一個にまとめるというのはデータベース的にあまりよろしくないのでしょうか? 何故、こんなことしたいかというと、1テーブルあたりのカラム数がかなり多くなってくると PHPでデータベースを書き込んだり呼び出したりする時に毎度多くのカラムを取り扱わなければならず SELECTで、カラムを一個一個選んで行かないといけません。 しかし、取り扱いたいカラムは大抵の場合あるジャンルだけなので リレーションするかしないかで、あるジャンルのデータだけを取り扱えれば 効率がよくなるのでは? というのがあります。 また、視覚的にカラムの把握もしやすくなります。 この1対1テーブルは、DB設計的にどうなでしょうか?

    • ベストアンサー
    • MySQL

専門家に質問してみよう