TOPページ > カテゴリ別表示 : php

本文開始▼

php アーカイブ

2006年12月28日

Flash制作講座公開(というか復活)

以前公開してたFlash制作講座を復活させました。
http://ks-product.com/c_refer/flashmotion/

このFlash制作講座ではツールとしてのFlashの解説を行っています。基本的にはFlashアニメーションを作成したい入門者用になっていますが、使える小ネタなども載せていきたいと思っていますので宜しくです。

直接Flashとは関係ないのですが、Flash制作講座の各ページ左側のナビゲーションはインデックスページを元に動的に生成していて、インデックスページを更新すればナビゲーションにも反映されるといった仕様になっています。

具体的にはPHPを使いXHTMLを参照し、該当ノードを取得しています。こうやってデータの再利用ができるところがXHTMLの良いところですね。

2006年12月12日

PHP+MYSQLで商品レビューページを作成。

先日ブログで取り上げた、PHP+XMLで作った商品レビューページを改良して、ついに公開しました。
http://ks-product.com/items.php

PHP+XMLからPHP+MYSQLに変更したことで、データ数の上限が増加及び検索機能がプラスされました。MYSQLの扱い(インデックスとか)があんまり理解できてないので、DBの処理が遅いかも。

肝心のレビューがまだほとんどありませんが。。。ちょくちょく更新していくつもりでいるので宜しくです。ちなみに、レビューできるのは管理人だけという仕様になっています。(個人では管理しきれない。。。)

2006年12月09日

GET引数のエンコード。

PHPでマルチバイト文字列をGET送信する際はエンコードしなければならないが、ブラウザによっては自動でエンコードされる模様(firefox1.5、opera8.54、ie7で確認)。IE6などの旧世代ブラウザではそのような機能はないので手動でエンコードしてやる必要がある。

2006年12月07日

MYSQL:クエリする際のエスケープ2

PHPからMYSQLにクエリする際は、特殊文字をエスケープするわけだが、ではアンエスケープはいつするのか。

答えは、MYSQLにクエリした辞典で自動的にアンエスケープされる(っぽい)。

考えてみれば、クエリするときにだけインジェクション攻撃される可能性があるわけだから、データベース内ではエスケープしておく必要は無いわけだ。

2006年12月06日

MYSQL:クエリする際のエスケープ1

PHP等のスクリプトからMYSQLなどのデータベースに接続しクエリする場合、\n, \r, \, ', "などの文字列をエスケープする必要があります。上記文字列はSQLでは特別な意味を持つためです。(HTMLでいう < や > に相当。)

エスケープを行う為の関数がいくつか用意されているので、自力でエスケープする必要はありません。また、サーバー側で「magic_quotes_gpc」の設定がonになっている場合は自動でエスケープされます。

しかし、magic_quotes_gpcやエスケープ関数addslashesはインジェクション攻撃による脆弱性があるらしいので使わない方が無難らしい。(インジェクション攻撃とは、HTMLのフォームなどから不正なデータを送信し、不正アクセスなどをすること。)

エスケープするにはmysql_real_escape_string()関数を使用するのが無難っぽい。ただし、magic_quotes_gpcがonになっていると2重でエスケープ処理されてしまうので、.htaccessで設定を無効にするか、stripslashes()関数でエスケープ文字を取り除く。ただ、mysql_real_escape_string()関数を使っても万全ではないらしい。SHIFT-JISを使用するとヤバいらしい。

2006年12月01日

XMLが読み込めないのは何故?

PHPでXMLを読み込もうとしたんだけど、こんなエラーメッセージが出てどうも読み込めない。

Warning: domxml_open_file(): EntityRef: expecting ';'

悩むこと数時間…

EntityRef…。って実体参照のことじゃね?と気付き、(気付くの遅すぎ。。)XMLファイルを見てみると。。。「&」がいたるところで使われているではないか。

たったこれだけで読み込めないものなのかぁ。

管理画面作成。

