月別アーカイブ: 2月 2012

PHPでHTMLを簡単に扱う – SimpleHTML DOM Parser

 PHPでHTMLを扱うときに便利なのがSimple HTML DOM Parserと言うライブラリ。
 HTMLが正しい構造ならば、PHP標準のXML機能で扱えるんだけど、世の中、正しくないHTML文書の方が多いので、パースで転けるけど、このライブラリを使うとブラウザのように上手く理解してくれるので、簡単に扱うことが出来る。

 file_get_html(url)でHTMLをパースしたオブジェクトを得て、そのオブジェクトに対してfind(タグ名)メソッドや、children(要素番号)メソッドでタグを分割できる。

サンプル > 実行してみる on さくらのVPS

require_once(‘simple_html_dom.php’);
$URL = ‘http://vps.xn--ockc3f5a.com/’;

if($html = file_get_html($URL)){
    $linka = array();
    $links = array();
    foreach($html->find(‘a’) as $el){
        $linka[md5($el->href)]++;
        $links[md5($el->href)] = $el->href;
    }
    arsort($linka);
    foreach($linka as $k=>$n){
        echo("<li>{$links[$k]} [{$n}リンク]</li>");
    }
}else{
    echo(‘HTMLの取得に失敗しました’);
}

 この場合、全てのaタグを探索して、そのhref要素についてカウントしている。
 正規表現を使って^http[s]{0,1}:\/\/で切り分けてやれば、相対リンクと絶対リンクの切り分けが出来るだろう。
 更に、絶対リンクを^http:\/\/vps.xn--ockc3f5a.com\/で切り分けると内部リンクと外部リンクに分けられる。

 CでHTMLをパースする場合は、こちらの記事が参考になる。

(243)

カテゴリー: PHP | コメントをどうぞ

CodeIgniterのルーティングを活用する – PHP 開発

 CodeIgniterのルーティングの話。
 ルーティングは、URIルールに従って動くCodeIgniterのコントローラ制御などのルールを書き換えて、本来と違う動きを挿せる機能。

$route[‘PRO/([^\/]+)’] = “$1/index/pro”;
$route[‘PRO/([^\/]+)/([^\/]+)’] = “$1/$2/pro”;
$route[‘PRO/([^\/]+)/([^\/]+)/(.*)’] = “$1/$2/pro/$3”;

$route[‘PREMIUM/([^\/]+)’] = “$1/index/premium”;
$route[‘PREMIUM/([^\/]+)/([^\/]+)’] = “$1/$2/premium”;
$route[‘PREMIUM/([^\/]+)/([^\/]+)/(.*)’] = “$1/$2/premium/$3”;

 これらのルーティングを定義すると、通常、 /Controller/Method/Options… となっているURIを書き換えて、製品グレード別に /PRO/Controller/Method/Options… /PREMIUM/Controller/Method/Options… のようにアクセスさせて、内部的には同じ /Controller/Method/製品グレード/Options… にマップする。
 各メソッドの第一引数に製品グレードを判別して、使える機能・使えない機能を切り分けたりすることが出来る。

(407)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP], PHP | コメントをどうぞ

ブログ等にソースコードを入力するためにHTML特殊文字を変換してみる – PHP 開発 サンプル

 ブログ等にソースコードやHTMLタグを表示させようとして入れても、HTML特殊文字が評価されてしまって表示が崩れてしまったりする時、対応するために特殊文字をエンコードする必要が出る。
 VPSを持っているなら、簡単なPHPスクリプトを作れば実現できる
実行してみる on さくらのVPS

$code = htmlspecialchars(htmlspecialchars($sourcecode));
echo("<textarea cols=’80’ rows=’40’>{$code}</textarea>");

PHPが提供するhtmlspecialcharsをかけるだけでOK。
1回かけると画面に通常表示なので、2回かけて特殊文字変換された状態の物を表示させる。

(253)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP], PHP | コメントをどうぞ

