php一覧

phpでメールアドレスを簡単にバリデーション

皆さんはネイティブphpで開発をするとき、メールアドレスのバリデーションはどうやっていますか?
正規表現?MXレコードの応答?
いやいや、もっとカンタンな方法がありました。これです。

<?php
/*
 * filter_varの第二引数でメールアドレスのチェックをする方法。
 * メールアドレスの記述が正しければstring型を返し、ダメならFALSEを返します。
 */
private function mail_check($mailaddress="")
{
    if (filter_var($mailaddress, FILTER_VALIDATE_EMAIL)===FALSE)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}
?>

しかし2009年以前のDoCoMoのEメールアドレスはRFCに準拠しておりません。
その場合どうしても正規表現じゃなければダメだ!というのなら、このサイトを参考にしなさい。


アクセス解析を追加してみた(THK Analytics)

GoogleAnalyticsがあれば大抵のアクセス統計は取れますが、生ログが欲しいといった場合やサーバログの統計が面倒・見づらいといった場合がありますよね。
WordPressのJetPackについているアクセス解析なんかもいいですが、JetPack自体がサイトを重たくするので使いたくありいません(´・ω・`)
そこで今日から、外部アクセス解析スクリプトである「THK Analytics」を実験的に導入してみました。↓

結構見やすくていいですよ。


Digest認証のパスワードファイルを作成するphpスクリプト

通常、レンタルサーバ等では管理画面よりBasic認証に必要なためのファイルを作ることが出来ますが
Basic認証よりセキュアなDigest認証を公式にサポートしていないサーバが多いと思います。
然しSSHがない環境でも、phpでDigest認証のパスワードを作ることが出来ます。

Digest認証については、Basic認証よりセキュアなDigest認証を使う方法を参照のこと。

下記PHPは取扱に注意すること。
# /path/to/htdigest.php

#!/usr/bin/php
<?php
/*
 * This script is create Digest Authentication files.
 */

// ".htdigest"'s path
$path = "/path/to/.htdigest";

// Common realms
$realm = array(
    0 => "This contents can join at Administrators only.",
    1 => "Members only.",
);
 
// Login users setting
$users = array(
    0=>array(
        "name"     => "admin",
        "realm"    => $realm[0],
        "password" => "adminpassword",
    ),
    1=>array(
        "name" => "member",
        "realm" => $realm[1],
        "password" => "memberpassword",
    ),
);
 // Create Crypted password
foreach ($users as $val)
{
    $put[] = sprintf('%s:%s:%s',$val["name"],$val["realm"],md5(sprintf('%s:%s:%s',$val["name"],$val["realm"],$val["password"])));
}

// Create .htdigest
$fp = @fopen($path,"w");
@($fp,implode("\n",$put)."\n");
@fclose($fp);
?>

.htaccessによる認証の分け方+Digest認証の設定方法

# Administrator's contents
<Location "/members/admin">
    AuthType Digest
    AuthName "This contents can join at Administrators only."
    AuthUserFile /path/to/.htdigest
    Require valid-user
</Location>

# Members's contents
<Location "/members/public">
    AuthType Digest
    AuthName "Members only."
    AuthUserFile /path/to/.htdigest
    Require valid-user
</Location>
独習PHP 第3版
  • 山田 祥寛
  • 価格   ¥ 3,456 prime
  • 販売者 Amazon.co.jp
クリックして今すぐチェック

phper2~3年目ぐらいには何かMVCフレームワークをマスターしておこう的なお話

下記phpソースコードは、架空のWebシステムのログインユーザ登録+編集スクリプトを簡易化したもの。
よくモデルや拡張の使い方を知らんで結局ネイティブコーディングしている人がいますが、設計段階で準備していればこんなカンタンに済むんだよ的なイヤミソースです。

<?php
class User extends Ex_Controller
{
	function __construct()
	{
		parent::__construct();
		
		$db        = $this->StdDatabase();
		$user_data = $this->session;
		$post_data = $this->input->post();
		$err       = (object) array();
	}
	
	// Method
	public function __remap($method="index")
	{
	
		// Run validation
		$err->input = $this->Validator->user($post_data);

		// Validation error
		if (empty($err->input)===FALSE)
		{
			$this->view->error("Validation error.", $err->input,false);
		}

		// User actions
		switch ($method)
		{
			// regist user
			case "register":
			{
				if ($user_data->level > 2)
				{
					$col = $db->user->getColumn();
					
					foreach ($col as $key=>$val)
					{
						$col->$key = $post_data->register->$key;
					}
					
					$set = $db->user->Regist($col,$err->regist);
					
					if (empty($err->regist)===FALSE)
					{
						$this->view->error("Database error.", $err->regist, false);
					}
					else
					{
						$this->view->user("regist", 1, true);
					}
				}
				else
				{
					$this->view->error("Permission error.", "You do not have a permission of regist user.", false);
				}
				
				break;
			}
			
			// edit + delete user
			case "edit":
			{
				if ($user_data->level > 3)
				{
					$col = $db->user->getColumn();
					
					foreach ($col as $key=>$val)
					{
						$col->$key = $post_data->edit->$key;
					}
					
					$set = $db->user->Edit($col,$err->edit);
					
					if (empty($err->edit)===FALSE)
					{
						$this->view->error("Database error.", $err->edit,false);
					}
					else
					{
						$this->view->user("edit",$col->act, true);
					}
				}
				else
				{
					$this->view->error("Permission error.", "You do not have a permission of edit user.", false);
				}
				
				break;
			}
			
			// Default (return index)
			default:
			{
				$this->view->user("index", 1, true);
			}
		}
	}
}


ネイティブphp開発で導入しておくと便利な関数

<?php
# MySQLで扱う値(配列である前提)を一気に特殊文字エスケープ
function my_esc($array=array())
{
	return array_map("mysqli::real_escape_string",$array);
}

# ビュー側で配列やオブジェクトの構造を確認するときに便利な関数
function print_l($array=array())
{
	print "<pre>\n";
	print_r($array);
	print "</pre>\n";
}

# メールヘッダ生成用に文字列をエンコードする関数
function ml_header_enc($str)
{
	return "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($str,"ISO-2022-JP-MS","auto"))."?=";
}
?>


ふざけて作ったクイズphp

某SEとフザケながら組んだクイズのphpソースコード。
ターミナル上で動くよ(´^ω^`)