先日の記事で紹介した自作Flash。
http://ks-product.com/2006/11/0611281755.html

いちいちXMLファイルを編集してくのも面倒なので、PHPで管理画面を作ってみた。(まだ、機能的に不完全かと思うのでソースは非公開です。)なんとなくセッションの使い方が分かってきたぞ~。

2006年11月28日

PHPでのXML:DOMの操作方法。

PHPではDOMでノードの操作ができます(XMLやXHTMLのタグに直接アクセスできる)。

まず、馴染みの深い(あくまでも自分はだけど)Flash(as2.0)でのDOMの指定例。


var myXML = new XML(); //XMLインスタンスを作成
myXML.load("sample.xml"); //XML文書よみこみ

/* onLoadイベント発生後… */
trace(myXML.firstChild.nodeName); //ルート要素ノード名を出力

続いてPHP4での例


$dom = domxml_open_file("sample.xml"); //DOMドキュメントインスタンス生成
$root = $dom->first_child(); //ルート要素ノードを返す
echo $root->node_name(); //ルート要素ノード名を出力

続いてPHP5での例(テスト環境が無いので未チェック)


$dom = new DOMDocument(); //DOMドキュメントインスタンスを生成
$dom->load("sample.xml"); //XML読込
echo $dom->firstChild->nodeName; //ルート要素ノード名を出力

FlashとPHP5は構文がほとんど同じなので、FlashでDOMを習得していれば移行が容易かと。

問題はPHP4。いくつか大きな違いがある。
まず、first_child、node_nameなどネーミングが独自のもの。(規則性はあるので難しくは無い。)
次に、first_child、node_nameなどがDOMの規格ではプロパティであるのに、PHP4ではメソッドとして扱われている。これが厄介。$dom->first_child->node_name;という具合に連続してノードを辿れない。つまり、$node=$dom->first_child();というように変数に代入してやる必要がある。(もしかしたら他にも記述方があるのかも知れないけど。。。)

追記:


$dom = domxml_open_file("sample.xml"); //DOMドキュメントインスタンス生成
$root = $dom->first_child(); //ルート要素ノードを返す
echo $root->node_name(); //ルート要素ノード名を出力

とするよりも


$dom = domxml_open_file("sample.xml"); //DOMドキュメントインスタンス生成
$root = $dom->document_element(); //ルート要素ノードを返す
echo $root->node_name(); //ルート要素ノード名を出力

のほうが確実。
$dom->first_child();だとファイル構成によっては上手くルート要素を取得できないみたい。

PHPでXMLの空白ノードを削除。

FlashでXMLを処理する時、空白ノードを取り除く場合「XML.ignoreWhite」を使用するが、PHPでそれに対応するものを発見。どうやらPHP4とPHP5では指定方法が違うようだ。(そもそもPHP4のDOMは標準規格ではない)

PHP4では
domxml_open_file("test.xml",DOMXML_LOAD_DONT_KEEP_BLANKS)
とこのようにdomxml_open_file関数に「DOMXML_LOAD_DONT_KEEP_BLANKS」オプションを指定し、

PHP5では
$DOMObject->preserveWhiteSpace = FALSE;
とすることで空白ノードを削除できる。

Flashユーザーからすると、PHP5のほうが馴染みやすいなぁ。PHP5に移行したいけど、こればっかりはサーバーの問題だしな。。。

xml宣言をするとPHPでエラーが出る!?

以前からFlashとの連動でPHPをちょくちょくいじっていたんだけど、HTMLでPHPを利用するのは実は初めてだったり。

動作チェックという意味合いも込めてechoで文字列を書き出すテストをしてみると早速エラーが。。。構文は合っているのに何故?よくみると1行目に問題があるらしい。

<?xml version="1.0" encoding="utf-8"?>

どうやらこのXML宣言が悪さをしている模様。調べてみると、「<? ~ ?>」はPHPのショートカットにも使われているらしいので、XMLと混同してしまう模様。

XML宣言をPHPのechoで書き出すことで解決可能です。

本文終了▲