バッチのバグに困っています(「ァー」が「ゼ」に)
2009年1月28日 11時03分に書いた「ホームページ製作」の「PHPの備忘録」 ネタ
久々にまじめな技術ネタ。 最近、地方競馬の出走予定馬を取り込むプログラムをちょっといじったんですが どうも変なデータが取り込まれてしまってます。 タイトルにも書きましたけど、 「ァー」が「ゼ」に置き換わるんです。 例えば、出走馬にヤマニンゼファー(古!)がいたとしましょう。 ・・・うちのデータベースに取り込むと、 「ヤマニンゼフゼ」になってしまうんです。 原因は・・・ですね。 うちのデータベース、Webページなどは EUC-JPという文字コードを使ってます。 ま、いわばUNIXでの標準文字コードですな。 で、「ァ(ちっさいア)」の文字コードはA5A1、 「−(伸ばし棒)」の文字コードはA1BC、 「ゼ」の文字コードはA5BC。 出走馬取り込みプログラムの中で・・・ // 全角スペ削除 = preg_replace(/ /,,); ってね。 「(全角スペ)」の文字コード、A1A1。 「ァー」=A5A1A1 BC 全角スペA1A1を取っ払うと、A5BC=「ゼ」 ちなみにstr_replace()でも同じ現象が発生します。 このあたり、プログラムをいじる前は、UTF-8で動いていたので いままではうまくいってたんでしょうね。 さて。どう対処するか。 方法としては、文字コードを一旦変換するしかないんだろうな。 mb_stringがらみの関数をPHPマニュアルで調査・・・。
[コメント読む(0)]
▲上へ
スパムよけ画像を貼ってみました。
2007年6月18日 15時29分に書いた「ホームページ製作」の「PHPの備忘録」 ネタ
最近、変なコメントが多くて。
これがスパムなのか、どうなのかはわかりませんが、
スパムよけ画像をはることにしました。
JpGraph というPHP用のグラフ生成ライブラリを導入してますので
これを使って、画像を作っています。
作り方は簡単。
jpgraph_antispam.phpをインクルードします。
new AntiSpam()でインスタンスを生成します。
Strokeで画像を出力します。
以上。
require_once "jpgraph_antispam.php";
$spam = new AntiSpam();
// 生成する文字列の長さを決定する
$chars =$spam->Rand(5);
$spam->Stroke();
$charsにかかれた文字が格納されています。
入力してもらった文字が$charsと同じかどうか
判断すれば良いわけですね。
試しに使ってみたけど、
数字の7と小文字のfの区別がつかない。。。
7に横線が入ってるんだけど。。。
これが7です。
これがfです。
ちょっと微妙?
[コメント読む(0)]
▲上へ
なんだか問題がいっぱい出てきた(ある意味昨日の続き)
2007年2月1日 0時00分に書いた「ホームページ製作」の「PHPの備忘録」 ネタ
やっぱだめかなぁ。 昨日の問題、やっぱりクリアになりません。 しかもIE6でも同じ現象が発生。 JavaScriptの関数自体はやっぱり1回しか呼ばれてません。 でも、 innetHTML = '<object data="なんとか.php"></object>' だけが純粋に2回動いてるっぽい。 たぶん、<object>タグの動きなんだろうな。 この行が呼ばれる ↓ とりあえず内部処理.PHPが動く ↓ <object>タグを配置 ↓ また内部処理.PHPが動く みたいな感じ? 結局、この行がどっからどの順番で動くか?ってことに 問題がありそう。 ------ 別の問題。 おとといの記事から引用。 「ちなみに、追加したスクリプトの document.…の前の「top」は 内部処理.phpで生成されたHTMLから、さらに別パラメータなどで 表示エリアに内部処理.phpを再読み込みさせたい場合に必要です。」 IE6では動きません。 スクリプトのエラーになります。 本体ページと<object>の関係性が IEとOperaでは違うみたい。 Operaでは 本体ページ←親子→<object> なんだけど IEでは、ほぼ他人みたい。 <object>タグの中のHTMLからJavaScriptで topをつけても、自分自身(<object>タグの中のHTML)をさすみたい。 結局うまく動かない。 <object>を使うのはやっぱりあまりよろしくないか? セキュリティ絡みもめんどくさそうだし。 かといって、<iframe>は使いたくないし。 他の代替表示方法はあるだろうか?
[コメント読む(0)]
▲上へ
昨日のソースにバグあり?
2007年1月31日 0時00分に書いた「ホームページ製作」の「PHPの備忘録」 ネタ
Opera7.23のバグなのか、ソースのバグなのか まだはっきりわかりません。 追加したスクリプト中の <object>タグの中の内部処理.php?パラメータが なぜか2回呼ばれてる。 なぜ? JavaScript内にデバッグを入れてみても この関数が2回呼ばれてるわけではないみたい。 純粋にこの<object>が2回呼ばれてる?っぽい。 しかも、1回しか呼ばれないときもある。 タイミングによって、2回呼ばれるときもある。 というか、2回呼ばれることのほうが多い。 原因も対応策も未定。
[コメント読む(0)]
▲上へ
Ajax非対応ブラウザでもページ遷移なしにサーバからデータを取得する。
2007年1月30日 0時00分に書いた「ホームページ製作」の「PHPの備忘録」 ネタ
タイトル長いな。 新ページはAjax満載です。 で、「チームゴルゴ」という変な集団(笑)に モニタをお願いしてました。 Mac使いのT氏より、いくつかのブラウザでの動作を確認していただいたところ、 やっぱり出た。MacIE、Ajax完全非対応! ということで、いろいろと対策を考えました。 備忘録。 ------ if ( window.ActiveXObject ) {// for IE xmlhttp = new ActiveXObject ("Microsoft.XMLHTTP"); } else if ( window.XMLHttpRequest ) {// for Firefox, Opera xmlhttp = new XMLHttpRequest(); } //(1) if (xmlhttp) { xmlhttp.onreadystatechange = OKだったときの関数; xmlhttp.open('GET', '内部処理.php?パラメータ', true); xmlhttp.send(null); } function OKだったときの関数() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById("表示エリア名").innerHTML = xmlhttp.responseText; } } まあ基本はこんな感じですわ。 最近ではMicrosoft.XMLHTTP2だの3だのってあるみたいですけどね。 で、Ajax非対応(=XMLHttpRequest非対応)のブラウザの場合、 (1)の時点で xmlhttpには何も入らないわけです。 もうちょっと言うと、一番先頭で xmlhttp=null としておくと、(1)では xmlhttp=null のままなわけで、(1)すぐ下のif文は通らない、ということになります。 要は、Ajax非対応のブラウザ向けに else を追加すればいいだけの話。 ------ 呼び出し元のページは <div id="表示エリア名"> <input type="button" onclick="上のJava Script()"> </div> となっていて、 Ajax対応ブラウザの場合は、表示エリア内に xmlhttp.responseTextが出力される、と。 じゃあAjax非対応(xmlhttp=null)ブラウザだったら? OKだったときの関数へは行かないので、何も表示されない。 ということで、xmlhttp=nullの場合は、 そこに内部処理ページを埋め込んでしまえばよい、ということになるのです。 ------ 追加したスクリプト。 } else { top.document.getElementById("表示エリア名").innerHTML = '<object type="text/html" data="内部処理.php?パラメータ" style="スタイル" standby="読み込み中..."></object>'; } という感じ。 ------ 一応、Opera7.23での動作確認はしてみましたが、 動きとしてはAjaxと遜色ないと思います。 あとは内部処理ページでどこまでHTMLを組み込むか? ってこともありますが。 (Ajaxで呼ばれても、OBJECTタグ埋め込みで呼ばれても、 動きが変わらないようにうまいこと作りこむ必要があるってことです) ------ でも、どちらにしろ、 ブラウザのJavaScriptがOFFになっていたら もちろん動作しません。 その対応は別途必要です。 ちなみに、追加したスクリプトの document.…の前の「top」は 内部処理.phpで生成されたHTMLから、さらに別パラメータなどで 表示エリアに内部処理.phpを再読み込みさせたい場合に必要です。 まあ「parent」でも動くとは思うけど。
[コメント読む(0)]
▲上へ