コンテンツにスキップするには Enter キーを押してください

タグ: php

phpでアバウトなファイル検索ができるglob関数

なかなかハードなコーディングをしない限り、お世話にはならんだろう「glob」関数。
コイツはフルパス中のファイル・ディレクトリをアバウトに検索する折に役立ってくれますよ!

// 例えば、下記ディレクトリに
$dir = dirname(__DIR__) . "/public/thumbnail/member/";

// 1.すべてのJPGを探したいYO
$find[0] = "*.jpg";

// 2.サブパス+拡張子度外視で指定名のファイルを探したいYO
$find[1] = "F999999*";

// 3.指定の拡張子を探したい
$find[2] = "*.{jpg,gif,png}";

// 4.正規表現使いたい(F***.jpgとかF******.mp4とか)
$find[3] = "(F\d+)\.(jpe?g|mp4|m3u8)";

// 検索結果
// 1.は一次元配列下に結果が格納される
$files = glob($dir . $find[0]);
print_r($files);

/*
[0] => /var/www/project/app/storage/public/thumbnail/member/akira.jpg
[1] => /var/www/project/app/storage/public/thumbnail/member/F001.jpg
[2] => /var/www/project/app/storage/public/thumbnail/member/noimg.jpg
*/

// 2.同様
$files = glob($dir . $find[1]);
print_r($files);

/*
[0] => /var/www/project/app/storage/public/thumbnail/member/F999999.mp4
[1] => /var/www/project/app/storage/public/thumbnail/member/F999999/thumbs/005.webp
[2] => /var/www/project/app/storage/public/thumbnail/member/F999999/thumbs/trush/000.gif
*/

// 3.拡張子の複数指定には引数を使う
$files = glob($dir . $find[2], GLOB_BRACE);
print_r($files);

/*
[0] => /var/www/project/app/storage/public/thumbnail/member/F999999.jpg
[1] => /var/www/project/app/storage/public/thumbnail/member/F999999.gif
*/

// 4.パターンにより、結果は多次元配列化
$files = glob($dir . $find[2]);
print_r($files);

/*
[0][0] => /var/www/project/app/storage/public/thumbnail/member/F99.jpg
[0][1] => /var/www/project/app/storage/public/thumbnail/member/F99.m3u8
[1][0] => /var/www/project/app/storage/public/thumbnail/member/F9999999.mp4
*/
コメントする

がんばれみんなのWSL

