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

エラーの表示と入力の内容保持
#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;
}

ローカルPCの変更の自動的反映

ローカルPCの変更の自動的反映
rsync はファイルの変更差分だけデータ同期できる
差分だけ転送するから
ネットワーク経由のバックアップも可能
lsyncd は、Linuxカーネルの
inotifyというファイル変更のイベント通知機能を使い
ファイル更新を検出する
lsyncd から rsync を起動すれば
バックアップ用のミラーリングサーバー構築ができる
まず、
バックアップ用サーバーの設定
同期用ディレクトリの作成
sudo mkdir /data/
/dataを同期先ディレクトリへ設定するには
rsyncの設定ファイル
/erc/rsyncd.conf

source=””の設定をフルパスで指定
source=”/home/snowpool/data/”
というようにする
次に、
rsyncがデフォルトデーモン、つまり常駐プロセスとして起動するように
設定
これは、
/etc/default/rsync
の中を
RSYNC_ENABLE=trueにする
そして、サービス起動
sudo /etc/init.d/rsync start
ここまでできたら、次はクライアントの設定をする
バックアップ元ディレクトリの作成
sudo mkdir ~/data
そしてlsyncdをインストール
sudo apt-get install lsyncd
lsyncdのサンプルファイルを元に設定ファイルの作成
sudo mkdir /erc/lsyncd
sudo cp /usr/share/doc/lsyncd/examples/lsyncd.1ua /erc/lsyncd/lsyncd.conf.1ua
コピーできたら設定ファイルの編集
hosts allow =
へアクセス可能にするpc のIPアドレスを記述
例えば
hosts allow = localhost 192.168.10.248
また、exclude =
へ同期対象にしない拡張子を記述
もし、subversionとかgitを非対象にするなら
exclude = .git .svn
ここまで設定ファイルできたら
クライアントマシンの
lsyncdを起動
sudo /etc/init.d/lsyncd start
ここまでできたら
適当に自動的反映できるディレクトリへ
ファイル作成
echo abcd > ~/data/abcd
これで、サーバー側にもデータ同期されているなら成功

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

関数ファイル作成とページのつくりこみ
#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コードをつくってページをつくっていく

お問い合わせ管理システムの共有ファイル設定

お問い合わせ管理システムの共有ファイル設定
#03 アプリ共通の設定をしよう
http://dotinstall.com/lessons/contacts_php_v2/9803
を元に
共有するものを config.php にかいておいて
あとで require_once() で
必要なときに読み込むようにする
定数の設定は define()を使う
まずデータソースネーム
define(‘DSN’,’mysql:host=localhost;dbname=dotinstall_contacts_php’);
次にDBユーザ
define(‘DB_USER’,’dbuser’);
そしてDBパスワード
define(‘DB_PASSWORD’,’ddpk998Zacv’);
そして、サイトのURL 今回はIPアドレス
define(‘SITE_URL’,’http://192.168.10.248/contacts_php/’);
そして、管理画面
define(‘ADMIN’,SITE_URL.’admin/’);
エラー出力の設定は
error_reporting(E_ALL & ~E_NOTICE);
として、NOTICE以外を出力する
セッションの有効範囲が
session_set_cookie_params(0,’/contacts_php/’);
として
contacts_php のみ有効になるようにする

お問い合わせ管理システムの作成

お問い合わせ管理システムの作成
必要な知識は
html
css
jquery
php
mysql
となる
contacts_php
が作業ディレクトリ
contacts_php/admin/
が管理画面になる
まず、DB作成
#02 データベースの設定をしよう
http://dotinstall.com/lessons/contacts_php_v2/9802
を元にDB作成
create database dotinstall_contacts_php;
grant all on dotinstall_contacts_php.* to dbuser@localhost identified by ‘ddpk998Zacv’;
use dotinstall_contacts_php;
エントリーテーブル作成
create table entries (
id int not null auto_increment primary key,
name varchar(255),
email varchar(255),
memo text,
created datetime,
modified datetime);
これらのSQLコマンドを
qa.sql
というようなSQLファイルにしておくと
他の環境でも簡単につくれるし
毎回コマンドをうたなくてもいいので効率的
sql ファイルができたら
mysql -u root -p < qa.sql を実行して mysql の root パスワードの入力することで SQLが実行され、DBが作成される mysql -u root -p でログインして use dotinstall_contacts_php; desc entries; で内要確認してできていることを確認 カラムの意味は id int not null auto_increment primary key, で主キー作成+自動連番 name varchar(255), 名前 email varchar(255), メルアド memo text, メモ

画像掲示板に画像一覧を表示

画像掲示板に画像一覧を表示
#17 画像一覧を表示する (1)
http://dotinstall.com/lessons/upload_image_php/4517
を元に
配列に格納されたファイル名を元に画像を表示していく
編集するのは index.php
表示する画像は images[] の中に
サムネイル
元の大きさ
の画像が条件に基づき入っているので、あとは表示するだけ
表示は foreach() で表示する
<?php foreach($images as $image) ; ?>
そして、サムネイル画像だったときには
リンクをつけて、元画像が表示できるようにする
そして、サムネイル画像がないのなら、元画像を
そのまま表示する
サムネイル画像か、元画像かの判定には
strpos() を使う
http://php.net/manual/ja/function.strpos.php
$image の中から thumbnail という文字列を探し
位置が0文字目から始まる
つまり ===0 であるか判定する
注意点としては
strpos() は
対象文字列が見つからなかった場合に
false を返すため ==0 だと true になるので
0文字目という判定にしたいのなら
===0
とすること
なので、判定の条件式は
if(strpos($image, ‘thumbnails/’) === 0):
となる
そして、サムネイル画像だったときの処理で
元画像のリンクを作成するとき、その名前の表示には
basename() を使う
basename() はファイル名そのものの情報だけ引っ張ってくする
http://php.net/manual/ja/function.basename.php
を参照
<a href=”/images/<?php echo basename($image); ?>”>
<img src=”<?php echo $image; ?>”>
</a>
これでリンクを作成
元画像の表示については
<?php else : ?>
<img src=”<?php echo $image; ?>”>
<?php endif; ?>
となる

画像掲示板のデバッグ

画像掲示板のデバッグ
#14 デバッグをする
http://dotinstall.com/lessons/upload_image_php/4514
を参考に、サムネイル画像が保存できるようにデバッグ
まず、細かいエラーを表示するように、
config.php の
error_reporting(E_ALL & ~E_NOTICE);
をコメントアウト
index.php に戻ってしまうと、細かいエラーがでなくなるので
header()の処理の前に
exit;
を記述して、一度終了する
原因は、エラーコードをみながら修正していく
今回の動画の場合だと
imagecopyresampled() の
第1引数が、書き込むイメージのリソースでなかったこと
そして
書き込むディレクトリが
THUMBNAIL
ではなく
THUMBNAIL_DIR
だったことが原因だっと判明
エラーが特定できたら、
config.php のエラー表示を元に戻したいので
error_reporting(E_ALL & ~E_NOTICE);
のコメントアウトを外す
このように、一度詳細なエラーを表示して
どこかにとぶような処理の場合、その前に
一度 exit で終了して原因を追及するようにして
デバッグしていく
今回、うまく動作しなかったので、後で比較して理解するため
cp upload.php upload.php_error
として
保存し
http://dotinstall.com/lessons/upload_image_php/4513
のソースをコピペして
実行
そのときにいくつかエラーがでたので
そのメモ
Warning: imagecopyresampled() expects parameter 1 to be resource, double given in
これは
imagecopyresampled() の第1引数がリソースでないのが原因
$thumbHeight から
thumbImage にする
Notice: Use of undefined constant THUMBNAIL – assumed ‘THUMBNAI

Warning: imagepng(): Unable to open ‘THUMBNAIL/5190816f6d00cce6c8bb909ef954cc1840c50a0c.png’ for writing: No such file or directory
これは
‘THUMBNAI が見つからないとでているので
config.php で指定している
‘THUMBNAI_DIR にする
また、
Warning: imagepng(): の原因は
config.php の
define(‘THUMBNAIL_DIR’, dirname($_SERVER[‘SCRIPT_FILENAME’]).’/thumbnails’);
のスペルミスが原因だった
これらを修正すれば
サムネイル画像が保存されるようになる
CentOS へログインして
cd /var/www/html/upload_image_php
ll image/
で画像がアップロードされているのを確認し
ll thumbnails/
でサムネイル画像があるのを確認できれば
デバック完了

画像掲示板で縮小画像の保存

画像掲示板で縮小画像の保存
#13 縮小画像を保存する
http://dotinstall.com/lessons/upload_image_php/4513
を参考に、
縮小画像を保存フォルダに格納し、動作確認する
そのためには、まず画像形式を
switch() で識別する
switch($imagesize[‘mime’]){
で判別し
case ‘image/gif’:
case ‘image/jpeg’
case ‘image/png’
ごとに分岐する
このときに使っている
imagegif()
http://manual.xwd.jp/function.imagegif.html

imagejpeg()
http://php.net/manual/ja/function.imagejpeg.php
imagejpeg()
http://php.net/manual/ja/function.imagepng.php
は、それぞれのファイル拡張子にあわせたものを使い
イメージをファイルに出力している
それぞれ、
第1引数に保存する画像
第2引数に保存するファイル名
を指定する
ソースにすると
gif なら
imagegif(
//対象ファイル
$thumbImage,
//保存先
THUMBNAIL . ‘/’ . $imageFileName);
とする
最後に、index.php に戻すには
header() を使えばOK
header(‘Location :http://’ .$_SERVER[‘SERVER_NAME’].’/upload_image_php’);
とする