複数カラムの値を別問い合わせの複数カラム結果に基づいて抽出する – 行副問い合わせ MySQL

 プチMySQLメモ

 MySQLで、あるカラム値が別の問い合わせ結果の一覧に含まれているか問い合わせる場合に使うのが副問い合わせ(サブクエリ)

 例えば、商品一覧テーブル items があって、在庫一覧テーブル stock の在庫数量 stock_num が0より多い(在庫がある)商品を検索する場合、共通の商品ID item_id で関連を持っているとすれば

SELECT * FROM items WHERE item_id IN (SELECT item_id FROM stock WHERE stock_num > 0)

 行副問い合わせは、複数カラムを使った副問い合わせ。

 例えば、共通の item_id が無くて、商品名 item_name とメーカー名 item_maker によって管理されている場合には

SELECT * FROM items WHERE ROW(item_maker, item_name) IN (SELECT item_maker, item_name FROM stock WHERE stock_num > 0)

 のようにして、複数カラムによって問い合わせることが出来る。

 なお、副問い合わせは1カラムなので名前に関係ないが、行副問い合わせでは複数のカラムの対応を取るためにカラム名を使うので、主テーブルのカラム名と副問い合わせテーブルのカラム名が異なるときには、カラム AS カラム名(SELECT stock_item_maker AS item_maker, stock_item_name AS item_name FROM stock…の様に)でカラム名を書き換えて対応を取らせる。

※テストケースとして副問い合わせを使っているが、これらのパターンの場合、MySQLでは結合(JOIN)した方が高速である場合が多いのには注意

(1062)

カテゴリー: MySQL | コメントをどうぞ

intレコードの値をランダムに更新してみる – MySQL UPDATE RAND ROUND

プチMySQLメモ

マスターテーブル usershop_id(int) カラムがあって、ユーザの登録店舗を保存しているとする。

店舗再設置に伴い店舗をランダムに振り分ける場合

UPDATE user SET shop_id = ROUND(RAND()*10)

これで、0~10のIDが振られる。 最低値を1にするなら 1+RAND()*9。
MySQLのRAND()関数は、0~1.0の範囲の小数乱数を発生するので、これに10を乗算して0~10.0の範囲にして、ROUND()関数で小数点以下を丸めてint型に適合させる。

(2472)

カテゴリー: MySQL | コメントをどうぞ

マスターレコードの値で関連レコードを更新してみる – MySQL JOIN UPDATE VPS

プチMySQLメモ

マスターテーブル usershop_id カラムがあって、ユーザの登録店舗を保存しているとする。

関連テーブルとして、問い合わせテーブル inquiry にも shop_id を保存して、問い合わせ先の店舗を保存しているとする。

ある時、問合せをユーザの登録店舗で集約する為に、inquiry.shop_iduser.shop_id で更新することにした。

なお、inquiry.user_id カラムによって、 user.id と関連づけられているとすると、この場合の更新文は

UPDATE inquiry LEFT JOIN user ON inquiry.user_id = user.id SET inquiry.shop_id = user.shop_id

でOK。

(139)

カテゴリー: MySQL | コメントをどうぞ

Ablenet VPSを使ってみた – vps ablenet unixbench レビュー

 ServersMan@VPSからの乗り換え先に良いVPSはないかと、色々と探してみて、安いサービスとして、ABLENET:VPSを見つけて試用してみたんだけどこれが凄い。
 凄いっていっても良い意味じゃなく,遅い・・・
 v2プラン(仮想3コア、1GBメモリプラン、月額1480円)を試したんだけど、UnixBench5.1.3のインデックスが、シングルで273、3パラレルで683と言う結果だった。
 3パラレルのインデックスがServersMan Proプランの1シングルと同程度だ。
 procの表示では2.27GHzと出てくるので、相当詰め込んでいる感じがする。
 今回のレビューに併せてさくらのVPSのベンチも取り直したが、以前2200を超えていた4GBプランのサーバが2000を切っていて、徐々に詰め込まれているのかなという感じを受けた。
 次はSaasesとかラピッドVPSでも試してみようか。

(281)

カテゴリー: サーバ設定 | コメントをどうぞ