[PHP]画像を連結して数値を表示する

アクセスカウンター等でよく見る、数字の描かれた画像を連結して一枚の画像として表示する場合のソースです。

<?php
//カウント
$count = 12345;
//桁
$figure = 8;

//数字画像のサイズ
$width	 = 16;
$height	 = 24;

$count = sprintf("%0{$figure}d", $count);

$length = strlen($count);

$base = ImageCreateTrueColor($width * $length, $height);

for($i=0;$i<$length;$i++){
	$num = substr($count, $i, 1);
	$digit = ImageCreateFromJpeg("img/{$num}.jpg");
	ImageCopy($base, $digit, $i * $width, 0, 0, 0, $width, $height);
	imagedestroy($digit);
}

header("Content-Type: image/jpeg");
imagejpeg($base, NULL, 80);
imagedestroy($base);

counter

今回は「1.jpg」のように数字がファイル名になっている統一サイズの画像を使いました。
先頭をゼロで埋める必要がない場合は sprintf の部分を消して下さい。

画像とソース

[PHP]連続投稿を一定時間制限する(クッキーによる簡易ロック)

掲示板等で連続書き込みを簡易的に防止する場合はクッキーを使うのが簡単です。
引数は基本的に「setcookie(クッキー名, 値, 有効期限)」なので、例では有効期限を
現在時刻より300秒(5分)後にセットしてあります。
値はこの場合は何でもいいのでとりあえず「true」としておきました。

1. 書き込み前に投稿フォームのページでクッキーが利用できるかを確認するためのクッキーを発行しておく

<?php
session_start();

// ランダムな文字列を生成
$ticket = md5(uniqid(mt_rand(), true));

// 確認用チケットを発行
setcookie('cookie_ticket', $ticket);
$_SESSION['ticket'] = $ticket;

2. 投稿時にクッキーをチェックし、投稿に成功したら制限をかける

<?php
session_start();

$s_ticket = isset($_SESSION['ticket'])       ? $_SESSION['ticket']       : '';
$c_ticket = isset($_COOKIE['cookie_ticket']) ? $_COOKIE['cookie_ticket'] : '';

if( empty($s_ticket) || $s_ticket !== $c_ticket ){
  echo "クッキーを有効にして下さい";
} else if(isset($_COOKIE["cookie_post"])){
  // 制限された時の処理
  echo "連続投稿はしばらく時間をおいて下さい";
} else {
  // 投稿処理

  // 投稿が完了したら制限用のクッキーを発行する
  $expire = time() + 5 * 60;
  $value = "true";

  // このクッキーが存在する間は投稿を制限
  setcookie('cookie_post', $value, $expire);
}

// チケットを削除
$_SESSION['ticket'] = null;
unset($_SESSION['ticket']);
setcookie ("cookie_ticket", "", time() - 3600);

クッキーはブラウザから簡単に削除出来てしまうため、セキュリティ面ではほとんど意味を成しません。
厳格なロックを掛けるのであればアカウントにログインさせる方式を取る必要があります。
とはいえ、IP制限と併用するなどしてちょっとした手間をかけさせることでいたずらを防止する効果はあります。

[PHP]カレンダーを表示する

指定した月のカレンダーを表示してみます。

<?php
$year  = 2012;
$month = 8;

$datetime = new DateTime();
$datetime->setDate($year, $month, 1);
$lastday = (int)$datetime->format('t');
$w = (int)$datetime->format('w');
?>
<table>
<tr>
  <th>日</th>
  <th>月</th>
  <th>火</th>
  <th>水</th>
  <th>木</th>
  <th>金</th>
  <th>土</th>
</tr>
<tr>
<?php
//空白で埋める
for($i=0;$i < $w;$i++){
	echo "<td>-</td>\n";
}

$day = 1;
for($cell=$w;$cell < 35;$cell++){
	if($cell % 7 == 0){
		echo "</tr>\n<tr>\n";
	}

	if($day <= $lastday){
		echo "<td>{$day}</td>\n";
	} else {
		echo "<td>-</td>\n";
	}
	$day++;
}
?>
</tr>
</table>

結果(例):

Calender