Webシステム構築 - php
PHPで配列と変数を同じ名前で使用すると
Cannot use a scalar value as an array
というエラーが発生する。
// 同じ名前で配列と変数を使用 $test = 'aaa'; $test['0'] = 'aaa';
function rmdirf($dir) {
if ($handle = opendir("$dir")) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if (is_dir("$dir/$file")) { rmdirf("$dir/$file"); } else { unlink("$dir/$file"); }
}
}
closedir($handle);
rmdir($dir);
}
}
フォルダ内にデータが存在する場合はrmdirでは削除ができません。
ファイルが存在していても強制的に削除したいという場合は上記のような関数を作成しておくと便利です。
// SQLiteの場合 $str = sqlite_escape_string($str); // MySQLの場合 $str = mysql_real_escape_string($str);
データベースへの挿入、更新時に上記処理を行うことでエラーを防ぐことができます。
URLに guid=on をつけることでFOMAのユーザーIDを環境変数として取得することが可能になります。
// FOMAユーザーID echo $_SERVER['HTTP_X_DCMGUID'];
guid=on がついている場合でも携帯端末側でユーザーIDを使用しない設定になっている場合は取得が行えません。
■他のキャリアの取得方法について
// ezwebユーザーID echo $_SERVER['HTTP_X_UP_SUBNO']; // softbankユーザーID echo $_SERVER['HTTP_X_JPHONE_UID'];
$header = get_headers($url);
if (strstr($header[0], '200')) {
return true;
} else {
return false;
}
is_file関数でファイルの存在確認ができるので、is_urlとでもしてfunctionにしてしまえば
使いやすくなります。
キャッシュさせる仕組みを作るときに活躍する serialize は大変便利です。
別サーバーとの連携にも使われることが多いです。
■ 配列データをテキストファイルに書き出し
// 配列にデータを格納
$data_ary = array('a','b');
// serializeして配列情報をファイルに書き出す
file_put_contents('data.txt', serialize($data_ary));
■ テキストファイルから読み込んだデータを配列に格納
// ファイルから読み込んだデータを配列に格納
$data_ary = unserialize(file_get_contents('data.txt'));
配列情報をそのまま出力できるため、
読み込んだ際もそのまま出力前の配列の状態が再現できます。
$html = mb_convert_kana($html, 'knr', 'cp932');
携帯サイトでは画面が小さいためカタカナを半角で表示させる必要があります。
DoCoMoのユーザーIDを取得するにはアドレスにguid=onを付ける必要があります。
guid=onが付いていない場合は自動的にguid=on付きのアドレスにリダイレクトするプログラム。
if ($_REQUEST['guid'] != 'on') {
// パラメーターがあるかどうか判定
$param = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&guid=on' : '?guid=on';
// 環境変数からリダイレクトアドレスを取得
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$param;
// リダイレクト
header('Location: '.$url);
}
パラメーターが付いていてもそのままパラメーター付きの状態でリダイレクトします。
Google Chartを使用すると簡単にQRコードを作成することができます。
ページを表示するたびにリクエストを送るよりはサーバーに保存して表示した方が
負荷も与えず、動作も軽くなります。
// URLをエンコード
$url = urlencode(QRコードに含めるURL);
$google_chart = 'http://chart.apis.google.com/chart?chs=130x130&cht=qr&chl=';
// QRコードイメージデータを取得
$qrcode = file_get_contents($google_chart.$url.'&choe=Shift_JIS');
// ファイルに保存
file_put_contents('qrcode.gif', $qrcode);
Google Chart Tools / Image Charts
http://code.google.com/intl/ja/apis/chart/
ob_start(); require 読み込み用php; $ob_data = ob_get_contents(); ob_end_clean();
読み込むだけで結果をその場で出力するphpの対応。
出力情報をphp側で取得して変数に格納することができます。
// キャッシュヒット率算出用の情報を取得
$sql = "SHOW STATUS LIKE 'Qcache%'";
$rs = mysql_query($sql);
while ($rows = mysql_fetch_assoc($rs)) {
$tmp[$rows['Variable_name']] = $rows['Value'];
}
// query cache hit 率 = Qcache_hits / ( Qcache_hits + Qcache_inserts + Qcache_not_cached ) * 100
$hit = $tmp['Qcache_hits'] / ($tmp['Qcache_hits'] + $tmp['Qcache_inserts'] + $tmp['Qcache_not_cached']) * 100;
MySQLのキャッシュ設定が正しく行われているか、キャッシュを有効に活用できているかなどを確認できます。※DB接続等の処理は省いています。
// 空配列を使用した時の警告文章 Warning: Invalid argument supplied for foreach()
上記の警告文章を見たことある人は多いのではないでしょうか?
これはforeachを使用した際にパラメーターとして渡す配列が空の時に表示されます。
この警告を防ぐには
// 空配列を使用した時の警告文章
if (count($array) > 0) {
foreach ($array as $key => $value) { 処理内容 }
}
配列にデータが格納されているかを確認してからforeachを実行するようにします。
環境変数:$_SERVER['REQUEST_URI']
の値はどの端末からでも同じものだと思っていました。
※アクセスするサイトは端末に関係なく同じため
http://1oku-life.com/~hoge/
というサイトがあったとします。
PC
http://1oku-life.com/~hoge/ => /~hoge/
AU
http://1oku-life.com/~hoge/ => /%7hoge/
~チルダがエスケープされた状態で取得する場合があるようです。
file_put_contents('log.txt', $data, FILE_APPEND | LOCK_EX);
排他ロックと併用して使うことが多いですが、ロックがかからないことがあるので、
オプションでの排他ロックはあまり信頼していません。
// 三項演算子 $data = (if条件) ? if条件一致処理 : if条件不一致処理; // サンプル $data = ($flg==1) ? true : false;
三項演算子を利用することで必ず結果取得変数に値が取得できるようなります。
また
if ($flg==1) {
$data = true;
} else {
$data = false;
}
と記述するよりはソース量が減るので後々見やすいです。
// 全てのエラー出力をオフにする error_reporting(0); // // 全てのエラーを出力する error_reporting(E_ALL); // // phpデフォルトのエラー表示(警告以外の全てのエラーを表示)にする error_reporting(E_ALL ^ E_NOTICE);
開発時と運用時で切り替えるようにすると作業効率が上がります
//htmlコメント削除
$html = preg_replace('//', '', $html);
<!--~-->を削除することができます。
不要なコメントをソースに表示させたくない場合に使用すると便利です
//今月末の日付取得
$last_day = date("d", mktime(0, 0, 0, date("m") + 1, 0, date("Y")));
12月であれば31を取得 11月であれば30を取得できます
デザインなら得意だがホームページを作るのはちょっと…
アイデアはあるが形にできない…
外注に頼む費用がもったいない…
定期的に時間にゆとりがあり、空いた時間を使って何かしてみたい方…
上記のような方は相談の上一緒に協力できたらと思います。
利益が出るサイトの場合は経費・売り上げともに折半でお願いします。(笑)