タグ: php

PHP var_dump の出力をログファイルに・・・

投稿者:isc_blog

タイトルの日本語おかしいかな・・・
検索に引っかかる用ですのでお気になさらず。

単純な例(ポストされたリクエストを確認)

[php]


// ロガーとか作ってあると仮定します。

// CodeIgniterでのログ出力
log_message(‘debug’, var_export($_POST,true));

// Log4php でのログ出力
$logger->debug(var_export($_POST,true));
[/php]

これでOKです。
var_dump で出力される文字列部分だけなら
var_export で取得できるってことですね。

参考
PHP: var_export – Manual

2011年11月29日

PHPの閉じタグは閉じるな!の教え

投稿者:isc_blog

PHPの閉じタグは閉じなくて良いじゃなくて、閉じてはいけない!

そうなんですよ・・・
PHP始めた頃は、閉じタグきっちり書いてました。
(始めた頃どころか、最近も注意しないと思わず閉じちゃいます。)

しかし、閉じなくていいんですよ。

じゃなくて、閉じても「100害あって一利なし」です。

実際、CodeIgniterのソースには一切閉じタグがありません。
が、しっかり挙動しています。

私自身は昔、こんなトラップにハマって以来、閉じるのが怖くなりました。

システムでMySQLに画像データをBLOB型で突っ込んで表示するPHPを作っていた時のこと。
画像が全く表示されない・・・
かなり時間かけて調べましたが、コード上変な記述は見当たらない(目視レベルでは・・・)
で、トラフィックをとってみたんです。
すると、画像のバイナリーデータの前に改行コードが・・・・

結局、画像データを取得して表示する・・・前のPHPファイルに「?>」閉じタグのあと改行が・・・・混在していました。

それを拾ってしまったがために画像表示されなかったんですね。

改行を取ったらすんなり表示・・・

閉じタグがなければこんなことは起こりません。

閉じないようにしましょー!

2011年9月25日

PHPベンチマーク結果まとめサイト「The PHP Benchmark」を見てスピードアップさせたい・・・

投稿者:isc_blog

PHP のベンチマークテスト結果ないかな~と思って検索していたところ
いつも愛読しているPHP SPOT開発日誌さんの過去記事を発見しました。
PHPベンチマーク結果まとめサイト「The PHP Benchmark」

こちらの記事で紹介されているサイトがこちら↓↓
The PHP Benchmark

なかなかやるせない(?)情報がいっぱいだった・・・・

たとえばこちら↓

以下 The PHP Benchmarkより引用
[php]
<?php

// Initial Configuration
$answer = 2;

// Test Source
function Test10_4() {
global $answer;

/* The Test */
$t = microtime(true);
while($i < 1000) {

if($answer === 1) {

} else if($answer === 3) {

} else {

}

++$i;
}

return (microtime(true) – $t);
}

// Variable Clean-up
function Test10_End() {
global $answer;
unset($answer);
}

?>
[/php]
というコードと
[php]
<?php

// Initial Configuration
$answer = 2;

// Test Source
function Test10_6() {
global $answer;

/* The Test */
$t = microtime(true);
while($i < 1000) {

switch($answer) {

case 1:

break;

case 3:

break;

default:

break;
}

++$i;
}

return (microtime(true) – $t);
}

// Variable Clean-up
function Test10_End() {
global $answer;
unset($answer);
}

?>
[/php]
というコード。

どちらも同様の計算が行われるはず・・・
ところが前者が

95μs(マイクロ秒)に対し

後者は

135μs(マイクロ秒)になる。
前者を100%とすると後者は142%。
アプリケーション全体で後者の記述をしていれば前者に直すと142%加速する(・・・わけないか)

こんな感じでいろいろ比較があって見れば見るほど過去を反省・・・もといこれから直していこうと思っちゃいます。

※PHPの比較演算子について
「===」は型も含めて同じである場合にTRUEとなります。(PHP4以降)
詳しくはこちら(PHP:比較演算子)

2011年8月28日

CodeIgniter 機能拡張の注意点メモ

投稿者:isc_blog

CodeIgniter開発中に
既存のAPIで機能的に足りないのでいろいろ拡張することになるんですが
その際に「MY_」を付けます。

