smartyで戻る用のURLを簡単にセットする方法

smartyのマニュアルにあった現在のURLを変数にセットする方法をメモ。


back_urlパラメータに現在の場所をセット
href="{$smarty.server.SCRIPT_NAME}&back_url={$smarty.server.REQUEST_URI|urlencode}"


マニュアル見た感じだと特にhtmlspecialcharsとかの処理はしていないみたいなので、その辺をケアして使った方が良いのかな。

ひとまず、自分のブログでさくっと採用。
今までこのブログ更新する度に同じ場所に戻るようになっていたけど、これで前のページに戻れるようになって大分楽になった。

自分のブログを自作しているとこういうちょこまかした修正が楽しかったりするな。

PHPで404(Not Found)を返す方法

PHPのマニュアルに書いてあるとおり、以下で可能。

header("HTTP/1.0 404 Not Found");

で、個人的にはこれを実行したら、Apacheが用意している404のエラーページが表示されると思っていたら違った。
この関数は本当にheaderに上記のメッセージを送信するだけだと思われる。
だから、その後の処理も実行される。

で、通常存在しないページにアクセスするとApacheが勝手にエラーメッセージを用意してくれるんだけど、一旦PHPに渡った段階でそのエラーメッセージを表示するのもPHPでやらなくちゃいけない模様。
但しIEはブラウザ側でエラーメッセージを用意している模様、Firefoxはそこまでやらない。
両者の違いがこれまた紛らわしい。

ということで、実質Firefox(他のブラウザはわからんが)の為にエラーメッセージまで表示させてあげようとすると、以下の感じかな。
header("HTTP/1.0 404 Not Found");
die("Not Found");
もちろん、エラーページを表示させるようにしても良いと思うけど、面倒なのでテキストのみ。

404を返していなかったからか、やたらgooglebotが存在しないURLでアクセスしまくってくるので、これでそれが少しでも減ればなと思う。

phpでping送信にチャレンジ

参考にしたサイト
PHPで複数pingサーバへ更新通知 - 株式会社M&Aバンク

簡単に出来たは出来た。
けど、レスポンスが遅かったり失敗するサーバがある。
そして、何よりも送ってOKというレスポンスが返って来たにもかかわらず、反映されている感じがしない。

良くわからないから、とりあえずはFeedBunnerさんにpingを送ってもらうことに。

MySQL&ADOdbのを使う時にExecuteではまる

ADOdbでExecuteを使う時に、?を使って値を変換してSQLを実行してくれるっていう使い方がある。
$conn->Execute("SELECT * FROM TABLE WHERE COND=?", array($val));
みたいな。

で、自分はテーブル名も入れたかったので、こうやった。
$conn->Execute("SELECT * FROM ? WHERE COND=?", array($table, $val));
まあ、テーブル名を追加しただけなんだけど、これが上手く動かない。
エラーメッセージには文法的に違うとしか出てこなくて、途方にくれた。

みんな、出来ているようなのになぜ?ということで、休みの日を使って調べてみた。
で、結局分かったのが、こんなSQLを発行されていた。
"SELECT * FROM 'tablename' WHERE COND='1'";
ここで、tablenameを"'"で囲っていることが気になり、それを外してみるとビンゴ!

以前、ADOdbを調べた時にデータベースのソフトによって、何で囲うかは判別していたような気がしたので、今回はもっと深いところまで追ってみた。
まず囲う文字のことを「識別子引用符文字」ということ。
なげえ。

で、一応qstr()って囲ってくれる関数はあるんだけど、それはMySQL独自の文字で囲うってよりもカラムの値を囲む為のもので、テーブル名とかまでは考慮していない模様。
テーブル名とかそういうのは、nameQuoteって値に入っているみたいだけど、それで囲ってくれるような関数は用意されていないっぽい。
(内部ではあるみたいだけど、外からは参照できなかったかな)

なんで直接その値を参照すれば良い。

まあ、見栄えは悪いけど様はこういうことだ。
$conn->Execute(
    "SELECT * FROM ".$conn->nameQuote.$tablename.$conn->nameQuote.
    " WHERE ".$conn->nameQuote."COND".$conn->nameQuote."=?", array($val));

ちなみにEthnaのEthna_DB_ADOdbクラスでは、quoteIdentifier()って関数が用意されているので、楽チン。
$this->db->query(
    "SELECT * FROM ".$this->db->quoteIdentifier($tablename).
    " WHERE ".$this->db->quoteIdentifier('COND')."=?", array($val));

自分の気づく遅さが嫌になる&またまた勉強になった。
Ethnaすげえ。

ADOdbのAutoExecute()のUPDATE時のwhereの指定が変わっていた

最近はEthnaのAppObjectを使わないで、ADOdbだけでDBアクセスをまかなおうとしている。
理由としては、自分が使っているAppObjectの機能は、ADOdbでもまかなえるみたいだし、AppObject周りは今ちょうどEthna自体の方で修正されている模様なので、あまり依存したくないなってのもある。

そこでAutoExecute()という非常に便利な関数を見つけて、使ってはみたもののはまった。
ちなみにADOdbのバージョンは現時点で最新版の4.99.

日本語版のADODB Manualを見てみると、AutoExecute()の使い方は以下のように書かれている。
$record["firstname"] = "Caroline"; 
$record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith 
$insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'WHERE id = 1'); 

でも、実際にやってみるとエラーになる。
で、ソースを追ってみた。
もう大量にあるから大変なんだよなー。
そしたら、ライブラリのadodb.inc.phpファイル、1852行目辺りで以下の記述を発見
$sql = 'SELECT * FROM '.$table;  
if ($where!==FALSE) $sql .= ' WHERE '.$where;
WHEREってつけてんのかよ!
いつの間に仕様が変わったんだ?と思って、オリジナルの英語版をチェックしてみたら、
$record["firstname"] = "Caroline"; 
$record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith 
$insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1'); 
WHERE句が抜けてた・・・。

日本語版のマニュアルは、2005年からメンテナンスされてないみたいだけど本家からはリンクしてあるし、本家のドキュメントも2007年からメンテナンスしていない模様。
あと、ADOdbってあまり使われてないのだろうか?
もうphp4が使えるライブラリとかって人気ないのかな?
まだまだ、僕は使う環境があるんだけど・・・。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 3 of 9

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com