この度、どこからでもTV3波全chをネット端末で視聴できるようにしてみた。あばよ、病院のテレビカード!!(ぁ
実はこれ、ホストがWindows10なのでWSLのNginxによるリバースプロキシで外部公開しているだけ。
ほんでついでにWSL上でのphpパフォーマンスを見ようとWordPressを入れてみたら・・・、クソ重たいの。どうやっても。
本物のLinuxに追いつくにはまだまだかな、WSL。

コメントする

Proxyと指定国以外からのアクセスを規制する

#!/usr/bin/php
<?php
/*
 * Author: 十円玉(2018/06/02)
 * Proxyと日本のIP以外弾く.htaccess作るスクリプト。CRONで動かすこと。
 *
 * $htaccess_file:設定を書き込む.htaccessのパス
 * $iplist_url:国コード別IP帯リストのURL
 * $allow_countries:アクセスを許可する国コード
 * $ignore_proxy_elements:アクセスを拒否するProxy環境変数
 * $tmp_ip_list:許可した国の全IP帯
 * $allow_lists:アクセス許可国のIP帯
 * $allow_ips:上記IP帯を、.htaccessのアクセスルールに直した文字列群
 * $proxy_blocks:Proxyの環境変数をアクセスから除外するためのルール文
 * $fp:ファイルポインタ
 * $write:.htaccessに書き込む内容
*/

/*
 * 初期設定
*/

// .htaccessのパス
$htaccess_file = "/path/to/.htaccess";

// 国コード別IP帯リストのURL
$iplist_url = "http://nami.jp/ipv4bycc/cidr.txt";

// アクセスを許可する国コード
$allow_countries = "JP"; // JP|US|DE ←パイプで分ける

// アクセスを拒否するProxy環境変数
$ignore_proxy_elements = array(
	"FORWARDED",
	"FORWARDED-FOR",
	"X-FORWARDED",
	"X_FORWARDED_FOR",
	"HTTP_X_FORWARDED_FOR",
	"VIA",
	"USERAGENT_VIA",
	"XPROXY_CONNECTION",
	"PROXY_CONNECTION",
	"HTTP_PC_REMOTE_ADDR",
	"HTTP_CLIENT_IP",
);

/*
 * 初期設定はここまで
*/

// 全世界のIP帯を取得
$tmp_ip_list = @file_get_contents($iplist_url);

// 上記国コードのIP帯を抜き出す
preg_match_all("/(?:".$allow_countries.")\t(?:[^\t\n]+)/",$tmp_ip_list,$allow_lists);

// 上記IP帯を.htaccessでのアクセス許可文として整形する
$allow_ips = "";
foreach($allow_lists[2] as $val)
{
	$allow_ips.= "Allow from ".$val."\n";
}

// 上記のProxy環境変数を持っていたらアクセス除外するルール文を作成
$proxy_blocks="# block proxy servers\n";
$i=0;
while($i<count($ignore_proxy_elements))
{
	if ($i == (count($ignore_proxy_elements)-1))
	{
		$proxy_blocks.= "RewriteCond %{".$ignore_proxy_elements[$i]."} !^$\n";
	}
	else
	{
		$proxy_blocks.= "RewriteCond %{".$ignore_proxy_elements[$i]."} !^$ [OR]\n";
	}
	$i+=1;
}

$proxy_blocks.= "RewriteRule ^(.*)$ - [F]\n";

// .htaccessを作成して終了
$fp = @fopen($htaccess_file,"w");
$write = "<IfModule mod_rewrite.c>\n";
$write.= "RewriteEngine On\n";
$write.= "RewriteBase /\n";
$write.= $proxy_blocks;
$write.= "Order deny,Allow\n";
$write.= "Deny from all\n";
$write.= $allow_ips;
$write.= "</IfModule>\n";

$fp = @fwrite($fp,$write);
@fclose($fp);

コメントする

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に準拠しておりません。
その場合どうしても正規表現じゃなければダメだ!というのなら、このサイトを参考にしなさい。

http://emailregex.com/

[amazon_link asins='479813547X,4798052582' template='SupportedAMP' store='10yendama-22' marketplace='JP' link_id='e9df86ae-2705-11e8-8d38-7b4db5ed6472']

コメントする

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

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

https://thk.kanzae.net/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>
1件のコメント

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";
    }
}
2 Comments

十円玉仕事しろ

<?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);

で、動かした結果が

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

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

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

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

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

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

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

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

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

[amazon_link asins=’B002738Z4G’ template=’SupportedAMP’ store=’10yendama-22′ marketplace=’JP’ link_id=’2710f4d2-2711-11e8-9d43-c5da953cf18f’]

9 Comments

おい仕事しろ

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

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

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

php5.6.18にアップデート

