• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQLとPHPの組み合わせ。検索できない?)

MySQLとPHPの組み合わせで検索できない原因は何か?

このQ&Aのポイント
  • MySQLとPHPを組み合わせて掲示板を作成していますが、あるユーザーの書き込みだけが検索できない状態です。
  • 文字コードの問題やメールアドレスの文字化けは確認済みであり、再現も困難です。
  • ユーザーがiPhoneを使用していることに関連性があるかもしれませんが、具体的な原因は分かりません。

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

前回の質問では「メッセージだけセッションに入れていた」ということなのですよね。名前やメールもセッションに入れていたのならまだ気づきやすかったでしょうに。衝撃的なつくりに感じました…。 それをふまえての今回の問題だと、また作りの問題で不可解な現象が起きている可能性が高いのではないかと思います。 なのでこれも、決め付け・思い込みは排除して事実の確認をしましょう。ヒットするしないというのはPHPで2つの文字列を比較しif文で判断しているのですかね。もしそうなら、ログ形式で日時と記事IDか何かと、文字列Aと文字列Bとその比較結果をファイルに書き込むようにしてみてください。SQLで検索してレコード件数が0なら…みたいなロジックでも同じように、検索時の条件のメールアドレスと検索結果を記録するようにしましょう。 それをすれば、文字列Aと文字列Bが違うと判断されヒットしないのか、もしくはヒットした後ではじく処理ではじきもれているのかなど切り分けが出来るでしょう。 動作確認をしていませんがこんな感じの関数を作って。 function logging($id, $strA, $strB) {   $datetime = date("Y/m/d H:i:s T (P)", time());   $client_ip = $_SERVER["REMOTE_ADDR"];   $result = ($strA == $strB);   $msg = "[{$datetime}] [{$client_ip}] [${id}] [${strA}] [${strB}] [${result}]\n";   error_log($msg, 3, REQUEST_LOG); }

noname#235729
質問者

お礼

 if文ではなく、MySQLのクエリの中でヒットするレコードをカウントして1以上ならという形ですね。  恥ずかしながら、PHP、MySQLともに勉強を始めて半年ほどでして、pringlezさんから提示していただけるような確認のための関数などの知識が決定的に欠落しています(^_^;  それ以前に作り始めた時と今現在での知識の差も影響していまして、今ソースを読み返すとなんでこんな作りにしたのか自分でも疑問に思うほどカオスな状態になっていて、もうどこで何をしているのかが分からない状況です。  ですので、結局最初から作り直すことにしました(^_^;  せっかくアドバイスいただいたのに何だか申し訳ありません。  教えていただいた関数などは今後の参考とさせていただきます。  ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

なお、同一内容かどうかを確認するときには下記のようにしてみてください。ブラウザ画面での表示では同じに見えても、これが異なっていれば「違う文字列」です。 // $str に格納されているとして $arr = array(); for ($i=0; $i < strlen($str); $i++) { $arr[] = sprintf('%02x', ord(substr($str, $i, 1))); } print implode(':', $arr) . '<br>';

noname#235729
質問者

お礼

ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>まったく同じメールアドレスで、 バイナリで1バイトも相違がないことを確認されていますか? 「画面に表示したら同じように見える」というだけであれば、前後の空白が残っている(trimせずに格納したり比較している)とか何らかの非可視コードが混入している可能性を排除出来ません(htmlソース上では改行とかタブとかも非可視コードになりますしね)。

noname#235729
質問者

お礼

 trimは使ってないんですが、一応どこかの関数で空白削除する機能を盛り込んでるらしく、半角全角ともに空白はついていませんでした。  ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHP+MySQL エンコード

    文字コードについて教えて下さい。 データベースMySQL の文字セット: UTF-8 Unicode (utf8)に固定。 htmlはSIFT-JISで表示。 フォームで受けとったデータをPHPからDBに書き込む場合 i18n_convert($data,"UTF-8", "SJIS"); をして書き込めば問題ないでしょうか? DBがEUCの場合は問題なかったのですが、UTF-8は初めて 扱うため、文字化けの不安があります。 いまいち、文字コード(バイト数の違いなど)が理解できておりません。 ご教授お願い致します。

    • 締切済み
    • PHP
  • MySQLで半角濁音文字の検索

    宜しくお願い致します。 MySQLのselect検索時にフリーワード検索をしています。 DB上には半角・全角文字が混在しており、検索窓に入力した文字の全角・半角を区別せずに検索しております。 文字コードがUTF-8なので、SQL文のwhere区で「collate utf8_unicode_ci」を指定して全角・半角の区別無しで検索しております。 しかし、半角濁音文字、たとえば「ベルト」や「パワー」等の文字列がDB上に半角カタカナで入っている場合に検索窓に全角で入力しても検索できません。 原因はDB上では半角の「ヘ」と「濁音記号」として認識しており、検索窓に入れた文字列は、そのまま「ベ」という1文字として認識しているので検索できないと思われます。 この問題を解決する方法が無くて悩んでおります。 どなたかご教授の程、宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLでinsertできない原因は?

     PHPとMySQLでちょっとした掲示板とメールフォームを作って使ってもらってます。  メールフォームを使ったメッセージをMySQLのデータベースに記録するように作ってるんですが、たまにメッセージだけが記録されてないことがあります。名前とかメールアドレスとかのカラムは記録されてるんですが。  フォームはUTF8で表示されるようにしていて、特に文字コードの変換をすることなくそのままinsertしてるので、最初は文字コードの関係かなと思ったんですが、Androidだったり、iOSだったりするし、JISでもUTFでもなさそうなのでで、いまいち特定できず。  そもそも、文字コードが合わなくても、文字化けした状態で記録されますよね?  こういった場合、何が原因と考えられるでしょうか?  ちなみにMySQLの方は「utf8_general_ci」で設定しています。

    • ベストアンサー
    • MySQL
  • mysql

    疑問があります。mysqlサーバーとmysqlクライアントとはなんですか? mysqlクライアントとはmysqlに接続するroot以外のユーザーのことを指すのでしょうか?サーバーはそのまんまサーバーのことですよね?? それと文字化け対策にmy.iniに skip-character-set-client-handshake と記述して解決できたのですが、これはサーバー側の文字コードをutf-8に設定しておけば、データベースの登録・参照などを必要として接続してくるユーザーの文字コードを無視してutf-8にしちゃうよっていうことなのでしょうか?

  • PHPでの文字列置換について

    こんにちは PHPにて丸カッコ内の文字列を取得しようとしています。 対象の文字列は、「坂(さか)」という文字列の全角丸カッコ「()」内になります。 正規表現でやればすぐに取得できるのかもしれませんが、正規表現の知識が無いため 力ずくでやってみようとしました。 そこで、「(」で文字列の位置を取得して…と考えて色々やったのですが、 この全角丸カッコ「(」が、mb_strposでも位置を検知できず、 全角丸カッコ「(」を半角にして対応してみようかとmb_ereg_replace('(','(','坂倉武史(さかくらたけし)');としようとしても、変換されず困っております。 ちなみに「坂(さか)」という文字列は、 ネット上のあるHTMLから、file_get_contentsでURLを指定してから 取得して、その文字コードがEUC-JPなので、 mb_convert_encoding($dataXML, "UTF-8", "EUC-JP"); で、UTF-8に変更しております。 文字コードの問題のかもしれませんが、答えがみつかりません。 1。正規表現で取得できるのであれば、正規表現の書き方をお教えいただけますでしょうか。 2。正規表現が難しいのであれば、力ずくでやるのでこの「(」全角丸カッコの始まりの検知方法をお教えいただけますでしょうか。 PHPの実行環境は、 PHP5.3 mbstring.language  japanese mbstring.internal_encoding  UTF-8 mbstring.encoding_translation  ON default_charset  UTF-8 UNIX 文字コード UTF-8 ソース文字コード UTF-8 です どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP->MySQLに漢字データが渡らない

    Fedora11の自家サーバー&「ウェブDYIで行こう!たのしいPHP入門」という書籍で、PHPのお勉強をしています。下記のコードで「佐藤」という漢字データがMySQLに渡りません。satoに変更すると、問題なく渡ります。MySQLの文字コードはUTF-8に設定しています。(全てUTF-8で統一しているつもり)文字化けではなく、print_r($result);のところで、nameフィールドは何も表示されません。htmlソースを見ても、何も存在していない様に見えます。 (注)書籍のコードに、しつこい位UTF-8の記述を足してみておりますが、足す前も同様でした。 <html><body> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <pre><?php ini_set("default_charset", "UTF-8"); $dsn = "mysql:host=localhost;dbname=xxxxxx"; $user = "xxxxxx"; $password = "*******"; $db = new PDO($dsn, $user, $password); $db->exec("SET NAMES utf8"); $insert_query = "INSERT INTO users (name, email) " ."VALUES ('佐藤','sato@example.com')"; $db->exec($insert_query); $result = $db->query("SELECT * FROM users")->fetchAll(); print_r($result); ?> </body></html> 最初php.iniは初期値のままでやっていて、下記記事を参考に http://hain.jp/index.php/tech-j 次の通り設定してみましたが、事態は変わりませんでした。 output_buffering = Off ; default_charset = EUC-JP mbstring.language = Japanese mbstring.encoding_translation = off mbstring.http_input = pass mbstring.http_output = pass mbstring.internal_encoding = UTF-8 mbstring.substitute_character = none mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII 原因と対策がお分かりの方がいらっしゃいましたら、御教示のほど、よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのコードをUTF-8に変換したい。

    なんとかメールフォーム設置までこぎ着けたのですが、届いたメールが文字化けしてしまいます。HTMLの文字コードがUTF-8、PHPの文字コードがshift-jisなので原因はそこだと考えたのですがPHP内のshift-jis表記をUTF-8に変えるとPHP内で文字化けが起こってしまいます。 MultiTextConverterなどのアプリケーションを使っても同様の文字化けが起こります。 どうすればいいのか分かりません。 よろしくお願いします。

    • 締切済み
    • PHP
  • phpからMySQLへの日本語文字化けについて

    phpからMySQLへの日本語文字化けについて こんにちは。お分かりの方は教えてください。 現在、「ハッスルサーバー」を利用しwebのphpからMySQLサーバーへの 情報登録画面を作成しています。 登録内容で数値やメールアドレスなどの「1バイト文字」ですと 問題ないのですが、日本語の「2バイト文字」ですと文字化けが 発生してしまいます。 phpやMySQLに知識が無いため色々と調べて試したのですが 正しく登録できませんでした。 試した結果とサーバー/DBの状況は以下の通りです。 ※サーバー/DB ・バージョン:5.0.90-log ・文字セット:UTF-8 Unicode (utf8) ・接続照合順序:utf8_general_ci ・種別:MyISAM ・Variable_name:Value ・character_set_client:utf8 ・character_set_connection:utf8 ・character_set_database:utf8 ・character_set_filesystem:binary ・character_set_results:utf8 ・character_set_server:utf8 ・character_set_system:utf8 ・character_sets_dir:/usr/local/share/mysql/charsets/ ※phpファイルにて試した設定 //接続 $objCon = mysql_connect(C_SERVER, C_USER, C_PASSWORD); //文字コード // mysql_query("SET NAMES SJIS"); ←文字コードを左の2パターンで // mysql_query("SET NAMES UTF8"); ←どちらかに切り替えて実行しました。 //データベース $objSecDB = mysql_select_db(C_DB_NAME); //**********SQL(Insert)**********// $strSql = ""; $strSql = $strSql . "Insert Into XXXXX "; $strSql = $strSql . "("; $strSql = $strSql . "KeyNo,"; $strSql = $strSql . "E_Mail,"; $strSql = $strSql . "Title"; $strSql = $strSql . ") "; $strSql = $strSql . "Values "; $strSql = $strSql . "("; $strSql = $strSql . " " . mysql_real_escape_string($intKeyNo) . ", "; //KeyNo $strSql = $strSql . " " . mysql_real_escape_string($strEmail) . ", "; //E_Mail $strSql = $strSql . "'" . mysql_real_escape_string($strTitle) . "' "; //Title $strSql = $strSql . ")"; //SQL発行 $blnRet = mysql_query($strSql); ・上記のソース内に記しましたが文字コードを2パターン切り替えて  実行しましたが文字化けや空文字が登録されました。 どなたか対処方法をお分かりの方はお教えください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLの日本語入力について

    現在、MySQLをローカルではVer5.7.17、AWSのRDS内のMySQLはVer5.6.27を それぞれ使っています。 ローカルのほうでは、すんなり日本語(全角文字、半角カタカナ)が入るのですが、 RDSのほうではなぜか、全角文字、半角カタカナを入力しようとすると、 から文字になってしまい、何も入ってないし、NULLでもない状態になります。 ちなみに文字コードはどちらとも、UTF-8です。 よろしくお願いします。

  • mysqlの文字化けについて

    さくらサーバーのプレミアムプランで、MYSQLが文字化けを起こして困っています。 MYSQL5.1、データベースの文字コードはUTF8です。 UTF8でエンコードされたPHPプログラムからデータをINSERTすると文字化けを起こします。 ハッスルサーバーで同じ環境を再現すると、文字化けは起こしません。 違いは、ハッスルサーバーでは、「character_set_server utf8」になっているのに対して、 さくらサーバーでは、「character_set_server ujis 」となっています。 この、ujisをutf8に変更すれば解決しそうに思うのですが、変更の仕方がわかりません。 アドバイス頂けましたら、幸いです。