アプリ版:「スタンプのみでお礼する」機能のリリースについて

CakePHPを使用してWebシステムを開発しております。

入力文字に\マークが入っている場合、\マークがエスケープされてDBに入ってしまいます。(\マークのみの場合は、\マーク部分が消えてしまいます。)

対応として以下の方法を考えました。ユーザの利便性と実装が簡単ため1を採用しようと考えていますが、妥当がご意見を頂きたく。

1. save前に「\」を「\\」に置換することで、「\」で保存される。
2. save前に「\」をバックスラッシュに置換して保存。表示はバックスラッシュになるが、コピペで\マークになる。
3. save前に「\」を「¥」に置換して保存。表示の際に「¥」を「\」に置換。

また、\マーク入力はよくあるケースだと思うのですが、スタンダードな方法がありましたらご教授して頂きたく。

以上、よろしくお願いします。

A 回答 (5件)

CakePHPは利用していないので詳しくはわかりませんが


きちんとプレペアドステートメントでDBに投入していれば置換は必要ありません。
むしろ置換は戻す際に想定外の動きをする可能性もありお勧めできません
    • good
    • 0
この回答へのお礼

皆さま多方面からのご回答ありがとうございました。

原因は、$this->updataAll()を使っていたため、\がエスケープされずにそのままsqlが発行されたことでした。$this->save()を使うことでエスケープされた形でsqlが発行され問題は解決しました。

一番最初に回答をくださった方をベストアンサーに選びました。

お礼日時:2014/06/29 18:25

多分バージョンが古いせいで以下の機能が有効になっているのでしょう。



PHP Manual - マジッククオート
http://www.php.net/manual/ja/security.magicquote …

これを無効にすればそれだけで解決します。というか相当古いバージョンなので最新版に乗り換えましょう。もし何らかの理由で無効化も更新も出来ない場合は以下の処理を通すことで解決できます。

if (get_magic_quotes_gpc()) { $str = stripslashes($str); }

これを施したうえで…CakePHPを用いて開発しているのであれば何も「\」のことを特別扱いする必要はないはずです。CakePHPであんまりSQLべた書きとかしませんよね?自分でSQLをべた書きするにしても、PDOクラスやmysqliクラスのプレースホルダを用いている場合は同様です。

いわゆる明示的な「エスケープ」が必要になるのは、非推奨なmysql_queryなどの関数を使うときに限られます。

(参考リンク)
http://qiita.com/mpyw/items/b2a2b0e8e60ed4680f06
    • good
    • 0

PHPのバージョンはいくつでしょうか。


5.3以下で,マジッククオートを有効にしている,とかいうことはありませんか。

そうであるなら,マジッククオートを無効にして影響を調査・修正し,
さらにPHPのバージョンを5.5にあげて影響を調査・修正することをお薦めします。
# マジッククオートでおきる問題とは若干違う気もしますが (\が消えるあたり)。
    • good
    • 0

ここで言われているバックスラッシュはasciiのバックスラッシュ(0x5c)でしょうか?だとしてらバックスラッシュで表示されるか円マークで表示されるかはフォント依存です(バイナリとしては完全に同一)。



∴ 何か勘違いされていませんかねぇ・・・


>\マーク入力はよくあるケースだと思うのですが、スタンダードな方法がありましたら

自前で何か置換するようなことはしません(してはいけません)。格納するときには(一般的には)プレースホルダ(プリペアドステートメント)を使うので、何も意識しなくていいです。

#「\マークがエスケープされてDBに入ってしまいます」ということであれば、
#キチンとプレースホルダを使っていないのでしょう。

なおネイティブなMySQL関数であれば、mysql_real_escape_stringという関数でエスケープします(これ以外のエスケープを使ってはいけません)が、【すでに非推奨】なので今さら覚える必要はありません。PDOなどで書くようにしましょう。



格納は「そのまま」が基本です(エスケープはプレースホルダを使ってシステムに任せます)。気を遣うべきなのは、あとでhtmlの一部として表示するときに(表示する直前で)htmlspecialcharsを通すくらいでしょうか・・・
    • good
    • 0

いわゆる「HTML特殊文字のエスケープ処理」と言う事になりますが。

ぶっちゃっけ格納したデータを、その後どう使うかによります。

・値 →数値以外を除去し、最終書き出し時に「¥」を付加。
・文字列 →HTMLとして表示するのなら「¥」或いは「¥」へ変換し格納。

~以上のように最終的な使い道で、事前にデータを編集修正して保存して置くのが、その後の使い勝手も良くなるので。これは他の特殊文字、例えば ” ’ < > 等の時も同様です。

P.S.
PHPカテゴリなので書き出しはHTML準拠で考えますが。何か他の用途として使うために、純粋なテキストに書き出す必要があるのなら。やはり無難に「特殊文字は全て一律に全角へ変換」が一般的な解でしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!