#!/usr/bin/php
<?php
$put = NULL;
$dataset = array(
    0=>array(
        "question"=>"某世界最強生主の最初のあだ名は?",
        "select"=>array(1=>"ぷるや",2=>"ひつ国ブーメン王子",3=>"フケ栽培マン"),
        "answer"=>1,
    ),
    1=>array(
        "question"=>"このクソソースを組んだのは誰?",
        "select"=>array(1=>"がんだまにあ",2=>"十円玉",3=>"白菜"),
        "answer"=>2,
    ),
    2=>array(
        "question"=>"一番見た目でうるさそうなものを選べ",
        "select"=>array(1=>"淫乱テディベア",2=>"つるぺたツンデレニューハーフ",3=>"はっwかっwたっwのっwしおっっっwwwww"),
        "answer"=>3,
    ),
);

echo "ああ・・・、遂に実行しちゃったのね。\n\n";

for ($i=0;$i<count($dataset);$i++)
{
    echo $dataset[$i]["question"]."\n次の3つから選んでね(´^ω^`)\n\n";
    foreach ($dataset[$i]["select"] as $select_key=>$select_val)
    {
        echo $select_key.":".$select_val."\n";
    }
    echo "\n\n";

    $put = trim(fgets(STDIN));

    if (ctype_digit($put)===FALSE || $put < 1 || $put > 3)
    {
        echo "\nふざけるな、真面目にやれ。\n\n";
        $i-=1;
        continue 1;
    }
    else if ($put==$dataset[$i]["answer"])
    {
        echo "\nおめでた(*´゚д゚`*) \n\n";
    }
    else
    {
        echo "\n残念でした\(^ヮ^)/\n\n";
    }
}
?> 
独習PHP 第3版
  • 山田 祥寛
  • 価格   ¥ 3,456 prime
  • 販売者 Amazon.co.jp
クリックして今すぐチェック

十円玉仕事しろ

<?php
$max = 16;
$str = "";
$words = array(
	"んあぁぁぁぁん!!",
	"やんやねんもぉぉぉぉぉ!!",
	"ハイスペック、救急車・・・!?",
	"Skype消させろおおおおお!!",
	"でもねっでもねっ^^",
	"くろくろたんねっ^^",
	"あまあま食べたいのっ^^",
	"俺は世界最強生主ッ!!俺は世界最強生主ッ!!",
	"バトルモード!!!!!!!!!!!",
	"ふじゃけんなぁぁぁぁぁ!!!!!",
	"飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!",
);

for ($i=0;$i<$max;$i++)
{
	$rd = mt_rand(0,count($words)-1);
	$str.= $words[$rd];
}
echo $str."\n";
unset($max,$str,$words,$rd);

で、動かした結果が

[develop@localhost ~]$ php -q hitsukoku.php
飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!でもねっでもねっ^^やんやねんもぉぉぉぉぉ!!でもねっでもねっ^^Skype消させろおおおおお!!バトルモード!!!!!!!!!!!くろくろたんねっ^^ふじ ゃけんなぁぁぁぁぁ!!!!!Skype消させろおおおおお!!Skype消させろおおおおお!!くろくろたんねっ^^飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!くろくろたんねっ^^やんやねんもぉぉぉぉぉ!!やんやねんもぉぉぉぉぉ!!

[develop@localhost ~]$ php -q hitsukoku.php
Skype消させろおおおおお!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!くろくろたんねっ^^バトルモード!!!!!!!! !!!ふじゃけんなぁぁぁぁぁ!!!!!でもねっでもねっ^^俺は世界最強生主ッ!!俺は世界最強生主ッ!!やんやねんもぉぉぉぉぉ!!ふじゃけんなぁぁぁぁぁ!!!!!ふじゃけんなぁぁぁぁぁ!!!!!んあぁぁぁぁん!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!でもねっでもねっ^^俺は世界最強生主ッ!!俺は世界最強生主ッ!!やんやねんもぉぉぉぉぉ!!あまあま食べたいのっ^^

