カゴヤインターネットルーティングというレンタルサーバーを借りております。
PHPは携帯のサイトのためどうしてもsjisで書かないといけません。
mysqlはeucです。
ソとか能などよくある文字化けをおこすので
addslashes()関数をつかって
$str='ソフト';
$com = addslashes($str);
としてinsertします。
登録・表示は問題ないのですが、どうしても検索ができません。
$com= 'ソフト';
SELECT * FROM item where item_name like '%$com%'
とするとどうしても検索できません。
http://sb.xrea.com/archive/index.php/t-4070.html
にも同様のことが書かれていましたが、
$str = mb_convert_encoding($str, "EUC-JP", "SJIS");
のように変換してもうまくいきませんでした。
まことにお手数おかけしますが、ご教授お願いします。
No.5ベストアンサー
- 回答日時:
#ANo.2です。
このままDBのデータを変換しないままは何だかとても面倒になりそうで気が進みませんが、¥の変換は以下の様にできます。
(ただし、addslashes()を2回行って「ソ\\\フト」ではダメでしたか?)
$a = addslashes('ソフト');
$a = str_replace_safe("\\", "\\\\", $a);
// 安全なコードに変換して文字列を変換
function str_replace_safe(// (R) dest string
$rep1,// (I) src replace
$rep2,// (I) dest replace
$str)// (I) src string
{
$rep1 = mb_convert_encoding($rep1, 'UTF-8', 'SJIS');
$rep2 = mb_convert_encoding($rep2, 'UTF-8', 'SJIS');
$str = mb_convert_encoding($str, 'UTF-8', 'SJIS');
$str = str_replace($rep1, $rep2, $str);
return mb_convert_encoding($str, 'SJIS', 'UTF-8');
}
なんどもお付き合いいただきまことにありがとうございます。
一つ前のご回答をヒントにいろいろ書籍などしらべていくと
$joken = addslashes($joken);
$joken =preg_quote($joken);
SELECT * FROM sample where sample like '%$joken%'
とすることでなんとか検索できました。
しかしながらこれでいいのかどうかははっきりしておりません。
No.6
- 回答日時:
文字エンコードは決めたものに統一した方が良いですね。
DBがEUCと言う事なら、PHPもEUCの方が楽だと思います。私の場合、全てEUCで書いておいて、最後に
echo mb_convert_encoding($htmlstr,"SJIS","EUC-JP");
として出力する場合が多いです。設定が悪いからかどうか分かりませんが、mb_http_outputや環境設定のmbstring.http_outputだけだとどうも頼りない感じですね。また、内部文字エンコーディングmb_internal_encodingも明示的に設定しておいた方が文字化けが少ない気がしています。
参考まで。
ご教授ありがとうございます。
じつは今回のスクリプトはもともと他の人が作成したもので、それを私が諸事情でカスタマイズする必要があったのです。
そのためいちから作り直すことができず、EUCで統一ということができなかったんです。
もともとはEUCで統一してつくる人間なのですが、今回はどうしても仕方なかったんです。
皆様のあたたかい返信まことにありがとうございました。
No.4
- 回答日時:
#ANo.2です。
>おっしゃるように $joken = addslashes($joken)として
>$sql = "select * from item where itemname like '%$joken%'";
>としてもなぜかマッチしてくれません。
¥マークは確かMySQLでエスケープ文字として使われるので、
¥→¥¥として条件文字を作成しないといけないかもしれませんね。
参考URL:http://dev.mysql.com/doc/refman/4.1/ja/string-sy …
たびたび返信をいただきありがとうございます。
おっしゃるように\\に変換するということで
$joken = addslashes($joken);
$joken = mb_ereg_replace("\\","\\\\",$joken);
のようにしてみましたところ今度はPHPエラーが出力されました。
Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: invalid regular expression; '\' can't be last character
となります。
なんか近づいているような気はするのですが。
何度も申し訳ございません。。
よろしくお願いします。
No.3
- 回答日時:
#ANo.2です。
>現在すでに入っているデータを正常に検索できる方法というのはございますでしょうか。
登録データが、addslashes() にて¥が追加された文字で入っているようですので、検索時の条件文字も $joken = addslashes($joken) で¥を追加して検索すれば、マッチはするのでは?と思います。
しかし、EUCにSJISのままで入っているようですので、このままですと、文字列でのソートなど巧く動かないケースも出てくるのではとは思います。
返信ありがとうございます。
おっしゃるように $joken = addslashes($joken)
として
$sql = "select * from item where itemname like '%$joken%'";
としてもなぜかマッチしてくれません。
echo $sql
と出力してみると
select * from item where itemname like '%ソ\フト%'
となっています。これを直接PhpMyadminなどにSQLを書いてみても
やはり抽出しません。
ちなみにソートは必要ないのでここでは問題ございません。
なにかが悪いんでしょうね・・・
No.2
- 回答日時:
DBがMySQL(EUC)でHTMLやPHPがSJISという組み合わせでよく製作します。
以下の事に注意する必要があります。
1)データの登録時(Insert)
INSERT INTO table (fld1, fld2,...) VALUES ('$data1', '$data2'...)
の $data1, $data2 を全てmb_convert_encoding($str, "EUC-JP", "SJIS"); でEUCに変換して登録する必要があります。
2)データの検索時(1)
SELECT * from table WHERE fld1 like '%$joken1%' の $joken1 等の条件なども、mb_convert_encoding($str, "EUC-JP", "SJIS");でEUCに変換して検索する必要があります。
3)データの検索時(2)
上記で検索したデータはまだEUCのままですので、検索されたデータは、mb_convert_encoding($str, "SJIS", "EUC-JP"); でSJISに変換してやる必要があります。
上記で、巧く行かないでしょうか?
さっそくの返信ありがとうございます。
おっしゃる1)2)3)の方法で行いたいのですが、すでにレコードを何千といれており今から
mb_convert_encoding($str, "EUC-JP", "SJIS");
の作業でInsertするのが困難であります。(申し訳ない)
現在すでに入っているデータを正常に検索できる方法というのはございますでしょうか。
実際、PhpMyadminでデーターをエクスポートしてみるとEUCでのSQLですが
'ソ\フト'となっています。
No.1
- 回答日時:
> HPは携帯のサイトのためどうしてもsjisで書かないといけません。
SJISで書かないといけないことはなく、SJISで書いている方が少ないかと。
内部文字コードはEUC-JPにして出力をSJISにすることができます。
(ご契約のサーバの仕様は確認していませんが)
参考URL:http://php.plus-server.net/function.mb-output-ha …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PostgreSQL PostgressからMySQL(MariaDB)へ構造を変更する際のTimestamp等について 2 2023/04/04 12:09
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- PHP PHP ページング データベース 1 2022/06/16 10:30
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を文字コードの数値に変...
-
SQL Serverで文字コードUTF-8
-
文字化け変換方法
-
SJISで取得した半角カナをUTF-8...
-
廣のjis変換で文字化け
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
文字の入力で横バー上段、中断...
-
メッセージボックスで1025文字...
-
Excel関数「COUNTIF」で”文字”...
-
ダブルコーテーション(
-
半角記号、全角記号を含む正規...
-
文の改行
-
正規表現で「0」のみ抽出
-
変数の中の改行コードをBRタグ...
-
DelphiのTMemoのテキスト末尾の...
-
fgetws関数で読み込んだUNICODE...
-
VBA テキストボックスの行数取得
-
全角半角変換 C++/CLI
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化け変換方法
-
phpのメールフォームの完了画面...
-
SQL Serverで文字コードUTF-8
-
PHPmailerでの添付ファイルの文...
-
SJISで取得した半角カナをUTF-8...
-
mb_convert_encoding で 一部の...
-
PHP cURLでPOSTした値が文字化...
-
SJIS→UTF-8変換後の文字化けに...
-
mb_ereg_replaceに関して
-
【PHP】mb_convert_encoding...
-
phpMyAdmin内での文字化け
-
mb_regex_encodingでエンコード...
-
PostgreSQLからCSV形式でエクス...
-
RSSを取得すると文字化けする。
-
postの文字化け防止について
-
UTF8メールがLotus Notesで文字...
-
小さいひらがな(っ、ょ、ぃ、ゃ...
-
phpでの文字エンコード
-
php自動返信メール本文の一部の...
-
mail()で送信したメールのタイ...
おすすめ情報