• ベストアンサー

PHP? MySQL? どちらが原因の文字化けか

ディレクトリの登録ページと、そのディレクトリを表示してリンク先を表示させるページを作成しました。 さっそく \\コンピュータ名\ディレクトリ名\ファイル名.doc のようなディレクトリを登録してみたところ、 画面上では \\\\コンピュータ名\\ディレクトリ名\\ファイル名.doc と文字が変わってでてしまいリンクできません。 またDBを確認したところ、DBには \\\\コンピュータ名\\ディレクトリ名\\ファイル名.doc となっていて、\マークが余分についてしまっています。 ページの文字コードはSJIS、DBはUTF8で、照合はutf8_unicode_ciになっています。 原因切り分け、回避策を教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tk_uc
  • ベストアンサー率68% (33/48)
回答No.4

# DB登録前に\を/に変換する $str = '\\コンピュータ名\ディレクトリ名\ファイル名.doc'; $conv = mysql_real_escape_string(str_replace('\\', '/', $str)); # DBから取り出した後、/を\に変換する $str = '//コンピュータ名/ディレクトリ名/ファイル名.doc'; $conv = stripslashes(str_replace('/', '\\', $str)); 未テストですが、こんな感じでいけるんじゃないでしょうか。

getamato
質問者

お礼

ありがとうございました。 やりたい事ができました!! やる事は山積みなのでまた質問を書くと思います。 その時はまたよろしくお願いします!!

その他の回答 (4)

  • tecinfo
  • ベストアンサー率52% (32/61)
回答No.5

自分も先日同じような現象に悩まされました。 目的のクエリの実行前にPHPで mysql_query("SET NAMES binary"); を一度掛けることで解決しました。 PATHに以下の文字を含む時も注意が必要かもしれません。 http://www5f.biglobe.ne.jp/~fuku-labo/library/program/2-004.htm

参考URL:
http://oss.poyo.jp/pipermail/centos-users/2005-November/000156.html
getamato
質問者

お礼

ありがとうございます。 mysql_query("SET NAMES sjis"); を今書いていたので、追加してみましたが×、 置き換えてみたら¥の変換はOKだけど、他の文字が ×でした。 でも、binaryなら大丈夫なんですね! 勉強になりました。 やっぱり同様の現象はあるものなんですね・・・。 いざその時にならないと気がつかない事だけに悩みます。 情報ありがたく使わせていただきます!!

  • tk_uc
  • ベストアンサー率68% (33/48)
回答No.3

> DBからデータ取得するときに、なんで「\(半角)」が「\(大文字)」に変換されるかわかりません。 少し調べただけですが、結構根が深そうな感じですね。 単純な解決としては、「\」をすべて他の文字(「/」とか)にリプレースしてからDBに登録し、DBから取り出すときに「\」に戻すとかでどうでしょう。

getamato
質問者

お礼

ありがとうございます。 まさか変換にミスがあるとは思いませんでした。 文字へのリプレース、戻しのやり方、書き方に ついてご迷惑じゃなければ教えていただけないでしょうか。 手持ちの辞書を見ていてもいまひとつ方法がわからず。 よろしくお願いします。

  • tk_uc
  • ベストアンサー率68% (33/48)
回答No.2

> ¥が余計につくのは、UPDATE時にmysql_real_escape_stringを付けていた > のをはずしたらなくなりました・・・が、関係あるんでしょうか? mysql_real_escape_stringはまさにバックスラッシュ(日本語フォントでは円マーク)を付加する関数だと思います。 > またこれをはずすとコード実行されたりセキュリティ落ちますか? どのようなプログラムかによるでしょうけど、はずすとSQLインジェクションなどの危険が増す可能性がありますね。 mysql_real_escape_stringははずさずに、DBから取り出した後に、stripslashesあたりでバックスラッシュを取り除けば良いのではないでしょうか。 > DBからデータ取得するときに、なんで「\(半角)」が「\(大文字)」に変換されるかわかりません。 これについては、以下のURLが手がかりになるかもしれません。 http://oss.timedia.co.jp/show/MySQL%c6%fc%cb%dc%b8%ec%a4%ce%ce%b9/%a5%d0%a5%c3%a5%af%a5%b9%a5%e9%a5%c3%a5%b7%a5%e5(%5c%2c5C)%a4%ac%ca%b8%bb%fa%b2%bd%a4%b1%a4%b9%a4%eb(%c2%b3%a1%b9%ca%d4)

  • tk_uc
  • ベストアンサー率68% (33/48)
回答No.1

php.iniでmagic_quotes_gpcがonになっているのでは?

getamato
質問者

お礼

ありがとうございます。 ¥が余計につくのは、UPDATE時にmysql_real_escape_stringを付けていたのをはずしたらなくなりました・・・が、関係あるんでしょうか? またこれをはずすとコード実行されたりセキュリティ落ちますか? DBからデータ取得するときに、なんで「\(半角)」が「\(大文字)」に変換されるかわかりません。 ご存知でしょうか?

関連するQ&A