ここ数日、base+updateレポジトリが引っかかっていてphp(remi-php56レポジトリ)の更新に気づかなかった(‘A`)

Version 5.6.18

  • Core:
    • Added support for new HTTP 451 code.
    • Fixed bug #71039 (exec functions ignore length but look for NULL termination).
    • Fixed bug #71089 (No check to duplicate zend_extension).
    • Fixed bug #71201 (round() segfault on 64-bit builds).
    • Fixed bug #71273 (A wrong ext directory setup in php.ini leads to crash).
    • Fixed bug #71323 (Output of stream_get_meta_data can be falsified by its input).
    • Fixed bug #71459 (Integer overflow in iptcembed()).
  • Apache2handler:
    • Fix >2G Content-Length headers in apache2handler.
  • FTP:
    • Implemented FR #55651 (Option to ignore the returned FTP PASV address).
  • GD:
    • Improved fix for bug #70976.
  • Opcache:
    • Fixed bug #71127 (Define in auto_prepend_file is overwrite).
    • Fixed bug #71024 (Unable to use PHP 7.0 x64 side-by-side with PHP 5.6 x32 on the same server).
  • PCRE:
    • Upgraded bundled PCRE library to 8.38. (CVE-2015-8383, CVE-2015-8386, CVE-2015-8387, CVE-2015-8389, CVE-2015-8390, CVE-2015-8391, CVE-2015-8393, CVE-2015-8394)
  • Phar:
    • Fixed bug #71354 (Heap corruption in tar/zip/phar parser).
    • Fixed bug #71391 (NULL Pointer Dereference in phar_tar_setupmetadata()).
    • Fixed bug #71488 (Stack overflow when decompressing tar archives).
  • Session:
    • Fixed bug #69111 (Crash in SessionHandler::read()).
  • SOAP:
    • Fixed bug #70979 (crash with bad soap request).
  • SPL:
    • Fixed bug #71204 (segfault if clean spl_autoload_funcs while autoloading).
  • WDDX:
    • Fixed bug #71335 (Type Confusion in WDDX Packet Deserialization).
コメントする

phpのクソソースをクソソースで書き直した例

phpの条件文は関数のコールバックを使えますよ・・・、CASE文も例外では御座いません(´・ω・`)
だけど、それを知らずにIF文まみれのクソソースをよこされた暁には・・・ね。
以下ソースコードは、公開しても大丈夫なレベルに色々端折りました(´・ω・`)

<?php
class Campaign extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
	}

	public function _remap($mode="index",$param=array())
	{
		switch ($mode)
		{
			// キャンペーンNoがリクエストされた場合
			case is_int($mode):
				// キャンペーンNoのテンプレートがない→404
				// このエラーコード出力は通常モデル化しています
				if (!file_exists("view/Campaign/no/template_".$mode.".html"))
				{
					$data = array(
						"HTTP_Code" => 404,
						"ErrDoc"    => "ご指定のページはありません。"
					);
					$this->load->view("view/Common/error.html",$data);
				}

				// 通常処理
				else
				{
					// No.18 : ツイッターのアクセス数降順にユーザリストを並べ替える
					// 上でSWITCH文かけているから、もっと上手な分岐があるはず(´・ω・`)
					if ($mode == "18")
					{
						$handle = @fopen("controller/Campaign/18/twi_counts","r");
						while ($dump = fgetcsv( $handle )) $twi_data_tmp[] = $dump;
						@fclose($handle);
						
						foreach ($twi_data_tmp as $key=>$val)
						{
							$sort_point[$key] = $val[5];
						}
						
						$data["twi_data"] = array_multisort($sort_point ,SORT_DESC,$twi_data_tmp);
						
						unset($twi_data_tmp,$sort_point);
						
						// その他処理
					}
					// 共通処理として、$modeに沿ったビューを展開
					$this->load->view("view/Campaign/no/template_".$mode.".html",$data);
					
					// 以下キャンペーンNo毎に独自処理を書いていく
				}

				// 以下No以外のキャンペーンに独自処理を書いていく
				break;
			}
			
			// index
			default:
				if ($handle = opendir("view/Campaign/no/"))
				{
					while (false !== ($file = readdir($handle)))
					{
						if ($file !== "." && $file !== "..")
						{
							// テンプレートからNo部分のみ切り抜いて配列化
							$templates[] = str_replace(array("template_",".html"),array(),$file);
						}
					}
				}
				$data["no_list"] = $templates;
				$this->load->view("view/Campaign/index.html",$data);
				break;
		}
	}
}
5 Comments

ネイティブphpで頑張る人たち

2ch某スレを眺めていた感想。
PDO覚えたほうがラクなのに、どうしてmysqliモジュールなんて茨の道を進もうとするの・・・?
そして、あなたの会社にはフレームワークの入れ込みが出来るSEはいるの・・・?

私も色々なフレームワークを触りましたが、なんだかんだでCodeIgniter(を拡張したもの)とLaravelはイイものですよ・・・。
CakePHPは要件定義の次第ですが、日本国内で最も人気のあるフレームワークだしリソースも多いから開発がラクですよね。
そうそう、私が最初に触ったフレームワークはEthnaでした。
[amazon_link asins=’4774172294′ template=’SupportedAMP’ store=’10yendama-22′ marketplace=’JP’ link_id=’1af9a472-2713-11e8-94ae-6b453baefc78′]

