パスワードだけでもいいんすけどね。
まあ、偶然同じパスワードの他の人の投稿消せるのも具合悪いんで…
この花は?内で一人しか存在できないようにしたハンドル名を所得してもらうことにします。
用意するページはログインと新規登録を兼ねたものにしますた。
好きなハンドル名とパスワード入力して新規登録ボタンを押すと、すでに登録済みのハンドル名でなければ、そのまま投稿ページ(mainlist.php)へ、そうでなければ「別名使ってね」というメッセージを表示して再度やりなおしてもらう。
これを実現するために、ハンドル名とパスワードを管理する新しいエンティティとして、メンバーを用意するわけです。
データーベースとしてはこいつをテーブルmembersとして持っておいて、新規登録ページ(login.php)では入力されたハンドル名でこのmembersテーブルを検索してみるわけですな。
SQL文はこんな感じ。
って、ちょいちょいちょ~い!
さっきから自分、エンティティとかSQLとか何言ってるの?な人はその(150)~その(153)、その(74)~その(80)あたりを読みましょう。
自分で書いてても、ハードル上がり過ぎだとは思うけどよ…
でも、実際ここらへん勉強して、ブログの仕組みとかiPhoneとの連携の仕方とかが見えてきたわけで…
勉強する価値は十分ありっすよ~。
こいつで、idが返ってきたら、それはすでに存在するハンドル名ってことになるので「別名使ってね」というメッセージを表示すればいいし、存在しなければ新規登録OKということで
というSQL文で登録ちゅう事になります。
これに関連して、投稿エンティティにはメンバエンティティを1対1で結びつけるようにしておけば、どの投稿が、どのメンバによって管理されるかがはっきりして、そこからたどる事で関連する写真や提案、投票も管理できるようになるわけっす。
登録や、ログインがうまくいけば、前回やった$_SESSION変数にログイン済のフラグやMembersのidを設定して
投稿ページ(mainlist.php)にジャンプさせるちゅーわけ。
get_host()はcom_function.phpに用意してる関数で、中で使ってる$_SERVER["HTTP_HOST"]やrtrim()、dirname()なんかはPHPの関数。こいつらの説明はリンク貼っておいたので、各自で勉強してください。
rtrim()
dirname()
header()関数もPHP関数、RCFの取り決めでヘッダーに
を書く事でブラウザの表示ページをURLで指定したページにジャンプさせることができるんですな。
header()
で、戻ってきた投稿ページ(mainlist.php)では$_SESSION['login_id']と一致する投稿者ID(auther_id)を持つ投稿には「削除」ハイパーリンクを表示するようにするわけっす。
ハイパーリンクでは自分自身を?delete_id= 投稿ID付きでリンクします。この?delete_id=投稿IDは$_GET['delete_id'])とすることで投稿IDの値が取り出せます。
hrefの内容がいきなり?delete_id= 投稿ID で始まってるんですが、こうやってURLを省略すると自分自身を指定した事になるみたい。
この場合
と書いたの同じになるらしい。
で、$_GET['delete_id'])が設定されていたら、delete_idで指定された投稿の削除作業に入るちゅーわけです。
というSQL文で指定された投稿の情報を取り出し、author_idがlogin_idと一致したら削除権限ありとして、投稿を削除、
関連画像を削除、
関連する提案を削除、
関連する支持を削除していくわけです。
ただ~し、支持は提案IDしか持っていないので、まず
で投稿に関連する全提案IDをリストアップし、各提案ID($sug_id)に関する支持を
で削除していく事になります。
ここらへん、支持に提案IDだけじゃなく投稿IDも結びつけておけば以下のSQL文一発で済んだんだけどね~。
ちょっと後悔。
本番ではそうしよう。
あとはその(201)で用意したCSSファイルを読み込むようにして、以前のTABLEタグでのレイアウトをやめてDIVタグを使ったものに置き換えれば投稿ページ(mainlist.php)がほぼ完成~。
同じような事を提案ページ(suggestlist.php)、支持ページ(suggest.php)にもほどこしてくと、こんな感じになる。
自分が投稿したやつは「削除」が出て、押すとちゃんと削除される。
うむうむ、削除も対応で本格的になってきました。
つか、ここまでできるなら、呼び出し側の環境(Windowsかとか)も調べる事できるんでiPhoneからの読み込み時はアメブロがやってるようにiPhone用のCSS使うようにすれば、わざわざiPhoneアプリを用意する必要はないんだけどね~。
まあ、勉強ということで…
次回、ページング処理を追加してサーバー側の対応は完了。
とりあえず、データベースとPHP一式をアップしときます。PHPのソースはかなり雑だけど…
------------
サンプルプロジェクト:konohana20100510.zip
解凍するとsampleというフォルダができ、中に
があるので、konohanaフォルダはWebサーバの管理下にあるフォルダ
あたりに配置(移動>フォルダへの移動…メニューで出るダイアログで上のパスを指定するなりして特定してください)。
konohana.sqlファイルはその(129)で紹介したphpMyAdminでインポートしましょう。古いkonohana_testデータベースが残ってる人は、先に古いやつをDROPね。
1、phpMyAdminでインポート
2、成功すると左側のデータベース一覧にkonohana_testというデータベースが表示される。
3、以前に作ったkonohana_testがある人はデータベースタグからkonohana_testをチェックして削除してから1、2を実行。
>
4、次にデータベースを操作するユーザの設定。以前のkonohana_testデータベースがあった人は、すでにxccというユーザがあるはずなので、5、6、7の作業は不要。
そうでない人は新しいkonohana_testをクリックして選んでおき
5、特権タグをクリック。
6、初めての人は新しいユーザーを追加するをクリック
7、以下の設定でユーザーを作成。
グローバル特権はすべてチェックするをクリック。
これで準備ができたので、あとは
http://localhost/konohana/mainlist.php
へGo!だ。
まあ、偶然同じパスワードの他の人の投稿消せるのも具合悪いんで…
この花は?内で一人しか存在できないようにしたハンドル名を所得してもらうことにします。
用意するページはログインと新規登録を兼ねたものにしますた。
好きなハンドル名とパスワード入力して新規登録ボタンを押すと、すでに登録済みのハンドル名でなければ、そのまま投稿ページ(mainlist.php)へ、そうでなければ「別名使ってね」というメッセージを表示して再度やりなおしてもらう。
これを実現するために、ハンドル名とパスワードを管理する新しいエンティティとして、メンバーを用意するわけです。
データーベースとしてはこいつをテーブルmembersとして持っておいて、新規登録ページ(login.php)では入力されたハンドル名でこのmembersテーブルを検索してみるわけですな。
SELECT id FROM members WHERE name='ハンドル名'
SQL文はこんな感じ。
って、ちょいちょいちょ~い!
さっきから自分、エンティティとかSQLとか何言ってるの?な人はその(150)~その(153)、その(74)~その(80)あたりを読みましょう。
自分で書いてても、ハードル上がり過ぎだとは思うけどよ…
でも、実際ここらへん勉強して、ブログの仕組みとかiPhoneとの連携の仕方とかが見えてきたわけで…
勉強する価値は十分ありっすよ~。
こいつで、idが返ってきたら、それはすでに存在するハンドル名ってことになるので「別名使ってね」というメッセージを表示すればいいし、存在しなければ新規登録OKということで
INSERT INTO members (name,password) VALUES('ハンドル名', 'パスワード')
というSQL文で登録ちゅう事になります。
INSERTのエラーで、登録済ハンドル名かを判断する方法もあるかもしれない。
ただ、登録済ハンドル名のせいで登録できなかったというエラーなのか、その他のエラーなのかの判断方法を調べるのがめんどくさかったので、ここではSELECT文でチェックしてる。
ただ、登録済ハンドル名のせいで登録できなかったというエラーなのか、その他のエラーなのかの判断方法を調べるのがめんどくさかったので、ここではSELECT文でチェックしてる。
これに関連して、投稿エンティティにはメンバエンティティを1対1で結びつけるようにしておけば、どの投稿が、どのメンバによって管理されるかがはっきりして、そこからたどる事で関連する写真や提案、投票も管理できるようになるわけっす。
その(151)では、花の写真は投稿に依存させない予定と書いたけど、投稿が削除された後の管理がめんどくさそうなので、一緒に消すようにしますた。
登録や、ログインがうまくいけば、前回やった$_SESSION変数にログイン済のフラグやMembersのidを設定して
$_SESSION['login_id'] = $id;
$_SESSION['logined'] = 1;
$_SESSION['logined'] = 1;
投稿ページ(mainlist.php)にジャンプさせるちゅーわけ。
$host = get_host(); // ベースになるURIの所得
header("Location: http://$host/mainlist.php");
exit();
header("Location: http://$host/mainlist.php");
exit();
get_host()はcom_function.phpに用意してる関数で、中で使ってる$_SERVER["HTTP_HOST"]やrtrim()、dirname()なんかはPHPの関数。こいつらの説明はリンク貼っておいたので、各自で勉強してください。
rtrim()
dirname()
header()関数もPHP関数、RCFの取り決めでヘッダーに
Location: http:URLパス
を書く事でブラウザの表示ページをURLで指定したページにジャンプさせることができるんですな。
header()
で、戻ってきた投稿ページ(mainlist.php)では$_SESSION['login_id']と一致する投稿者ID(auther_id)を持つ投稿には「削除」ハイパーリンクを表示するようにするわけっす。
ハイパーリンクでは自分自身を?delete_id= 投稿ID付きでリンクします。この?delete_id=投稿IDは$_GET['delete_id'])とすることで投稿IDの値が取り出せます。
<a href = "?delete_id= 投稿ID ">削除</a>
hrefの内容がいきなり?delete_id= 投稿ID で始まってるんですが、こうやってURLを省略すると自分自身を指定した事になるみたい。
この場合
http://localhost/konohana/mainlist.php?delete_id=投稿ID
と書いたの同じになるらしい。
で、$_GET['delete_id'])が設定されていたら、delete_idで指定された投稿の削除作業に入るちゅーわけです。
SELECT author_id,url,image.id AS image_id FROM contribution,image
WHERE contribution.id=$delete_id AND image=image.id
WHERE contribution.id=$delete_id AND image=image.id
というSQL文で指定された投稿の情報を取り出し、author_idがlogin_idと一致したら削除権限ありとして、投稿を削除、
DELETE FROM contribution WHERE id=$delete_id
関連画像を削除、
DELETE FROM image WHERE id=$image_id
関連する提案を削除、
DELETE FROM suggestion WHERE cont_id=$delete_id
関連する支持を削除していくわけです。
ただ~し、支持は提案IDしか持っていないので、まず
SELECT id FROM suggestion WHERE cont_id=$delete_id
で投稿に関連する全提案IDをリストアップし、各提案ID($sug_id)に関する支持を
DELETE FROM vote WHERE sug_id=$sug_id
で削除していく事になります。
ここらへん、支持に提案IDだけじゃなく投稿IDも結びつけておけば以下のSQL文一発で済んだんだけどね~。
DELETE FROM vote WHERE cont_id=$delete_id
ちょっと後悔。
本番ではそうしよう。
あとはその(201)で用意したCSSファイルを読み込むようにして、以前のTABLEタグでのレイアウトをやめてDIVタグを使ったものに置き換えれば投稿ページ(mainlist.php)がほぼ完成~。
同じような事を提案ページ(suggestlist.php)、支持ページ(suggest.php)にもほどこしてくと、こんな感じになる。
自分が投稿したやつは「削除」が出て、押すとちゃんと削除される。
うむうむ、削除も対応で本格的になってきました。
つか、ここまでできるなら、呼び出し側の環境(Windowsかとか)も調べる事できるんでiPhoneからの読み込み時はアメブロがやってるようにiPhone用のCSS使うようにすれば、わざわざiPhoneアプリを用意する必要はないんだけどね~。
まあ、勉強ということで…
次回、ページング処理を追加してサーバー側の対応は完了。
とりあえず、データベースとPHP一式をアップしときます。PHPのソースはかなり雑だけど…
------------
サンプルプロジェクト:konohana20100510.zip
解凍するとsampleというフォルダができ、中に
konohanaフォルダ
konohana.sqlファイル
konohana.sqlファイル
があるので、konohanaフォルダはWebサーバの管理下にあるフォルダ
/Library/WebServer/Documents
あたりに配置(移動>フォルダへの移動…メニューで出るダイアログで上のパスを指定するなりして特定してください)。
konohana.sqlファイルはその(129)で紹介したphpMyAdminでインポートしましょう。古いkonohana_testデータベースが残ってる人は、先に古いやつをDROPね。
1、phpMyAdminでインポート
2、成功すると左側のデータベース一覧にkonohana_testというデータベースが表示される。
3、以前に作ったkonohana_testがある人はデータベースタグからkonohana_testをチェックして削除してから1、2を実行。
>
4、次にデータベースを操作するユーザの設定。以前のkonohana_testデータベースがあった人は、すでにxccというユーザがあるはずなので、5、6、7の作業は不要。
そうでない人は新しいkonohana_testをクリックして選んでおき
5、特権タグをクリック。
6、初めての人は新しいユーザーを追加するをクリック
7、以下の設定でユーザーを作成。
ユーザー名:xcc
ホスト:ローカル
パスワード:abc
ホスト:ローカル
パスワード:abc
グローバル特権はすべてチェックするをクリック。
これで準備ができたので、あとは
http://localhost/konohana/mainlist.php
へGo!だ。