PHPの質問です。

http://php.eweb-design.com/1301_mail.html
上記URLのスクリプトを読んでいたのですが、以下の部分で何故置換をしているのか分かりませんので教えて下さい。文字化け対策とかでしょうか?

$sendm = 0;
foreach($_POST as $key=>$var) {
if($var == "eweb_submit") $sendm = 1;
}
 
// 文字の置き換え
$string_from = "\";
$string_to = "ー";
 
(略)
 
foreach($_POST as $key=>$var) {
$key = strtr($key, $string_from, $string_to);
if(get_magic_quotes_gpc()) $var = stripslashes($var);
if($var == "eweb_submit") ;
else $body.="[".$key."] ".$var."\n";
}

回答の条件
  • 1人2回まで
  • 登録:2008/08/12 15:40:02
  • 終了:2008/08/12 19:50:10

回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/08/12 16:02:49

ポイント60pt

たしかに置換の目的が分かりませんね。

文字コードが定義されていないので、文字化け回避なのかどうかも分かりません。

それと、178行目の置換によって、183行目の INPUT NAME が矛盾を起こすような気もします。


直接、作者にお問い合わせになってはいかがでしょうか。

id:Lhankor_Mhy

あー、すみません。文字コードはs-jisでした。

2008/08/12 16:04:16
id:tukihatu No.2

牛乳先生(tukihatu)回答回数180ベストアンサー獲得回数322008/08/12 17:50:55

ポイント60pt

stripslashesが怪しいですね。

Ver. 9.20:「ー」が「\」になるバグを修正(2004/09/16)

と書いてありました。

おそらくそれ用の対応なんだと思いますが、普通はこんなの無いですよね。

なんで「ー」が「\」になるか、と考えると、stripslashesによって文字コードが変わってしまっている可能性を思いつきます。

…でも「ー」の文字コードは特におかしいコードではないんですが…バグる要素が見当たらないですね。

ためしにこの一文を外してテストしてみてはどうでしょう。

5C文字+「ー」とするとバグりやすいので、例えばソース、とか。

http://www5f.biglobe.ne.jp/~mugefan/mojibake.html#mojibake_list_...

id:Lhankor_Mhy

な、なんつー場当たりバグフィクス……。

こんなレベルでスクリプト公開していいのか、そうなのか…。

 

ちなみに、このスクリプトでEUCで動かすと、0xC0**の文字がすべて0xBC**に置換されるという素敵な結果でした。「\」0xA1C0から「ー」0xA1BCにシングルバイトで置換してるからでしょうかね。大丈夫かな、このスクリプト。

2008/08/12 18:15:36
id:valid No.3

valid回答回数7ベストアンサー獲得回数12008/08/12 16:11:52

ポイント60pt

>Ver. 9.20:「ー」が「\」になるバグを修正(2004/09/16)