コメントする

配列中から空の配列キーを削除するphp関数

[code language=”php”]
<?php
// 一部空データのある配列
$sample = array(
0=>"orange",
1=>"",
2=>"apple",
3=>"",
4=>"grape",
5=>"",
6=>"melon",
7=>"peach",
);

echo "Before:\n";
print_r($sample);

/* 空の配列キーを削除
* ※この場合、array_filter()自体がFALSEを返した要素を除外する為
* 第二引数であるコールバック関数を省略出来る。
* コールバックの使い方は下記のIF文を参照。
*/
$sample = array_filter($sample,"strlen");
$sample = array_values($sample);

echo "\nAfter:\n";
print_r($sample);

// おまけ:キー値の末端が"e"である以外の配列を削除
$sample = array_filter($sample, function($this)
{
if (substr($this,-1)=="e") {
return TRUE;
}

else
{
return FALSE;
}
});

echo "\n値の末端が\"e\"である配列だけ残す:\n";
$sample = array_values($sample);
print_r($sample);

unset($sample);
?>
[/code]

[amazon_link asins=’479813547X’ template=’SupportedAMP’ store=’10yendama-22′ marketplace=’JP’ link_id=’e7b1bdab-2712-11e8-8a5a-49197fa104c9′]

コメントする

phpの共通ライブラリに埋め込むタイプのアクセス拒否スクリプト

某方のお勉強用にサッと書いた、解説はあえてつけていない。

[code language=”php”]
<?php
class IgnoreAccess
{
public $hosts_list = array();
public $ua_list = array();
public $ref_list = array();
private function set_403()
{
header("HTTP",true,403);
exit(1);
}
private function check_array($array=array())
{
if (is_array($array)!==FALSE && count($array)>0)
{
return TRUE;
}
else
{
return FALSE;
}
}
private function is_host($addr="")
{
if ($addr == gethostbyaddr($addr))
{
return FALSE;
}
else
{
return TRUE;
}
}
public function ignore($param=array(),$not_ipv4=FALSE)
{
$local_addr = array("127.0.","192.168.","::1");
foreach($local_addr as $val)
{
if (substr_count($param["addr"],$val)>0)
{
return FALSE;
}
}
if ($not_ipv4!==FALSE && $this->is_host($param["addr"])===FALSE)
{
$this->set_403();
}
if ($this->check_array($this->ua_list)!==FALSE)
{
foreach ($this->ua_list as $val)
{
if (substr_count($param["ua"],$val)>0)
{
$this->set_403();
}
}
}
if ($this->check_array($this->hosts_list)!==FALSE)
{
foreach ($this->hosts_list as $val)
{
if (substr_count(gethostbyaddr($param["addr"]),$val)>0)
{
$this->set_403();
}
}
}
if ($this->check_array($this->ref_list)!==FALSE && strlen($param["ref"])>0)
{
foreach ($this->ref_list as $val)
{
if (substr_count($param["ref"],$val)>0)
{
$this->set_403();
}
}
}
}
}
$my_ignore_access = new IgnoreAccess;

$my_ignore_access->hosts_list = array(
"ignore_host_a.net",
"ignore_host_b.net",
"ignore_host_c.net"
);

$my_ignore_access->ua_list = array(
"ignore_ua_a",
"ignore_ua_b",
"ignore_ua_c"
);

$my_ignore_access->ref_list = array(
"ignore_referer_a.net",
"ignore_referer_b.net",
"ignore_referer_c.net"
);

$ignore_point["ip"] = (isset($_SERVER["REMOTE_ADDR"])) ? $_SERVER["REMOTE_ADDR"] : NULL;
$ignore_point["ua"] = (isset($_SERVER["HTTP_USER_AGENT"])) ? $_SERVER["HTTP_USER_AGENT"] : NULL;
$ignore_point["referer"] = (isset($_SERVER["HTTP_REFERER"])) ? $_SERVER["HTTP_REFERER"] : NULL;
$my_ignore_access->ignore($ignore_point,FALSE);
[/code]

コメントする