• 締切済み

PHP+SQLで検索プログラム SJISでの問題

上記のとおりPHPからselect文でDBに接続し検索するプログラムを作っています。 よろしくお願いします。 MySQL、PHPともに設定ファイルを変更する権限を持っていません。 まず検索するときにフォームから値を渡すのですが Shift-JISおなじみの5c問題が出てきます。 DBに「予感」という文字データがあるとしてフォームから検索すると 「予\感」として検索してしまい正しく検索されませんでした。 stripslashes関数を使っても変化もありませんでした。 それにフォームで値を受け渡しをしているのでフォームの入力欄に残る 「予\感」もなんとかしたいですがどのタイミングでエスケープ処理をすればいいか分かりません。 ちなみに「予\感」を検索したあとまた検索していくと「\\\」「\\\\\」と¥が増えていきます。なので2回目では正しく実行されました。

  • PHP
  • 回答数1
  • ありがとう数2

みんなの回答

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.1

フォームのSJISからUTFに変更すれば良いだけでは?

rety87
質問者

お礼

どうしてもSJISで処理しなければならないので文字コードの変更は考えておりません。 フォーム部分だけUTFにして後にSJISに変換は試みたんですがうまくいかなかったので… addslashesを使うことで自己解決しました。ありがとうございました。

関連するQ&A

  • PHPでの検索機能がうまく動きません

    PHPでの検索機能が動かなくて困っています。 <form>で入力した値を、MySQLのWHEREで条件付けて取り出したいのですがうまくいきません....。 最終的に、 1、formに検索ワードを入力 2、DBから条件にあったレコードを持ってくる 3、持ってきた値を表示 という機能にしたいのですが....。 --- --- --- --- --- --- --- --- --- --- --- --- <?php //データベースに接続 mysql_connect('xxx', 'xxx', 'xxx') or die(mysql_error()); mysql_select_db('xxx'); mysql_query('SET NAMES UTF8'); //フォームで送られてきた条件を元にSELECT文を作成 if (!empty($_POST['nm'])) { $q = $_POST['nm']; $sql = 'select * from test_tb where name like "%$q%"'; $record = mysql_query($sql) or die(mysql_error()); } ?> <html> <body> <form action="" method="post">    名前:<input type="text" name="nm">    <input type="submit" name="exec" value="検索"> </form> <?php while($row = mysql_fetch_assoc($record)): ?> <?php echo $row['id']; ?> <?php echo $row['name']; ?> <?php endwhile ?> </body> </html> --- --- --- --- --- --- --- --- --- --- --- --- エラーは表示されないのですが、結果も表示されません。 さまざまなサイトや他の方の質問、MySQLやPHPの本を参考にしたのですが うまくいかなかったのでご質問させていただきました。 プログラミング初心者の上、はじめての質問で不備があると思いますが、 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php+mysqlで検索フォームの作成について

    ごく最近PHPとmysqlを勉強しだした初心者です。 PHPでDBの検索フォームを作ろうとしているのですが、どうしてもわからないので質問させていただきました。 検索フォームに電話番号を入れると、該当する人の情報を表示させるようにしたいと思ってます。 私の持っている本では、SQLの検索を行うにはSELECT句を使い   SELECT フィールド名 FROM テーブル名 WHERE 条件文; という風にあって、条件文がid=1とかの定数で指定したものしかありません。 検索フォームに入力された数値($_POSTの値)を条件文にいれて、検索フォームで入力された電話番号を検索するようにできますか? もしできないなら、どのような形で作ればよいでしょうか? 贅沢ですが、できれば簡単に解説もしていただけると非常に助かります。 ご教授の程、何卒よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • データ検索について

    現在フォームに入力された日付を検索して、その値に紐付くデータを 表示させるといった、検索システムを作成しています。 しかしフォームの値が上手く渡りません。 現在の症状としては フォームの値 2008-01-01 × フォームの値 "2008-01-01" ○ 上記の様に値をダブルクォーテンションで囲むと上手く渡るのですが、 囲まないと上手く渡りません。 なぜこのような動作になってしまうのか分からず、解決できません・・・ この解決策をご教授頂けると幸いです。 開発環境は UI Flex DB接続 AMF PHP DB MYSQL 日付のフォーマットはyyyy-mm-dd dateフィールドの値はtext 以下がソースになります。 ************************************************************* //$date フォームの値 function SearchData($date = "") { GLOBAL $dbh; //DB接続 if($date) { $sql = " SELECT * FROM tDate WHERE date = \"".$date."\""; } else { $sql = " SELECT * FROM tDate"; } $result = mysql_query( $sql ); while( $val = mysql_fetch_assoc( $result ) ) { $res_list[] = array( "date" => $val['date'], ); } return $res_list; } ************************************************************* 以上よろしくお願い致します。

    • 締切済み
    • PHP
  • PHP+MySQLでスペースによる絞込み検索をかける方法

    宜しくお願いします。 PHPとMySQLで検索フォームを作っているのですが、OKWebやGoogleの様に、入力フォームにスペースで絞込み検索が出来る様にしたいと思っています。 実際に作ってみると、大変な問題に気付きました。 PHPからMySQLにSELECT文で絞込み検索かける時には、 mysql_query(select * from DB名 where COLUMN名 = '検索内容' and COLUMN名 = '検索内容'); といった形にしなければならないと思いますが、検索する人によってスペースで区切る回数は分からないので、実際に区切られた回数だけANDを自動的に作らなければ絞込みが出来ない事に気付きました。 しかし、PHPの関数だけで入力されているスペースの回数を割り出し、その数だけクエリの中に『and COLUMN名 = '検索内容'』を自動生成する方法なんて、あるのでしょうか?世の中の検索サイトを見ると、至極当たり前の様に出来ているので、何かやり方があるのだろうとは思いますが、皆目検討がつきません。どなたか教えて頂けると助かります。 何卒、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • SQL文の実行に失敗しました???

    すみませんが、お助けください。私は、PHPの初心者で現在猛特訓でマスター中です。よろしくお願いします。現在、本を購入し、そこに記述されている通りやってみているのですが、今まで上手くできていたのですが、ここの記述ではどうしてもエラーが出てしまいます。そこでお願いで投稿しました。 <利用環境> ・レンタルサーバー/ラピッドサーバー RV-310 ・MYSQL/MySQL 4.1.18 ・「動物名」と「動物の年齢」を入力する練習フォームとPHP ■php内容 insert.php ※フォームは文字数の関係で省略しました <?php // データベースへの接続情報を設定します。 $dbUser = "***"; $dbPass = "***"; $dbHost = "localhost"; $dbName = "***"; // フォームから送信されたデータを取得します。 $animal_c = $_POST['animal_c']; $age_c = $_POST['age_c']; // mysqli_escape_stringを使用してエスケープを行うため、 // magic_quotes_gpcがOnの場合、エスケープされた文字を元に戻します。 if( get_magic_quotes_gpc() ){ $animal_c = stripslashes( $animal_c ); $age_c = stripslashes( $age_c ); } // MySQLとの接続を行ないます。 $db = mysql_connect( $dbHost, $dbUser, $dbPass ) or die( "MySQL DBとの接続に失敗しました" ); // クライアントの文字コードセットをEUC-JPに変更します。 mysql_query( "SET NAMES ujis", $db ); // データベースを選択します。 mysql_select_db( $dbName, $db ) or die( "データベース" . $dbName . "との接続に失敗しました。" ); // エスケープ処理を行います。 // 数値が入る事が予測される値もエスケープ処理は必ず行います。 $animal_c = convSqlString( $animal_c ); $age_c = convSqlString( $age_c ); // SQL文を記述します。 // フォームより送信されたデータを追加します。 $query = "INSERT INTO zoo SET animal_c='$animal_c', age_c='$age_c'"; // SQL文を実行します。 mysql_query( $query, $db ) or die( "SQL文の実行に失敗しましたbbbbb" ); // SQL文に使用するための文字列をエスケープする関数です。 function convSqlString( $string ){ global $db; // SJISでは2バイト目にメタ文字\のコード(0x5c)を含む場合に、 // このコードもエスケープしてしまうので、 // EUC-JPに変換してエスケープします。 // Linuxでの実行などファイルをEUC-JPにエンコードした場合には // コメントアウトしてください。 // $string = mb_convert_encoding( $string, "EUC-JP", "SJIS" ); // mysqli_escape_stringを使うことにより、 // 'や\などが適切にエスケープされます。 // MySQLのバージョン4.1.2未満を使用している場合は、 // 下の1行を$string = mysql_escape_string( $string ); // に変更してください。 $string = mysql_escape_string( $string ); // 再度SJISに変換して返します。 // Linuxでの実行などファイルをEUC-JPにエンコードした場合には // コメントアウトしてください。 // $string = mb_convert_encoding( $string, "SJIS", "EUC-JP" ); return $string; } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"> <title>PHPサンプルスクリプト</title> </head> <body bgcolor=#FFFFFF> データを追加しました。 </body> </html> <? // データベースから切断します。 mysql_close( $db ); ?> ■エラー内容(ブラウザ表示) SQL文の実行に失敗しましたbbbb でエラー構文が出てしまいます。 もしお分かりの方がいればアドバイスいただければ幸いです。

    • 締切済み
    • PHP
  • POSTでセレクトフォームの値を渡す

    こんにちは。初めて質問させていただきます。 過去ログを検索して似たような内容の投稿は読んだのですが、どうにも自分がやりたいことへの応用が利かないため投稿させていただきました。環境はPHP4.3.2 DBはMYSQLを使用しています。 やろうとしていることは、入力フォーム上(index.phpとします)で任意(セレクトフォーム)でテーブルを選択し、その選択したテーブルにセレクトフォームの下にあるテキストフォームの値を挿入しようと考えています。 引っかかっている部分はセレクトの値の部分です。(テキストの方はテーブルを固定すると問題なかったので省略します) <<index.php>> <form action="inputdata.php" method="post"> <select name="dblist"> <? $mysql = mysql_connect(SERVER,USER,PASS) or die ("MYSQLに接続できませんでした\n"); mysql_select_db(DB,$mysql) or die ("データベースの接続に失敗しました\n"); $dbresult = mysql_query("SELECT * FROM listtable", $mysql); while($row = mysql_fetch_assoc($dbresult)){ echo "<option value='{$row['list_tb']}'>{$row['list_name']}"; } mysql_close($mysql); ?> </select> //これより下にテキストが入りますが省略します </form> 上記のような渡し方の場合、受け取る側(inputdata.php)を $table = $_POST['dblist']; と書いているのですが、echoで$tableを表示してもなにも表示されませんでした。(nullでした) 受け取り側(inputdata.php)の書き方が悪いのでしょうか?それともそもそもの渡し方(index.php)が悪いのでしょうか? 基礎的なことかもしれないのですが、適切な受け渡し方法があれば教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQLで検索したいのですが..

    MYSQLで構築したデータベースのあるフィールドを検索したいのですが、データベースには文字化けしないように¥マーク(エスケープ文字!?)が入っているのです。 (例「イソノサザエ」は「イソ\ノサザエ」となっています) このような場合 select * from ○△table where name LIKE '%イソノ%'; とやっても"\"が入っているために検索がヒットしません。 どのようにすればselect文にヒットしてくれるでしょうか? アドバイスお願いします。 わかりにくい文章ですいません。 もしかしたらデータベースのカテゴリに書き込みしなくてはならないのかもしれませんが、perlのカテゴリに書込みさせて頂きました。

  • DB(MySQL)、PHP、jQueryの連結

    現在DB(MySQL)、PHP、jQueryの連結でつまづいております。 具体的には 1.フォームからポストした値をDBへ保存 フォーム項目はタイトル、カテゴリ、内容の3つです。 ↓ 2.DBから上記で保存された値(カテゴリ)をセレクトメニューへ出力 ↓ 3.セレクトメニュー内のカテゴリが選択されたタイミングでDBへセレクトされたワード(カテゴリ)で検索をかけ同ページセレクトメニュー下にカテゴリと一致したタイトルと内容を出力 という言う様な形にしたいのですが、上記3で困っております。 現状はjQueryのchangeで項目が選択されたと同時にセレクト項目(上記2でDBから出力したカテゴリが代入されているphp変数)$item['web_category']をjs変数に代入し、loadでDB検索リクエスト用のphpファイルにポストできないものかと考えていたのですが、jQの部分でエラーがでてしまいどうにもうまくいきません。如何せん初心者なものでこのやり方自体はき違えているのかもしれません。説明下手な上、支離滅裂な個所もあるかとは存じますが、それも含めご教授いただけるとありがたいです。問題と思われる個所のコードは以下の通りです。 セクトメニュー部 <form> <select id="category"> <?php while ($item = mysql_fetch_array($rs)) { echo "<option id='".$item['web_category']."'>" .$item['web_category']. "</option>"; } ?> </select><br> </form> jQ部 $("#category").change( function() { var value = $(this).val(); $("#display").load('search.php', {search: value}); });

  • phpとmysqlで出欠確認

    phpとmysqlを使い、出欠確認アプリのようなものを作りたいです。 操作としては 1.画面上で名前を選ぶ(タイプする) 2.確認画面がでてokを押す 3.出席登録しました このような簡単のものなのですが、phpの流れについて確認したいです。 管理者側で誰がいつ出席登録したか、また日付ごとに検索ができ、何月何日に誰が出席したか確認したいです。 その際に流れなのですが、 1で記入してもらった名前をsubmitで送信し、その内容をphpファイルに送る その後そのファイル内で、name,createdとしてmysqlに値を格納する。nameは名前、createdはボタンが押された時の時間を格納 これで登録はできるかと思いますがどうでしょうか? php初心者のため、まずは流れから質問させてもらいました。 phpの内容ですが、 dbに接続する selectでテーブルを選択する insertで指定したテーブルにPOSTで受け取った値を格納する dbを切断する このような流れでよろしいでしょうか? 管理者側日付ごとに検索するプログラムを書くときはその際にまた質問させていただこうと考えております。 また名前などのデータはPOSTメソッドでの受け渡しで良いのでしょうか?

    • 締切済み
    • PHP
  • PHPでMySQLのデータを検索したい

    お世話になります。 PHPでMySQLのデータを検索したいと思い、 以下のようにしてみたのですがうまく表示されません。 -- $name = $_POST["name"]; $link = mysql_connect('localhost', '', ''); $db_selected = mysql_select_db('', $link); mysql_set_charset('utf8'); $sql = "SELECT * FROM search WHERE". $name; $result = mysql_query($sql); while($row = mysql_fetch_array($name)) { print $row['name']; } $close_flag = mysql_close($link); -- どう改善すればいいのでしょうか? 初心者の為、少々お見苦しい点があるかと思いますが どうぞよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう