編集結果をデータベースに格納する処理を実装

編集結果をデータベースに格納する処理を実装
#20 データの編集をしてみよう (3)
http://dotinstall.com/lessons/contacts_php_v2/9820
を元に
編集結果をデータベースに格納する処理を実装
admin/edit.php で
名前が表示されていないので
HTMLのソースの部分で
お名前の input 要素の value の値に

を追加して
入力した名前を表示できるようにする
これで、動作確認
http://192.168.10.155/contacts_php/admin/edit.php?id=
の後ろに数値以外を入力したり
ありえない数値で
ちゃんとエラーがでれば成功
次にDBの更新処理
これは
if(empty($error)){
の中に追記する
まずSQLを変数へ格納
$sql =”update entries set
name = :name,
email = :email,
memo = :memo,
moodified = :now(),
where id = :id”;
$stmt = dbh->prepare($sql);
$params = array(
“:name”=>$name,
“:email”=>$email,
“;memo”=>$memo,
);
$stmt->execute($params);
とする
動作確認は
#21 データの編集をしてみよう (4)
http://dotinstall.com/lessons/contacts_php_v2/9821
を元に行う
ここではデバッグ方法も紹介されている
このままだと動かない
理由は
:name
:email
:memo
:id
だったけど
:id の処理がなかったのが原因
これでも、エラーが特定できない場合
一度中身を
var_dump() で確認する
エラー情報は errorInfo() で取得できる
 
errorInfo() に関しては
http://php.net/manual/ja/pdo.errorinfo.php
を参照
ということで
$stmt->execute($params);
の下に
var_dump($stmt->errorInfo());
exit;
を追記し
エラー内容を取得して表示し
終了するようにする
これで、習性場所を把握し
修正することで編集ができるようになる

GETで渡されたIDのチェックtと表示するデータ取得

GETで渡されたIDのチェックtと表示するデータ取得
#19 データの編集をしてみよう (2)
http://dotinstall.com/lessons/contacts_php_v2/9819
を参考に
GETで渡されたIDのチェックを行い、表示するデータを取得
まずGETで渡された値がただしいか
正規表現を使ってチェック
これは
preg_match() という関数でできる
解説は
http://phpspot.net/php/man/php/function.preg-match.html
を参考
今回は、GETで渡された id をパターンで調べるので
if(preg_match(‘/^[1-9][0-9]*$/’ $_GET[‘id’])){
}
となる
パターンの正規表現の意味は
1から始まる数字の連番
^[1-9][0-9]*$
これで1桁目が1~9、そして、そのあとは
0~9の繰り返しとなる
^は1行め
$は行末
*は、0回以上の繰り返し
という意味
正規表現については
PHP正規表現チェッカー ver1.0.3
http://www.rider-n.sakura.ne.jp/regexp/regexp.php
を参考に
preg_match() で指定したパターンにあっているなら
$id にGETで渡されたIDを格納するので
$id =(int)$_GET[‘id’];
とする
もし、条件を満たしていないのなら
echo “不正な」IDです”;
exit;
として終了するようにする
これで、GETの判定はできたので
DB接続関連
setToken();
の下あたりに追記
$stmt = $dbh->prepare(“select * from entries where id= :id limit 1”);
$stmt->execute(array(“:id”=>$id));
$entry = $stmt->fetch() or die(“no one found “);
or die(“no one found “);は失敗したときの処理
次に、DBの中身を格納する変数を用意
$name = $entry[‘name’];
$email =$entry[‘email’];
$memo = $entry[‘memo’];

データ削除フラグによる削除の実装

データ削除フラグによる削除の実装
#17 データを削除してみよう (3)
http://dotinstall.com/lessons/contacts_php_v2/9817
を元に
削除をおした時に、件数が反映されていないので
これを修正する
これを実装するには
span 要素に id=”num” というように id を振ってコントロールできるようにする
<p><span><?php echo count($entries); ?></span>件あります。</p>

<p><span id=”num”><?php echo count($entries); ?></span>件あります。</p>
と変更する
次に、jQuery 部分のソース変更
confirm() の if のところで
var num = $(‘#num’).text();
.text() は、中身の取得をする関数
そして、
num–;
とすれば、件数を引くことができる
計算はできているけど、これだけでは
表示している件数は変わらない
変更するには
$(‘#num’).text(num);
というように
.text() に num をセットすれば変更が反映される
とりあえず、ここまでできたら、動作確認
Google Chrome で
developer console を起動して、エラーなしを確認
これで、実際に行ってみると、削除すると件数が変わるのを体験できる

jQueryとAjaxを使ってデータの削除処理を実装

jQueryとAjaxを使ってデータの削除処理を実装
#15 データを削除してみよう (1)
http://dotinstall.com/lessons/contacts_php_v2/9815
を元に
jQueryとAjaxを使ってデータの削除処理を実装
編集するファイルは
admin/index.php
まず、jQuery を使うので、ライブラリの読み込み
HTMLの head 要素の中に
<script src=”https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js”></script>
を追記
deletelink に対してクリックされたときの処理を
jQuery で実装する
書き込み場所は
お問い合わせフォームへのリンクの下あたり
$(function(){
$(‘.deletelink’).click(‘function(){
if(confirm(“削除してもよろしいですか?”)){
$.post(‘./delete.php’,
.deletelink は
class=”deletelink” という意味
. は jQuery ではクラスを意味する
confirm() は java script で 確認ウインドウを開く
“”の中に書いた
削除してもよろしいですか?は
そのときにでるメッセージ
これは
Step.17 – 確認ウィンドウで問い合わせる
http://www.red.oit-net.jp/tatsuya/java/confirm.htm
がわかりやすい
$.post() は
ajax jQuery を使ったPOST送信
これを使うと、複雑な$.ajax() を使わずに
サーバーと通信できる
http://semooh.jp/jquery/api/ajax/jQuery.post/+url,+data,+callback,+type+/
を参考にするとわかりやすい
書式としては
$.post(url, data, callback, type)
となる
$.post(
‘./delete.php’,
{ id: $(this).data(‘id’)},
function(rs){
$(‘#entry_’ +rs).fadeOut(800);
});
}
});
コールバック関数で消したいのは li 要素なので
li要素に id をつける
<li id=”entry_<?php echo h($entry[‘id’]); ?>”>
とする
PHPで 呼び出しているので
ループしている間、自動的に id を付与してくれる
また、コールバック関数内で
rsに id が入るようになるので
entry_ + rs だと
id=1 なら entry_1 となる

削除フラグ設定

削除フラグ設定
#14 削除フラグを設定しよう
http://dotinstall.com/lessons/contacts_php_v2/9814
を参考に、削除フラグで管理できるようにDB設定を変更
今までは、DBのレコードから直接削除だったけど
今回は削除フラグを立てて、
そこから削除するようにしていく
初期のDB設計のときに設定が抜けているため
DBの設定を変更する
DBの変更には alter コマンドを使う
alter table entries add status enum(‘active’,’deleted’) default ‘active’ after memo;
このSQLを実行することで
テーブルに追加される
after memo となっているので
memo の後ろに追加される
default ‘active’ となっているので普通に挿入したら
active 扱いになる
mysql -u root -p でログインすると
DB移動が面倒なので
mysql -u dbuser -p dotinstall_contacts_php
として
dbuser のパスワードを入れれば
一回で今使っているDBにログインできる
まずは、この状態を確認するため、
desc entries;
で現状を確認
そして
今回の alter コマンドを実行
desc entries;
で確認すると
新しい項目ができているのが確認できる
DB設計の変更ができたら、管理画面である
admin/index.php も変更する
$sql のところのSQL文を
select * from entries where status = ‘active’ order by created desc
として、active 状態のものだけ表示するようにする
こうすることで
削除をえらんだ時に
レコードを抹消するのではなく、
status を active から deleted に変更するというようになる
おそらく、このフラグをつくるというのは
ゲーム作成などでも使えると思うので、今後の参考にしようと思う

DBからの一覧表示

DBからの一覧表示
#13 お問合せの一覧を表示しよう (2)
http://dotinstall.com/lessons/contacts_php_v2/9813
を参考に
DBの出データをリスト形式で表示し、
必要なリンクを設定
var_dump($entries);
exit;
で中身の表示ができたら、これをコメントアウト
/admin/index.php の
HTML部分を編集していく
まず、格納されている件数を表示するには
$entries の件数をカウントすればいいので
<?php echo count($entries); ?>件あります
とすれば、
count() によりカウントして数値を表示してくれる
count() に関しては
http://php.net/manual/ja/function.count.php
のマニュアルを参照
これは要素の数を数える関数
そして、リスト表示は
foreach() と echo を使ってループで作成する
この手法は
Web API で取得した結果をリスト表示するのにも
よく使われる
例えば、検索ワードでヒットした結果を
リスト表示するとか、
キーワードにリンクした
アフィリエイトのリンクをリスト表示するなどなど
今回はPHPだけど java script なら
phone gap などでハイブリッドアプリにして
リリースも可能
今回の場合だと
一覧表示を作って
そこに出てきたEメールアドレスをリスト表示して
削除
編集
のリンクもつけたリストを作成している
<ul>
<?php foreach($entries as $entry) :?>
<li>
<?php echo h($entry[‘email’]); ?>
<a href=”edit.php?id=<?php echo h($entry[‘id’]); ?>”>[編集]</a>
<span class=”deletelink” data-id=”<?php echo h($entry[‘id’]); ?>”>[削除]</span>
</li>
<?php endforeach; ?>
</ul>
<?php echo h($entry[‘email’]); ?>
でEメールの表示
<a href=”edit.php?id=<?php echo h($entry[‘id’]); ?>”>[編集]</a>
で編集リンクの作成
<span class=”deletelink” data-id=”<?php echo h($entry[‘id’]); ?>”>[削除]</span>
で削除という表示を作成
<style>
.deletelink {
color:blue;
cursor: pointer;
}
</span>
とすることで、リンクっぽくしている
cursor: pointer;
はリンクカーソル
詳しい解説に関しては
★スタイルシートリファレンス
http://www.htmq.com/style/cursor.shtml
を参照

エラーの表示と入力の内容保持

エラーの表示と入力の内容保持
#08 エラーメッセージを表示しよう
http://dotinstall.com/lessons/contacts_php_v2/9808

を元に
エラー内容の表示と
入力内容の保持を実装
編集するのは index.php
HTMLのメールアドレスのところに
<?php if($error[‘email’]) { echo h($error[‘email’]); } ?>
を追記
また、内容のところにも
<?php if($error[‘memo’]){ echo h($error[‘memo’]); } ?>
とする
このままだと再入力になり面倒なので
入力内容の保持を実装
メールアドレスを 入力する input 要素の value を
value=”<?php echo h($email); ?>”
として
内容を入力する textarea 要素も
<?php echo h($memo); ?>
とすれば
入力した内容が保持されるようになる

投稿データのエラーチェック実装

投稿データのエラーチェック実装
#07 エラーチェックを行おう
http://dotinstall.com/lessons/contacts_php_v2/9807
を元に
投稿データのエラーチェックを実装
まず、index.php でセッションを使うので
session_start();
を追記
HTML部分に隠し要素として token を form に仕込んでおくため
<input type=”hidden” name=”token” value=”<?php echo h($_SESSION[‘token’]); ?>”>

</form>
の前に書いておく
これで、 token 設定はできたので、
次に投稿後の処理を実装
まずPOSTで渡された数値を変数に格納
$name =$_POST[‘name’];
$email =$_POST[‘email’];
$memo =$_POST[‘memo’];
そして、次にエラーチェック
$error = array();
でエラーを入れる配列の準備
そして、エラー処理するけど、
もし、エラーがないのなら、DBに投稿内容を入れていく
if(empty($error)){
という条件式になる
エラー処理は、 if により複数のエラーチェックを行っていく
今回の条件式では
filter_var() を使い Email のチェックをする
filter_var() は
指定したフィルタでデータのフィルタリングを行う
http://php.net/manual/ja/function.filter-var.php
のマニュアルを参照
もし、Email の形式が正しくないのならという判定をするには
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
とする
FILTER_VALIDATE_EMAIL
は、
値が e-mail 形式であるかどうかを検証する
この場合の処理として
$error[‘email’] =”メールアドレスの形式が正しくありません”;
というようにして、
$error にエラー内容を格納する
また、メールアドレスが空欄なら
if($email ==”){
$error[‘email’] =”メールアドレスを入力してください”;
}
メモが未記入場合の対処なら
if($memo ==”){
$error[‘memo’] =”内容を入力してください”;
}
というようにして対処する

お問い合わせフォーラム作成

お問い合わせフォーラム作成
#05 お問合せフォームを作ろう
http://dotinstall.com/lessons/contacts_php_v2/9805

を参考に
投稿フォームを作成
編集するのは index.php
method=”POST” action=””
というように
自ふぁいるに飛ばす
<form method=”POST” action=””>
<p>お名前; <input type=”text” name=”name” value=””></p>
<p>メールアドレス * :<input type=”text” name=”email” value=””></p>
<p>内容 * :
<textarea name=”memo” cols=”40″ row=”5″></textarea></p>
<p><input type=”submit” value=”送信”></p>
</form>
とする
そして、
#06 CSRF対策を施そう
http://dotinstall.com/lessons/contacts_php_v2/9806
を参考に
CSRF対策を施す
これはトークンチェック
PHP部分にソースを追加
if($_SERVER[‘REQUEST_METHOD’] !=’POST’){
//投稿前の処理
//CSRF対策
setToken();
}else {
//投稿後の処理
checkToken();
}
という分岐になる
リクエストメソッドがPOSTか、そうでないかで分岐している
CSRF対策は
setToken()という function.php で作成するユーザ関数を使う
function setToken(){
//セッショントークンがセットされていないのならセット
if(!isset($_SESSION[‘token’])){
$_SESSION[‘token’] = sha1(uniqid(mt_rand(),true));
}
}
tokenが空、もしくはtoken の値が違うなら
エラーをだして終了
function checkToken(){
if(empty($_POST[‘token’]) || $_POST[‘token’] != $_SESSION[‘token’]){
echo “不正処理です”;
exit;
}

関数ファイル作成とページのつくりこみ

関数ファイル作成とページのつくりこみ
#04 よく使う関数を登録しておこう
http://dotinstall.com/lessons/contacts_php_v2/9804
を元に
functions.php へ
ユーザ関数を作成していく
function connectDb(){
try{
return new POD(DSN,DB_USER,DB_PASSWORD);
}catch(PODException $e){
echo $e->getMessage();
exit;
}
}
try には、接続成功したときの処理
この catch 部分で例外発生したときに
エラーメッセージを表示する
try には、接続成功したときの処理
この catch 部分で例外発生したときに
エラーメッセージを表示する
htmlspecialchars() を略称で使うため
function h($s){
return htmlspecialchars($s,ENT_QUOTES,’UTF-8′);
として UTF-8 文字コードを指定
これで保存して
次に、 index.php を作成して編集
ここで作成したファイルを
require_once() で読み込む
読み込むのは、
config.php
functions.php
になる
PHP部分の下にHTMLコードをつくってページをつくっていく