
CakePHPを使用してWebシステムを開発しております。
入力文字に\マークが入っている場合、\マークがエスケープされてDBに入ってしまいます。(\マークのみの場合は、\マーク部分が消えてしまいます。)
対応として以下の方法を考えました。ユーザの利便性と実装が簡単ため1を採用しようと考えていますが、妥当がご意見を頂きたく。
1. save前に「\」を「\\」に置換することで、「\」で保存される。
2. save前に「\」をバックスラッシュに置換して保存。表示はバックスラッシュになるが、コピペで\マークになる。
3. save前に「\」を「¥」に置換して保存。表示の際に「¥」を「\」に置換。
また、\マーク入力はよくあるケースだと思うのですが、スタンダードな方法がありましたらご教授して頂きたく。
以上、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
CakePHPは利用していないので詳しくはわかりませんが
きちんとプレペアドステートメントでDBに投入していれば置換は必要ありません。
むしろ置換は戻す際に想定外の動きをする可能性もありお勧めできません
皆さま多方面からのご回答ありがとうございました。
原因は、$this->updataAll()を使っていたため、\がエスケープされずにそのままsqlが発行されたことでした。$this->save()を使うことでエスケープされた形でsqlが発行され問題は解決しました。
一番最初に回答をくださった方をベストアンサーに選びました。
No.5
- 回答日時:
多分バージョンが古いせいで以下の機能が有効になっているのでしょう。
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
No.4
- 回答日時:
PHPのバージョンはいくつでしょうか。
5.3以下で,マジッククオートを有効にしている,とかいうことはありませんか。
そうであるなら,マジッククオートを無効にして影響を調査・修正し,
さらにPHPのバージョンを5.5にあげて影響を調査・修正することをお薦めします。
# マジッククオートでおきる問題とは若干違う気もしますが (\が消えるあたり)。
No.3
- 回答日時:
ここで言われているバックスラッシュはasciiのバックスラッシュ(0x5c)でしょうか?だとしてらバックスラッシュで表示されるか円マークで表示されるかはフォント依存です(バイナリとしては完全に同一)。
∴ 何か勘違いされていませんかねぇ・・・
>\マーク入力はよくあるケースだと思うのですが、スタンダードな方法がありましたら
自前で何か置換するようなことはしません(してはいけません)。格納するときには(一般的には)プレースホルダ(プリペアドステートメント)を使うので、何も意識しなくていいです。
#「\マークがエスケープされてDBに入ってしまいます」ということであれば、
#キチンとプレースホルダを使っていないのでしょう。
なおネイティブなMySQL関数であれば、mysql_real_escape_stringという関数でエスケープします(これ以外のエスケープを使ってはいけません)が、【すでに非推奨】なので今さら覚える必要はありません。PDOなどで書くようにしましょう。
格納は「そのまま」が基本です(エスケープはプレースホルダを使ってシステムに任せます)。気を遣うべきなのは、あとでhtmlの一部として表示するときに(表示する直前で)htmlspecialcharsを通すくらいでしょうか・・・
No.2
- 回答日時:
いわゆる「HTML特殊文字のエスケープ処理」と言う事になりますが。
ぶっちゃっけ格納したデータを、その後どう使うかによります。・値 →数値以外を除去し、最終書き出し時に「¥」を付加。
・文字列 →HTMLとして表示するのなら「¥」或いは「¥」へ変換し格納。
~以上のように最終的な使い道で、事前にデータを編集修正して保存して置くのが、その後の使い勝手も良くなるので。これは他の特殊文字、例えば ” ’ < > 等の時も同様です。
P.S.
PHPカテゴリなので書き出しはHTML準拠で考えますが。何か他の用途として使うために、純粋なテキストに書き出す必要があるのなら。やはり無難に「特殊文字は全て一律に全角へ変換」が一般的な解でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Mac OS Macのショートカットの省略形 2 2023/01/26 03:22
- Excel(エクセル) スプレットシートの関数 3 2023/04/07 11:49
- Excel(エクセル) 条件付き書式の設定方法を教えて下さい。 2 2023/04/14 18:12
- Excel(エクセル) countif関数について質問 4 2022/06/14 12:11
- PDF I LOVE PDF利用 pdfからWordに変換について 回答お願いいたします。 無料のI LOV 1 2022/05/13 13:24
- Access(アクセス) capeofdragonと申します。 Access2016を使っております。 あるフォームがあり、テ 2 2022/09/09 13:18
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- その他(クラウドサービス・オンラインストレージ) OneDrive同期が完了しない。(windows10) 4 2023/04/06 02:27
- 書道・茶道・華道 小判形記念メダルについてお尋ねします。 1 2023/07/22 10:01
- Wi-Fi・無線LAN 「以前のセキュリティ標準」だと、どんなリスクがありますか? 4 2023/07/01 13:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mcryptで英数字(12未満)のみに...
-
nl2brが効かないのですが・・・
-
PHPの¥
-
【PHP】preg_replace() で正...
-
ダブルコーテーション(
-
入力文字に\\マークが入ってい...
-
独自タグに囲まれた文字列の変換
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
Excel関数「COUNTIF」で”文字”...
-
改行を読み飛ばす
-
検索エンジンにみつかりたくな...
-
マルチバイトの文字列の検索方法
-
全角括弧と全角読点の間隔を狭...
-
文字化け変換方法
-
コンボボックスの項目中に改行を
-
改行について
-
itextで改行するには
-
C++で空Enterの入力を判...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
文字列の置換をCStringで(C++)
-
文字列の括弧について(初心者)
-
c# string型の変数に、ダブルク...
-
○分から○時間○分に変換
-
VBSで"をエスケープする文字は?
-
入力文字に\\マークが入ってい...
-
マクロ関数 #define の効果は何...
-
mcryptで英数字(12未満)のみに...
-
正規表現
-
VB.NET 文字コード
-
PHPでCSVを出力する際のセルに...
-
ヒットする初回のみ置換する方法
-
PHPでjavascriptを書き出すとき...
-
文字列のアスタリスク置換
-
正規表現について
-
php 正規表現で、\\マークを取...
-
PHP VS Java (パフォーマン...
-
sedでの最短一致の書き方
-
上手い置換方法は?
おすすめ情報