画像掲示板のデバッグ
#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/
でサムネイル画像があるのを確認できれば
デバック完了
カテゴリー: PHP
画像掲示板で縮小画像の保存
画像掲示板で縮小画像の保存
#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’);
とする
縮小画像の作成
縮小画像の作成
#12 縮小画像を作る (2)
http://dotinstall.com/lessons/upload_image_php/4512
を元に
元画像の縦横比率を保ったまま、縮小画像を生成
まず、サムネイル画像の高さを作る
縦横比をそのまま使う
$thumbheight = round($height * THUMNAIL /$width);
round() は浮動小数点をまとめる関数
http://php.net/manual/ja/function.round.php
を参考
小数点以下四捨五入と考えるとわかりやすい
これで、サイズ取得はできたので、次に画像作成
$thumbImage = imagecreatetuecolor(THUMBNAIL_WIDTH, $thumbnailheight);
imagecreatetruecolor() は
イメージを新規作成する関数
http://manual.xwd.jp/function.imagecreatetruecolor.html
に解説あり
imagecreatetruecolor() の引数には
横幅、高さを指定する
これらを使った事例としては
No29.大きさを変えようっ(サムネイル) —- GDライブラリ[3]
http://masago.kir.jp/php20040218.php
をみると分かりやすい
imagecopyresampled()は
再サンプリングを行いイメージの一部をコピー、伸縮する
これは
http://phpspot.net/php/man/php/function.imagecopyresampled.html
を参考にする
今回は
imagecopyresampled(
$thumbnailheight,
$srcImage,
0,0,
0,0,
72,0,
$thumbnailheight,
$width,
$height
);
これを引数の解説つきにすると
imagecopyresampled(
//コピー先の画像
$thumbnailheight,
//コピー元の画像
$srcImage,
//コピー先のx、y座標
0,0,
//コピー元のx、y座標
0,0,
//コピー先の幅、
72,
//コピー先の高さ
$thumbnailheight,
//コピー元の幅
$width,
//コピー元の高さ
$height
);
となる
画像掲示板で縮小画像作成
画像掲示板で縮小画像作成
#11 縮小画像を作る (1)
http://dotinstall.com/lessons/upload_image_php/4511
を参考にサムネイル画像の作成を実装
まず、元画像の幅と高さを取得
$width = $imagesize[0];
$height = $imagesize[1];
縮小画像の作成は
ユーザ定数 THUMBNAIL_WIDTH と比較することで
判定して作成する
if($width > THUMBNAIL_WIDTH){
で比較できる
サムネイル画像をつくる手順は
元ファイルを画像タイプにより作成
新しいサイズを作成
縮小画像の作成
縮小画像を保存
という手順で行われる
元ファイルの画像タイプの判別は
switch の画像判定を使えばOK
switch($imagesize[‘mime’]){
case ‘image/gif’:
$srcImage = imagecreatefromgif($imageFilePath);
break;
case ‘image/jpeg’:
$srcImage = imagecreatefromjpeg($imageFilePath);
break;
case ‘image/png’:
$srcImage = imagecreatefrompng($imageFilePath);
break;
}
とする
switch() の判定のところで使っている関数の
imagecreatefromgif()
http://phpspot.net/php/man/php/function.imagecreatefromgif.html
imagecreatefromjpeg()
http://phpspot.net/php/man/php/function.imagecreatefromjpeg.html
imagecreatefrompng()
http://manual.xwd.jp/function.imagecreatefrompng.html
は、画像タイプの自動判別に使える関数
画像掲示板のファイル保存
画像掲示板のファイル保存
#10 元画像を保存する
http://dotinstall.com/lessons/upload_image_php/4510
を参考に、画像掲示板に投稿するファイルの名前を決定し
一時保存された元ファイルを保存フォルダに格納する処理を実装
ファイル名は重複しないファイル名をつけていくので
乱数や暗号化を使うようにする
現在時刻を元にすれば、ほぼ重複しないので
$imagefilename = sha1(time().mt_rand()).$ext;
とする
$ext は switch で得た拡張子
time().mt_rand()は、現在時刻+乱数で
これを sha1() でハッシュしている
実行結果の動作確認のため
var_dump() を使う
var_dump($imagefilename);
で確認できたら、これはコメントアウト
これで、ファイル名はできたから
次に元画像の保存
これは添付ファイルをそこにコピーすればOK
$fileimagePath = IMAGES_DIR .’/’.$imagefilename;
とすればOK
IMAGES_DIR は cofig.php で決めたユーザ定数
PHPでは . で javascript の+みたいに文字列の連結ができる
これで、ファイルの保存パスもOK
次はファイルアップロード
アップロードには
move_upload_file() を使う
$rs = move_uploaded_file($_FILES[‘image’][‘tmp_name’],$fileimagePath);
アップロードが失敗することがあるので
そのときの処理を if で記述
if(!rs){
echo “could not upload !”;
exit;
}
とする
ここまでできたら、動作確認
chmod 777 images/
でパーミッション変更
一度ファイルをアップロードして
images ディレクトリにファイルができれば成功
ファイル拡張子の取得
ファイル拡張子の取得
#09 ファイルの拡張子を取得する
http://dotinstall.com/lessons/upload_image_php/4509
を元に、投稿されたファイルの情報を取得して
拡張子を設定する
今回は、保存するファイル名を決めておく
これは、アップロードされたファイルの名前をそのまま使うと被ることもあるので、面倒になるから
最初に、拡張子を決め、名前をつけていく
拡張子をつけるのは、ほぼ決まり文句で
$imagesize = agetimagesize($_FILES[‘image’][‘tmp_name’]);
これで、様々な情報が取得され
変数 $imagesize に格納される
中身を確認するには
var_dump() で
var_dump($imagesize);
で見ることができる
これにより、アップロードしたファイルの
縦横の幅
ファイルの種類などが解析される
これを使って、拡張子を決めていく
いろいろなファイルの拡張子があるので、
ここでは switch による分岐を行う
取得して比較する値は
[“mime”]=>
string(9) “image/png”
というように
mime というところ
今回、対応拡張子は
gif
jpg
png
のみにする
コードは
switch($imagesize[‘mime’]){
case ‘image/gif’:
$ext=’.gif’;
break;
case ‘image/jpg’:
$ext =’.jpg’;
break;
case ‘image/png’:
$ext =’.png’;
break;
default:
echo gif/jpg/png only !”;
exit;
}
PHP で投票システム
PHP で投票システム
写真を選んで投票し
結果がグラフで見られるというものを作る
同じIP、同じブラウザでは1日1回までという制限をつける
これを作るには
html
css
jquery
php
mysql
google chart tools
これらを使う
使用する環境は、vmware player で作成した
ローカル開発環境の CentOS 6.4 64bit
PHPで作る投票システム (全13回)
http://dotinstall.com/lessons/poll_php_v2
を参考に作成していく
まずは必要となるDBの作成
#02 データベースの設定をしよう
http://dotinstall.com/lessons/poll_php_v2/9702
を参考にSQLファイルを作成する
まず、
mkdir /var/www/html/pol_php
でディレクトリを作成
ここにソースファイルをおく事にする
以下、SQLファイルの解説
create database dotinstall_poll_php;
でDB作成
grant all on dotinstall_poll_php.* to dbuser@localhost identified by ‘nk31gsfms’;
で
ユーザ名 dbuser
パスワード nk31gsfms
というユーザを作成して権限を与える
use dotinstall_poll_php
で使用するDBを指定
次にテーブルの作成
create table answers(
id int not null auto_*increment primary key,
answer varchar(255),
remote_addr varchar(255),
user_agent varchar(255),
answer_date date,
created datetime,
modified datetime,
unique unique_answer(remote_addr,user_agent,answer_date)
);
この意味は
id int not null auto_*increment primary key,
で自動連番の主キー作成
answer varchar(255),
は、あとでいろいろ拡張する
remote_addr varchar(255),
で、回答した人のIPアドレスが入る
user_agent varchar(255),
は、ブラウザの情報を格納する
answer_date date,
で回答した日
unique unique_answer(remote_addr,user_agent,answer_date)
は、重複して投票することがないように
uniqe_answer というキーを作っている
これに
remote_addr,user_agent,answer_date
というように複合キーにしておく
これらを元に
vim poll.sql
を作成して
create database dotinstall_poll_php;
grant all on dotinstall_poll_php.* to dbuser@localhost identified by ‘nk31gsfms’;
use dotinstall_poll_php
create table answers (
id int not null auto_increment primary key,
answer varchar(255),
remote_addr varchar(15),
user_agent varchar(255),
answer_date date,
created datetime,
modified datetime,
unique unique_answer(remote_addr, user_agent, answer_date)
);
として保存
ysql -u root -p < poll.sql
でファイルを読み込んでDB作成
作成できているか確認するには
mysql -u root -p でログインして
show databases;
でDB一覧を確認
use dotinstall_poll_php;
でDBを選択して
desc answers;
で中身を確認することができる
このように sql ファイルを作成し、
そこから読み込むようにすれば
sql コマンドを打つ手間も省けるので
使いまわしとかもできる
掲示板に投稿時間の表示
掲示板に投稿時間の表示
#10 日付も表示させる
http://dotinstall.com/lessons/bbs_php/1010
を参考に
投稿時間の表示を実装
投稿された日時をdate で取得
表示するときには htmlspecialchars() で無害化する
http://jp.php.net/manual/ja/function.date.php
に様々なdate() のフォーマットがある
今回は
date(“Y-m-d H:i:s”)
時刻自体はユーザからの入力は必要ないので
投稿があったときに付け加える
$newData .=date(“|Y-m-d H:i:s”);
とすれば
.= とすることで、
$newData に現在時刻をくっつけることができる
追加するのは
array_push() の上あたり
H:i:sは、時、分、秒 という意味
時間を入れる変数を用意するので
list($message,$user)
を
list($message,$user,$posted)
というように変数を用意して
表示部分にも
<?php echo htmlspecialchars($message); ?>(<?php echo htmlspecialchars($use
r);?>)
から
<?php echo htmlspecialchars($message); ?>(<?php echo htmlspecialchars($user);?>) – <?php echo htmlspecialchars($posted); ?>
というように
htmlspecialchars() で表示するものを追加する
PHP 掲示板で投稿件数の表示
PHP 掲示板で投稿件数の表示
#07 投稿件数を表示する
http://dotinstall.com/lessons/bbs_php/1007
を参考に
投稿件数の表示
これは $posts の配列の数を echo で表示する
配列の数を数えるのは
count()
を使えば、簡単にできるので
今回は、配列は$posts に入っているので
count($posts)
で調べることができる
<h2>投稿一覧</h2>
を
<h2>投稿一覧 (<?php echo count($posts); ?>)件</h2>
とすれば、今の投稿件数が表示されるようになる
次に、
#08 ユーザー名も投稿させる
http://dotinstall.com/lessons/bbs_php/1008
を参考に
投稿した人の名前も表示できるようにする
まずは、form の部分を書き換える
<input type=”text” name=”message”>
を
message: <input type=”text” name=”message”>
name <input type =”text” name=”user”>
とする
これにより、POSTで受けとるのが
message
user
となったのでPHP部分の修正が必要になる
投稿時の判定はそのままでいいので
名前の有無で、処理をわけるようにする
if(!empty($_POST[‘user’])){
$newData =$_POST[‘message’].”|ななしさん”;
}else{
$newData = $_POST[‘message’].”|”.$_POST[‘user’];
}
こうすることで、投稿した内容である message の後ろに
投稿者の名前が表示されるようになる
もし、名前なしなら
ななしさん
というようになる
PHP では . で文字列を連結できる
java script とかだと + で連結する
$newData は、連結した文字列の格納するための変数
また、追加する内容も増えているので
array_unshift($posts, $_POST[‘message’]);
の部分を
array_unshift($posts, $newData);
というようにする
$newData という変数にしたことで、ここで書くのが
楽になっている
表示するときに
$post の中には
message
user と2つになっているので処理が必要になる
このときに使うのが
list()
explode()
list() については
http://www.scollabo.com/banban/php/ref/ref_list.html
にあるように
引数に設定した変数を配列として渡す
explode()は
http://php.quus.net/strings/explode.php
にあるように
文字列を分割して配列にして返す
explode()の構文は
explode (“区切り文字”, “分割する文字列”, “要素数(リミット)”);
<?php list($message, $user) = explode(“|”, $post); ?>
とするので
explode(“|”, $post);
は
$post の中の文字で | となっているところで分割する
と言う意味
表示する内容が
$message
$user
となったので
<li><?php echo htmlspecialchars($post); ?></li>
を
<li><?php echo htmlspecialchars($message); ?> (<?php echo htmlspecialchars($user); ?>)</li>
とする
PHP 掲示板に投稿データ書き込み
PHP 掲示板に投稿データ書き込み
#06 データを書き込む
http://dotinstall.com/lessons/bbs_php/1006
を参考に
投稿されたデータをファイルに書き込み、動作確認
ファイルポインタになる変数を作成し
fopen() でファイルを開き
モードは w 書き込みモードで行う
開くファイルは $datafile
ということで
$fp = fopen($datafile. “w”);
とする
そして、 fwrite() でデータ書き込み
fwrite($fp, implode(“\n”, $posts));
で書き込みになる
implode() は文字列の連結
\n つまり改行コードを投稿内容の先頭に連結して
前の投稿から改行するようにしている
implode-文字列関数
http://php.quus.net/strings/implode.php
をみるとわかりやすい