これの修正じゃないですか?

  • id:kn1967
    >文字コードが定義されていないので、文字化け回避なのかどうかも分かりません。

    否!!!
    文字コードはphpファイルの先頭行を見れば書いてある事が判るはず。

    長音が文字化けすることは意外と有名だから文字コードを聞く必要はないし
    知らなかったのだとしても
    http://php.eweb-design.com/1301_mail.html には
    バージョン9.20で文字化け対策を行った事も書いてあるので
    http://php.eweb-design.com/script/mail_0091.zip と
    http://php.eweb-design.com/script/mail_0092.zip を
    それぞれダウンロードして見比べれば文字化け対策であることは直に気付くはず。

    現時点で未オープンのお二方の内容は判りませんが
    自分に取っても未知の部分に関しては
    もう少し調べるなり、他の回答を待つようにしませんか? > pahoo氏
  • id:pahoo
    > kn1967さん
    質問にある "sendmail.php" では「/」(全角バックスラッシュ)を「ー」(全角長音)に置換しています。
    ご指摘の「ー」に関わる文字化け対策なら、この逆の置換を行うべきではないでしょうか?

    また、"sendmail.php" の冒頭行では Content-Type で Shift-JIS を示しているだけで、
    PHPの内部処理(php.ini または mb_internal_encodingによる指定)として SJIS になっているのかどうか
    分からないのです。

    そこで、#1のように回答した次第です。
    tukihatu さんが回答しているように stripslashes のバグ対応でしたら、何となく分かるような気がするのですが、
    もしオリジナルの name 属性に「/」が含まれていたとすると、強制的に「ー」に置換されてしまうので、
    いささか具合が悪いのではないかという気がします。
  • id:kn1967
    「何故置換をしているのか分かりません」という質問なので

    「ーが\に化けてしまうのでstrtrで強制的に元に戻している」つまりは「文字化け対策」
    「\」に化けるとするとphp.iniではUTFになっているはず。

    というだけの回答でも良いかもしれませんが
    場当たり的な対処で書いてあるだけということも書いておくほうが良いでしょうね。

    ただ、
    場当たり的であることは既に確認しておられますので「現時点」ではそれすらも不要でしょう。
    追記するとすれば「EUC版のソースコードを読んでみてね♪」くらいでしょうか・・・。
    思わず笑ってしまうと思いますよ。
  • id:tukihatu
    >こんなレベルでスクリプト公開していいのか、そうなのか…。
    Ver0.96なので、まあベータ版なんでしょう。きっと。

    >0xC0**の文字がすべて0xBC**に
    0x**C0の文字がすべて0x**BCに、もですね。
    誓→室に文字化けしそうですね…

    とするとstripslashesはちょっとハズレっぽいですね。スイマセン。
    内部処理を SJISにすればOKみたいですね。

    http://ash.jp/code/codetbl2.htm
  • id:valid
    回答実績が無いからなのでしょうか?
    順番に回答開けてもらえないのがちょっと悲しい。(・ω・)
  • id:Lhankor_Mhy
    >kn1967さん
     
    >追記するとすれば「EUC版のソースコードを読んでみてね♪」くらいでしょうか・・・。
    >思わず笑ってしまうと思いますよ。
     
    無駄なコードがwなんだこりゃw
     
    >「ーが\に化けてしまうのでstrtrで強制的に元に戻している」つまりは「文字化け対策」
    >「\」に化けるとするとphp.iniではUTFになっているはず。
     
    その辺の仕組みが今ひとつ……。もう少し勉強してみます。PHPはいろんな意味で怖いという事が良く分かりました。
  • id:Lhankor_Mhy
    >validさん
     
    すみません、SPAM回答者にうんざりさせられた事があったので、慎重になってるんです。
    ご回答ありがとうございました。
  • id:valid
    >Lhankor_Mhyさん

    なるほどSPAMですか。
    回答開けて頂いてありがとうございました。
  • id:kn1967
    SPAM回答者は多いけど均等配分ってのもどうかと思いますね。

    今回の場合であれば結果的に有益になったのは
    テストするきっかけを作ってくれたtukihatu氏ですよね?

    他のうちで、お一人はコードは見てくれたけれど
    それ以上の部分を想像出来ていなかった方が次点。
    (行動は早いのだけれども経験値がもう少しかな・・・)

    コードすら見ていないかもしれないのは・・・。
    (想像力豊かなのかな・・・でも、それだけじゃ見ている側からは・・・。)

    理由はそれぞれにあると思いますが
    結果に対して配分を変えるようにしておかないと
    均等配分を見込んで今後もスパム的な回答が減る事はないと思います。

    180ポイントを割り振るとすれば私なら
    多いほうから120 50 10ってところかな・・・
  • id:kotae
    >SPAM回答者は多いけど均等配分ってのもどうかと思いますね。


    やけに回答者がコードを読んで回答したかで配分を決めるべきという意見みたいだけど、私は違う見方をしてるよ。
    この質問は解決の糸口を見つけるためにそもそもコードを読む必要すら無い質問だった訳でしょう?
    質問に挙げてあるURLの中に答えが書いてある訳だからね。
    ソフトの人はコードを読んで云々と話をしがちだけどドキュメントを読まないというのはいただけない話で質問者と1番目の回答者はドキュメントを読んでなかった訳だ。
    ソフトに訳のわからんコードが埋め込まれている時はそれは何か仕様に関係していてそれは仕様に書かれていると思うのがエンジニアの考え方なんだけどね。そしてバージョンアップの履歴というのも大切な仕様な訳。それを読まずにコードを追っかけても時間の無駄ってことだよね。
    事実、1番目の回答者は原因をポイントできずに作者に問い合わせては?なんて回答していて、2番目の回答者はその10分後に原因をコードを多分読むことなしにポイントしてるでしょ。「想像力豊かなのかな・・・」なんて言ってるけどやるべきことをやるべき順番で見ていけば質問を見て数分で問題点をポイントできるでしょ。少なくともコードを同じページからダウンロードして解凍してコードを読み始めるまでの時間よりは早くね。
    3番目の回答者がコードを読み、かつバージョンアップに問題点の記述を見つけた回答をしたけどもそれはさらに2時間後だよね。
    質問者が2番目の回答より先に3番目の回答を開いたのは質問者の責任であって回答者の責任ではないし、3番目の回答が登録される前に2番目の回答が開けられていたら別の展開になっていただろうね。


    だから私だったら180ポイントは回答順から0 90 90と振り分けるかな。
    2番目と3番目は質問者が回答の速さを取るか内容の深さを取るかで割り振り決めればいいけど、少なくとも1番目の回答は役に立ってないから低くていいと思ったよ。
  • id:kn1967
    1の回答者は調査不足・検討不足・想像力不足・対応力不足・・・といった状態での
    回答乱発傾向にあるので厳しくしてゼロという意見も同意ではあったりしますが
    まぁ、努力点・・・って程度だったりしますw

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません