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

カゴヤインターネットルーティングというレンタルサーバーを借りております。
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");
のように変換してもうまくいきませんでした。

まことにお手数おかけしますが、ご教授お願いします。

A 回答 (6件)

#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');
}
    • good
    • 0
この回答へのお礼

なんどもお付き合いいただきまことにありがとうございます。
一つ前のご回答をヒントにいろいろ書籍などしらべていくと
$joken = addslashes($joken);
$joken =preg_quote($joken);
SELECT * FROM sample where sample like '%$joken%'
とすることでなんとか検索できました。

しかしながらこれでいいのかどうかははっきりしておりません。

お礼日時:2007/06/14 10:48

文字エンコードは決めたものに統一した方が良いですね。

DBがEUCと言う事なら、PHPもEUCの方が楽だと思います。
私の場合、全てEUCで書いておいて、最後に
echo mb_convert_encoding($htmlstr,"SJIS","EUC-JP");
として出力する場合が多いです。設定が悪いからかどうか分かりませんが、mb_http_outputや環境設定のmbstring.http_outputだけだとどうも頼りない感じですね。また、内部文字エンコーディングmb_internal_encodingも明示的に設定しておいた方が文字化けが少ない気がしています。

参考まで。
    • good
    • 0
この回答へのお礼

ご教授ありがとうございます。
じつは今回のスクリプトはもともと他の人が作成したもので、それを私が諸事情でカスタマイズする必要があったのです。
そのためいちから作り直すことができず、EUCで統一ということができなかったんです。
もともとはEUCで統一してつくる人間なのですが、今回はどうしても仕方なかったんです。

皆様のあたたかい返信まことにありがとうございました。

お礼日時:2007/06/15 10:07

#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 …
    • good
    • 0
この回答へのお礼

たびたび返信をいただきありがとうございます。
おっしゃるように\\に変換するということで
$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
となります。
なんか近づいているような気はするのですが。
何度も申し訳ございません。。
よろしくお願いします。

お礼日時:2007/06/12 17:08

#ANo.2です。



>現在すでに入っているデータを正常に検索できる方法というのはございますでしょうか。

登録データが、addslashes() にて¥が追加された文字で入っているようですので、検索時の条件文字も $joken = addslashes($joken) で¥を追加して検索すれば、マッチはするのでは?と思います。

しかし、EUCにSJISのままで入っているようですので、このままですと、文字列でのソートなど巧く動かないケースも出てくるのではとは思います。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
おっしゃるように $joken = addslashes($joken)
として
$sql = "select * from item where itemname like '%$joken%'";
としてもなぜかマッチしてくれません。

echo $sql
と出力してみると
select * from item where itemname like '%ソ\フト%'
となっています。これを直接PhpMyadminなどにSQLを書いてみても
やはり抽出しません。

ちなみにソートは必要ないのでここでは問題ございません。
なにかが悪いんでしょうね・・・

お礼日時:2007/06/12 13:32

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に変換してやる必要があります。

上記で、巧く行かないでしょうか?
    • good
    • 0
この回答へのお礼

さっそくの返信ありがとうございます。

おっしゃる1)2)3)の方法で行いたいのですが、すでにレコードを何千といれており今から
mb_convert_encoding($str, "EUC-JP", "SJIS");
の作業でInsertするのが困難であります。(申し訳ない)
現在すでに入っているデータを正常に検索できる方法というのはございますでしょうか。
実際、PhpMyadminでデーターをエクスポートしてみるとEUCでのSQLですが
'ソ\フト'となっています。

お礼日時:2007/06/12 10:51

> HPは携帯のサイトのためどうしてもsjisで書かないといけません。


SJISで書かないといけないことはなく、SJISで書いている方が少ないかと。
内部文字コードはEUC-JPにして出力をSJISにすることができます。
(ご契約のサーバの仕様は確認していませんが)

参考URL:http://php.plus-server.net/function.mb-output-ha …
    • good
    • 0

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