[develop@localhost ~]$ php -q hitsukoku.php
あまあま食べたいのっ^^バトルモード!!!!!!!!!!!Skype消させろおおおおお!!でもねっでもねっ^^ハイスペック、 救急車・・・!?んあぁぁぁぁん!!ふじゃけんなぁぁぁぁぁ!!!!!バトルモード!!!!!!!!!!!くろくろたんねっ^^Skype消させろおおおおお!!でもねっでもねっ^^バトルモード!!!!!!!!!!!んあぁぁぁぁん!!あまあま食べたいのっ ^^俺は世界最強生主ッ!!俺は世界最強生主ッ!!ハイスペック、救急車・・・!?

[develop@localhost ~]$ php -q hitsukoku.php
Skype消させろおおおおお!!Skype消させろおおおおお!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!Skype消させろおおおお お!!くろくろたんねっ^^くろくろたんねっ^^やんやねんもぉぉぉぉぉ!!でもねっでもねっ^^あまあま食べたいのっ^^バトルモード!!!!!!!!!!!やんやねんもぉぉぉぉぉ!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!んあぁぁぁぁん!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!ハイスペック、救急車・・・!?バトルモード!!!!!!!!!!!

[develop@localhost ~]$ php -q hitsukoku.php
んあぁぁぁぁん!!Skype消させろおおおおお!!くろくろたんねっ^^やんやねんもぉぉぉぉぉ!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓 飢餓ッ!!!!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!ハイスペック、救急車・・・!?あまあま食べたいのっ^^でもねっでもねっ^^んあぁぁぁぁん!!バトルモード!!!!!!!!!!!んあぁぁぁぁん!!んあぁぁぁぁん!!ふじゃけんなぁぁぁぁぁ!!!!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!ハイスペック、救急車・・・!?

[develop@localhost ~]$ php -q hitsukoku.php
でもねっでもねっ^^俺は世界最強生主ッ!!俺は世界最強生主ッ!!ハイスペック、救急車・・・!?ふじゃけんなぁぁぁぁぁ!!!!!ふじゃけんなぁぁぁぁぁ!!!!!Skype消させろおおおおお!!あまあま食べたいのっ^^んあぁぁぁぁん!!あまあま食べ たいのっ^^ハイスペック、救急車・・・!?飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!Skype消させろおおおおお!!あまあ ま食べたいのっ^^Skype消させろおおおおお!!ハイスペック、救急車・・・!?ふじゃけんなぁぁぁぁぁ!!!!!

[develop@localhost ~]$ php -q hitsukoku.php
ふじゃけんなぁぁぁぁぁ!!!!!Skype消させろおおおおお!!ハイスペック、救急車・・・!?でもねっでもねっ^^あまあま食 べたいのっ^^ハイスペック、救急車・・・!?くろくろたんねっ^^俺は世界最強生主ッ!!俺は世界最強生主ッ!!あまあま食べたいのっ^^あまあま食べたいのっ^^ふじゃけんなぁぁぁぁぁ!!!!!んあぁぁぁぁん!!ふじゃけんなぁぁぁぁぁ!!!!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!やんやねんもぉぉぉぉぉ!!

[develop@localhost ~]$ php -q hitsukoku.php
俺は世界最強生主ッ!!俺は世界最強生主ッ!!あまあま食べたいのっ^^飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!ハイスペック、救急車・・・!?バトルモード!!!!!!!!!!!バトルモード!!!!!!!!!!!ハイスペック、救急車・・・!?Skype消させろおおおおお!!くろくろたんねっ^^飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!バトルモード!!!!!!!! !!!ハイスペック、救急車・・・!?Skype消させろおおおおお!!あまあま食べたいのっ^^でもねっでもねっ^^俺は世界最強 生主ッ!!俺は世界最強生主ッ!!

[develop@localhost ~]$ php -q hitsukoku.php
やんやねんもぉぉぉぉぉ!!んあぁぁぁぁん!!くろくろたんねっ^^バトルモード!!!!!!!!!!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!ハイスペック、救急車・・・!?でもねっでもねっ^^飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!俺は世界最強生主ッ!!Skype消させろおおおおお!!ハイスペ ック、救急車・・・!?飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!飢餓飢餓飢餓飢餓飢餓飢餓飢餓飢餓ッ!!!!!くろくろたんねっ^^あまあま食べたいのっ^^

【公式】フジッコ クロクロ30食入り
  • フジッコ
  • 価格   ¥ 5,700
  • 販売者 フジッコ通販 ウェルネス倶楽部
クリックして今すぐチェック

おい仕事しろ

PCREの文字列グループ化に於けるメモリキャッシュの無効化ぐらい頭に入れておけ、正規表現厨ども!!

<?php
$str = "救急車\nパトカー\n消防車\n救急車\n霊柩車\nロードローラー\nショベルカー\n";
$pattern = "/(:?パトカー|消防車|救急車|ショベルカー)/";
$replace ="ハイパー救急車";

echo $str;
echo "---------------\n";
echo preg_replace($pattern,$replace,$str);

Translate »