2013年12月3日火曜日

[MySQL]、[php] 分類のindex管理(4)

引き続き分類を文字列からindex管理に変更する過程です。
【関連する記事】
[MySQL]、[php] 分類のindex管理(1)
[MySQL]、[php] 分類のindex管理(2)
[MySQL]、[php] 分類のindex管理(3)

前回まではデータベースに登録されてある分類項目を選択項目としてhtmlで表示するところまで紹介しました。

今回は全ユーザー共通の分類項目とユーザー独自の分類項目を分けて管理する部分を紹介します。


実は、[MySQL]、[php] 分類のindex管理(2)で作ったテーブルにuser_idを入れておきました。このuser_idを使います。
まずはマスターのIDとしてuserテーブルのID=0にmasterとでも登録しておきます。
これが全ユーザーが使う分類項目となります。同時にuser_id=0が、この後ユーザーとして登録されないように埋めておくことにもなります。

ユーザー独自分類登録

では、ユーザーが分類を登録するページを作ります。前提としてユーザーIDが$_SESSION['user_id']によって受け取れる状態としてます。

[specification_choice.php]

<h2>ユーザー独自の分類を登録</h2>
<form action=“insert_action.php” method="post" >  
 <label>名称</label>
 <input type="text" name="specification_name" />
 <input type="submit" value="追加"/>
</form>

[insert_action.php]

$sql = sprintf('INSERT INTO pay_specifications SET name="%s", user_id=%d, created=NOW()',
  mysql_real_escape_string($_POST["specification_name"]),
  mysql_real_escape_string($_SESSION['user_id'])
  );
mysql_query($sql, $link) or die(mysql_error());

ユーザー独自分類取り出し

それでは、SQL文を書き換えます。phpのコードは前回のページを参照してください。

【やりたいこと】

pay_specificationsを読み出す時にuser_id=0(マスターのID)と使用するユーザー自身のidだけを読み込む

【コード before】

$sql = sprintf('SELECT * FROM pay_specifications
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id']

【コード after】

$sql = sprintf('SELECT * FROM pay_specifications
 WHERE user_id=0 OR user_id=%d
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id']


2行目にWHERE句を追加しました。
これで、他のユーザーが独自に使用する分類項目は表示されないはずです。

ユーザー独自分類の非表示

最後に、ユーザー独自の分類項目を入力ではもう使わないが、一覧表示にはそのまま残したい。そんな時のためにユーザー独自の分類項目は削除ではなく使用フラグでかんりするようにしました。これもテーブルには用意してあって、usesカラムを使って

  1. 使用
  2. 不使用

と定義して、

[insert_action.php内書き込みのSQL]

$sql = sprintf('INSERT INTO pay_specifications SET name="%s", user_id=%d, created=NOW(), uses=1',
  mysql_real_escape_string($_POST["specification_name"]),
  mysql_real_escape_string($_SESSION['user_id'])
  );
mysql_query($sql, $link) or die(mysql_error());

[読み込みのSQL]

SELECT * FROM pay_specifications
 $sql = sprintf('WHERE user_id=0 OR user_id=%d AND uses=1
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id']

[新たに、削除用のページを作り以下のSQLを発行]

UPDATE pay_specifications SET uses=2 
 $sql = sprintf('WHERE id=%d AND user_id=%d',
 mysql_real_escape_string($_POST['not_use_id']),
 mysql_real_escape_string($_SESSION['user_id'])

deleteするのではなくuses=2とすることで選択肢として表示されず、一覧表示にはそのまま表示される仕組みになっています。

0 件のコメント:

コメントを投稿