例えばForm_validationクラスを拡張してバリデーションにいろいろなバリエーション(w)をつけたい場合は
application/libraries/MY_Form_validation.php を作成してそのなかに
[php]
class MY_Form_validation extends CI_Form_validation {

/**
* Constructor
*/
public function __construct($rules = array())
{
parent::__construct($rules);
}

// ——————————————————————–

/**
* 電話番号チェック
*
* @access public
* @param string
* @return bool
*
*/
function phone($str)
{
if ($str == ”)
{
return TRUE;
}
return ( ! preg_match("/^\d{2,5}\-\d{1,4}\-\d{1,4}$/", $str)) ? FALSE : TRUE;
}
・・・
[/php]
こんな感じで作成します。

すると、CodeIgniterはこの「MY_」を付けたものを自動的に取り込んでくれて
あたかも Form_validationにあるかのように
[php]
$this->load->library(‘form_validation’);
[/php]
で読み込めて
[php]
$this->form_validation->set_rules(‘fax_no’, "FAX番号","trim|phone");
[/php]
みたいに使えるわけです。(上記の例は電話番号型になっているかチェックするルール設定です。)

しかし、今日それを「helper」でやろうと思って
application/helper/My_date_helper.php」を作成し・・・メソッドを書いて・・・
[php]
$this->load->helper(‘date’);
[/php]
も書いて・・・メソッドを呼ぶ処理を書きました。

・・・ダメ・・・使えてない・・・

ん~
どうなっているのかしばしソースチェック・・・
helperはクラスになっていなくてメソッドをそのまま書く感じになっているのでまた余計なことを考えて・・・・

結果、ファイル名が良くなかったみたいです。
My_date_helper.php」から 「MY_date_helper.php」 に変更したら・・・・

使えました!

解決するとなぁんだ!ってことなんですが。はまりそうでした。

2011年7月15日

WordPressのためにPHPのセーフモード解除する.htaccess For XREA/Coreserver

投稿者:isc_blog

XREA/Coreserver を利用している方でWordPressをセーフモードで動作させていらっしゃる方向けの記事です。

私自身、どなたかの記事を読んで設定したはずなんですが・・・
失念しました。

下記内容をファイル名「.htaccess」に記述し wp-admin ディレクトリに入れます。
[text]
# 画像・ファイルアップロード
<files async-upload.php>
AddHandler application/x-httpd-phpcgi .php
</files>
# プラグイン・テーマ 新規インストール/アップグレード
<Files update.php>
AddHandler application/x-httpd-phpcgi .php
</Files>
# 本体アップグレード
<Files update-core.php>
AddHandler application/x-httpd-phpcgi .php
</Files>
[/text]

このブログ開設以来これでいけてます。

いろいろ調べていたら下記記事の方の設定で万能っぽいです!参考まで
XREA・CORESERVERのセーフモード対策 at WordPress|Divenavi and Okinawa34

アイ・エス・シーでこの他、さくらサーバーとロリポップをレンタルしているのでいずれそちらでも試してみます。

2011年7月10日

CodeIgniter ちょいメモ

投稿者:isc_blog

よくあるウェブアプリケーションの画面遷移
入力→確認→登録完了
的なもの

確認画面で隠しフィールドで・・・みたいなこと考えるといちいいコーディングが大変なんですが

CodeIgniterのFormヘルパが解決してくれました。

ユーザガイドより抜粋

隠しフィールドの追加
次のように、第3パラメータに連想配列で渡すことで、隠しフィールドを追加できます:

$hidden = array(‘username’ => ‘Joe’, ‘member_id’ => ‘234’);

echo form_open(‘email/send’, ”, $hidden);
上の例は、次のようなフォームを生成します:
[html]
<form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send">
<input type="hidden" name="username" value="Joe" />
<input type="hidden" name="member_id" value="234" />
[/html]

ふむふむなるほどなるほど・・・と思いControllerクラスでデータを配列に格納
[php]
・・・
$req_data = array();
// 全部「test」って入力されてます
$req_data[‘title’] = $this->input->post(‘title’);
$req_data[‘name’] = $this->input->post(‘name’);
$req_data[‘memo’] = $this->input->post(‘memo’);

$data[‘req_data’] = $req_data;
・・・
[/php]

ビューでこんな記述
[php]
<?php $attributes = array(‘class’ => ‘form’, ‘id’ => ‘form’); ?>
<?php echo form_open(‘regist’, $attributes, $req_data); ?>
[/php]

すると・・・こんなHTMLになります。
[html]
<form action="http://~your-domain~/index.php/regist" accept-charset="utf-8" name="form" method="post">
<div class="hidden">
<input type="hidden" name="title" value="test" />
<input type="hidden" name="name" value="test" />
<input type="hidden" name="memo" value="test" />
</div>
[/html]
素敵やん!

2011年7月1日

CodeIgniterのすすめ

投稿者:isc_blog

PHPでのシステム開発で最近「CodeIgniter」を利用しています。

以前、一度開発した頃は CodeIgniter1.6から1.7になったあたりだと思うので・・・うーん、それほど前では無いけどいつだか忘れました・・・。

CodeIgniterとはPHPのフレームワークでJava経験者にはとっつきやすいものだと・・・オススメしています。

まず、「CodeIgniterへようこそ」ページを見るとこんな内容が・・・・

CodeIgniter は、こんな人にぴったりです:

省スペースのフレームワークが欲しい人。
圧倒的なパフォーマンスを求める人。
PHP のバージョンや環境設定の違う一般的なホスティング(レンタルサーバ)で幅広く動作するものが欲しい人。
ほとんど設定がいらないフレームワークを希望する人。
コマンドラインを使う必要がないフレームワークを好む人。
決められたコーディングルールに厳格に従う必要がないフレームワークが欲しい人。
PEAR のような大規模な一枚岩のライブラリには興味がない人。
テンプレート言語を習得しなければならないのが嫌な人(必要な場合だけにオプションでテンプレートパーサが利用できるようなものは除く)。
複雑なものを避け、シンプルな解決策を好む人。
わかりやすく詳細なドキュメントが欲しい人。

PHPでの開発経験者にフレームワークなにがいいですか?って聞かれたら最近は迷わずオススメしています。

コードはこんな感じです。 ※CodeIgniter1.7.3 のソースです。

コントローラー部
[php]
class Top extends Controller {

function Top()
{
parent::Controller();
$this->load->library(‘session’);
$this->load->database();
$this->load->helper(array(‘form’, ‘url’));
$this->load->library(‘validation’);
$this->output->set_header(‘Content-Type: text/html; charset=UTF-8’);
}

function index()
{

// データ取得 DBに作成したピックアップニュースビューからデータ取得
$data[‘pickupnews_query’] = $this->db->get(‘view_pickupnews’);
// データ取得 DBに作成した本日の紹介ショップ記事からデータ取得
$data[‘sp_query’] = $this->db->get(‘view_spshops’);
// 画面描画
$this->load->view(‘top’, $data);
・・・・・
[/php]

ビュー部
[php]
・・・・(前略)
<?php foreach($pickupnews_query->result() as $row): ?>
<TR bgcolor="#FFFFFF">
<td>
<a href="spdetail?id=<?=$row->ID?>"><?=$row->title?></a>
</td>
<td align="left">
・<?=$row->SP_NEWS1?><br />
・<?=$row->SP_NEWS2?><br />
<?=n2br($row->SP_NEWS3, "")?>
</td>
</TR>
<?php endforeach; ?>



<?php foreach($sp_query->result() as $row): ?>
<TR bgcolor="#FFFFFF">
<td>
<?=$row->SHOP_NM?>
</td>
<td>
<!– <?=$row->SHOP_CD?> –>
<?=$row->SP_NEWS1?>
</td>
<td>
<?=$row->SP_NEWS2?>
</td>
<td>
<?=$row->SP_NEWS3?>
</td>
<td>
<?=$row->SP_NEWS4?>
</td>
<td>
<?=$row->SP_NEWS5?>
</td>
<td>
<a href="sdetail?scd=<?=$row->SHOP_CD?>">詳細</a>
</td>
</TR>
<?php endforeach; ?>
・・・・
[/php]

これは・・・なに作ったか忘れましたが自作のサイトから引用したものです。
// DBから取得して・・・のコメントあたりがものすごく便利な書き方していると思います。

実際はCREATE VIEW で作ったVIEWをおもむろに取得して表示しているだけなんです。

現行バージョンの2.0.1(日本語バージョン)では
extends Controller  あたりと
コンストラクタの
parent::Controller();
あたりに相違点がありますがほぼ一緒です。

※CodeIgniter2.0以降の例
[php]
class Top extends CI_Controller {

function Top(){
parent::__construct();

//ヘルパの追加
$this->load->helper(‘url’);
$this->load->helper(‘form’);
}

function index()
{
$data[‘title’] = "TOP:タイトル";
$data[‘heading’] = "タイトル";
・・・
[/php]

サクサク出来ちゃいます。
PHPで開発しなきゃ・・・という方はお試し下さい!

PHPフレームワークの「codeIgniter」がスゴすぎる」という記事に書いてあるのですが、CodeIgniterはControllerがあれば動作します。

で?
ってこれがどういうことかと言うと
WebAPIを作るのに重宝するんです。
POSTやGETでパラメータを受け取って・・・処理して・・・画面に表示しないでJSONで出力っていうのにも対応します。

出力クラス::CodeIgniter ユーザガイド 日本語版によると・・・ページを表示する代わりにこんな出力も出来ます!
[php]
$this->output
->set_content_type(‘application/json’)
->set_output(json_encode(array(‘foo’ => ‘bar’)));
[/php]

参考文献:
日本CodeIgniterユーザ会
CodeIgniter ユーザガイド 日本語版 Version 2.0.1
PHPフレームワークの「codeIgniter」がスゴすぎる

2011年6月29日

PHPでMySQLのレコードに画像情報を保存するやり方

投稿者:isc_blog

PHPでMySQLへ画像格納のアップロードやり方
— テーブルは下記SQLで作成
[sql]
CREATE TABLE `img_data` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`img_bin` BLOB NOT NULL,
`mime` VARCHAR(64) NOT NULL
) ENGINE=MYISAM ;
[/sql]
格納側ソースこちら
[image_upload.php]で保存
↓↓
[php]
<?php
$host=”localhost”;
$user=”●●●●”;
$pass=”■■■■”;
$db_name=”▼▼▼▼”;
?>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>画像DB格納</title>
</head>
[/php]
ファイルアップロード
[php]
<form method=”POST” enctype=”multipart/form-data” action=”image_upload.php”>
<input type=”hidden” name=”MAX_FILE_SIZE” value=”3145728″><!–BLOB型の限界–>
画像ファイル選択:<input size=”30″ type=”file” name=”upfile”>
<input type=”submit” name=”submit” value=”送信”>
</form>
<?php
if($_POST["submit"]!=”"){ // 送信された場合のみ
if($_FILES["upfile"]["tmp_name"]==”none”){
print(“ファイルのアップロードができませんでした。\n”);
exit;
}
$fp=fopen($_FILES["upfile"]["tmp_name"], “rb”);
if(!$fp){
print(“アップロードしたファイルを開けませんでした”);
exit;
}
$imgdat=fread($fp, filesize($_FILES["upfile"]["tmp_name"]));
fclose($fp);
print(“ファイルサイズ:$_FILES["upfile"]["size"]\n”);
$len=strlen($imgdat);
print(“データ長=$len”);
$data=pathinfo($_FILES["upfile"]["name"]);
$ext=$data[‘extension’]; //拡張子
// 拡張子判定
if($ext==”jpg” || $ext==”jpeg”){
$mime=”image/jpeg”;
} else if($ext==”gif”){
$mime=”image/gif”;
} else {
print(“画像ファイルのみアップロード可能です。”);
exit;
}
print(“MIME-TYPE:”.$mime.”");
$imgdat=addslashes($imgdat);
$con=mysql_connect($host, $user, $pass);
if(!$con){
print(“MySQLへの接続に失敗しました”);
exit;
}
if(!mysql_select_db($db_name)){
print(“データベースへの接続に失敗しました”);
exit;
}
$sql=”INSERT INTO img_data(img_bin, mime) values(‘$imgdat’, ‘$mime’)”;
$result=mysql_query($sql);
if(!$result){
print(“SQLの実行に失敗しました”);
print(mysql_errno().”: “.mysql_error().”");
exit;
}
$sql=”select max(id) from img_data “;
$result=mysql_query($sql);
if(!$result){
print(“SQLの実行に失敗しました”);
print(mysql_errno().”: “.mysql_error().”");
exit;
}
$row=mysql_fetch_row($result);
$current_id=$row[0];
mysql_close($con);
unlink($_FILES["upfile"]["tmp_name"]);
}
?>
<div>
登録画像ID:<?php echo $current_id; ?>
<img src=”view.php?id=<?php echo $current_id?>” />
</div>
</BODY>
</HTML>
[/php]
表示側ソースこちら
[view.php]で保存
↓↓
[php]
<?php
$host=”localhost”;
$user=”●●●●”;
$pass=”■■■■”;
$db_name=”▼▼▼▼”;
$id=intval($_GET[‘id’]);
$con=mysql_connect($host, $user, $pass);
if(!$con){
print(“MySQLへの接続に失敗しました”);
exit;
}
if(!mysql_select_db($db_name)){
print(“データベースへの接続に失敗しました”);
exit;
}
$sql=”select img_bin from img_data where id=$id”;
$result=mysql_query($sql);
if(!$result){
print(“SQLの実行に失敗しました
“);
print(mysql_errno().”: “.mysql_error().”
“);
exit;
}
if(mysql_num_rows($result)==0){
$sql=”select img_bin, mime from img_data where id=1″;
$result=mysql_query($sql);
if(!$result){
print(“SQLの実行に失敗しました
“);
print(mysql_errno().”: “.mysql_error().”
“);
exit;
}
}
$row=mysql_fetch_row($result);
header(“Content-Type: “.$mime);
echo $row[0];
mysql_close($con);
?>
[/php]
テストサイトを作って・・・・
と思いましたが、変な画像を差し込まれると厳しいものがあるので自粛しました。
コード中のセキュリティに関する配慮は各自お願いします。

2011年5月4日