人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

初めて質問させていただいております。
現在、商品検索画面をPHPと、Mysqlで一人で作成してる初心者です。
こちらのほうで、参考にさせていただきながら、
下記のようには何とか組めたのですが、
送信ボタンを押すと
SELECT * FROM syohin_list WHERE "
. "(入力した文字 Like '%" . join("%') OR (入力した文字 Like '%", $texthinmeiArray) . "%')";
がそのまんま画面に出力され、
データから抽出してうまく出力画面が出ない状態です。

どこをどう改善したらよいのか、教えていただきたく思いご質問させていただきます。
説明不足など不慣れなところが多々あるかと思いますが、どうぞよろしくお願いいたします。

●質問者: ancorotamutamu
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

PHPはこちらでの回答を模倣アレンジさせていただき下記のように作成しております。
" ?>

<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>




</head>





//これをスクリプトの1行目に入れるとエラーを表示させなくなります。作成中は//でエスケープして、間違い訂正をする。サーバーに上げるときは有効にするのです。
//error_reporting(1);
$link=mysql_connect("localhost","root","");
if(!$link){
die("データベースへ接続できません。");
}
$db=mysql_select_db("データベース名");
if(!$db){
die("データベースを選択できません。");
}
$sql=<<<SQL
select*from syohin_list
SQL;
$result=mysql_query($sql,$link);
if(!$result){
die(mysql_error()."SQLの発行に失敗しました。");
}
?>


//while($data=mysql_fetch_assoc($result)):
?>


$texthinmei=$_POST['hinmei']; // 入力されたテキスト
$textjan=$_POST['jan']; // 入力されたテキスト
$texthinmeiArray = preg_split("/ /", preg_replace("/( | )+/", " ", trim($texthinmei))); // 分割
$textjanArray = preg_split("/ /", preg_replace("/( | )+/", " ", trim($textjan))); // 分割
$sqlStr=""; // 初期化
if($texthinmeiArray[0]!="" and $textjanArray[0]!="") { // 両方入力されている場合のSQL生成
$sqlStr="SELECT * FROM syohin_list WHERE "
. "*1 AND "
. "*2";
} elseif($texthinmeiArray[0]!="") { // 商品名だけ入力されている場合のSQL生成
$sqlStr="SELECT * FROM syohin_list WHERE "
. "(hinmei Like '%" . join("%') OR (hinmei Like '%", $texthinmeiArray) . "%')";
} elseif($textjanArray[0]!="") { // JANだけ入力されている場合のSQL生成
$sqlStr="SELECT * FROM syohin_list WHERE "
. "(jan Like '%" . join("%') OR (jan Like '%", $textjanArray) . "%')";
} else{
echo "エラー!商品名もJANも入力されていません。";
}
echo $sqlStr;
?>

*1:hinmei Like '%" . join("%') OR (hinmei Like '%", $texthinmeiArray) . "%'

*2:jan Like '%" . join("%') OR (jan Like '%", $textjanArray) . "%'


1 ● うぃんど

訂正箇所

echo $sqlStr;

訂正例

$result = mysql_query( $sqlStr, $link );
if ( !$result ) {
 while ( $data = mysql_fetch_assoc( $result ) ) {
 echo $data['hinmei']; // 品名
 echo $data['jan']; // JANコード
 echo '<br />'; // 改行タグ
 }
}

ancorotamutamuさんのコメント
ご回答ありがとうございます! どうしたらよいのか、もうまったくわからなくなっていたので、 ご回答いただけて、すごくありがたいです。 さっそく、 訂正していただいた箇所を、そのまま置き換えてみました。 すると、画面が今度は真っ白に表示された状態になりました。 商品名・JANを、何も入力せずに、送信しますと、 エラー!商品名もJANも入力されていません。 という表示が出るのはそのままです。 そのまま、変更するだけではだめなのでしょうか? どこか、アレンジしていかないと、つながっていかないのでしょうか・・・? 知識不足で申し訳ありません。 ご回答いただければよろしくお願いいたします。 $result = mysql_query( $sqlStr, $link ); if ( !$result ) { while ( $data = mysql_fetch_assoc( $result ) ) { echo $data['hinmei']; // 品名 echo $data['jan']; // JANコード echo '<br />'; // 改行タグ } }

うぃんどさんのコメント
>商品名・JANを、何も入力せずに、送信しますと、 >エラー!商品名もJANも入力されていません。 >という表示が出るのはそのままです。 phpは、まず最初にプログラムの簡単な文法チェックを行うので、 「商品名もJANも入力されていません。」の処理が動いているならば、 静的な部分の文法チェックはOKということになり、 実行時に動的に変わる部分を確認するというステップに入ります。 まず、$sqlStr に入っているSQLが正しいかを確認しつつ、 実行結果件数も探って見ましょう。 下記のようにテスト用の出力を書き加えて実行しみましょう。 >|| echo $sqlStr; // SQL文を出力させて目視確認 echo '<br />'; // 見やすくするために改行も入れときます。 $result = mysql_query( $sqlStr, $link ); echo mysql_num_rows($result); // SQLを実行して得られた行数を出力させて目視確認。 echo '<br />'; // 見やすくするために改行 if ( !$result ) { while ( $data = mysql_fetch_assoc( $result ) ) { echo $data['hinmei']; // 品名 echo $data['jan']; // JANコード echo '<br />'; // 改行タグ } } ||< SQL文が正しいのにゼロ件であるとすれば、テーブルに該当するデータが無いか、あるいは、 プログラムとテーブルの文字コードが合致しないため抽出できないのだと思われます。 文字コードは環境によりますので、 どのような手順でテスト環境を作ったのかによって返答は変わってきます。

ancorotamutamuさんのコメント
うぃんど殿 本当に、ご親切にありがとうございます。 ご指導いただいた文を差し替えて見ました。 >まず、$sqlStr に入っているSQLが正しいかを確認しつつ、 実行結果件数も探って見ましょう。 下記のようにテスト用の出力を書き加えて実行しみましょう。 やってみましたところ、下記のように、ブラウザで表示されました。 SELECT * FROM syohin_list WHERE ((hinmei Like '%テ%')) AND ((jan Like '%4%')) 2 SELECT * FROM syohin_list WHERE ((hinmei Like '%テ%')) AND ((jan Like '%4%')) データベースのほうで、上記の文を下記のようにコピペで実行したところ、 SELECT * FROM syohin_list WHERE ((hinmei Like '%テ%')) AND ((jan Like '%4%')) テーブルの検索はできました。 あとは、 >プログラムとテーブルの文字コードが合致しないため抽出できないのだと思われます。 文字コードは環境によりますので、 どのような手順でテスト環境を作ったのかによって返答は変わってきます。 こちらのほうは、 文字コードは、phpMyAdminはUTF-8 genelal ci eclipseはUTF-8 です。 こういう返信で、またご指導いただけますでしょうか? 本当に、まだまだ勉強不足で申し訳ありません。。。

うぃんどさんのコメント
>データベースのほうで、上記の文を下記のようにコピペで実行したところ、 >テーブルの検索はできました。 その結果はmysql_num_rows($result)の値と同じく2レコードでしたか? 同じであればプログラムの見直しを進めなければなりませんし、 もしも違えば、下記のようなSQLを発行したりして、 MySQLのテーブルの文字コードを調べることになるでしょう。 >|sql| show create table テーブル名 ||< ところで、 どうして$sqlStrの中身が二回出力されているのでしょう? >|| SELECT * FROM syohin_list WHERE ((hinmei Like '%テ%')) AND ((jan Like '%4%')) 2 SELECT * FROM syohin_list WHERE ((hinmei Like '%テ%')) AND ((jan Like '%4%')) ||< もしかして、こんなコードになってませんか? >|| echo $sqlStr; // SQL文を出力させて目視確認 echo '<br />'; // 見やすくするために改行も入れときます。 $result = mysql_query( $sqlStr, $link ); echo mysql_num_rows($result); // SQLを実行して得られた行数を出力させて目視確認。 echo '<br />'; // 見やすくするために改行 echo $sqlStr; ||< 正しく、以下のようになっていますか? 他の何かを付け加えたりしてませんか? >|| echo $sqlStr; // SQL文を出力させて目視確認 echo '<br />'; // 見やすくするために改行も入れときます。 $result = mysql_query( $sqlStr, $link ); echo mysql_num_rows($result); // SQLを実行して得られた行数を出力させて目視確認。 echo '<br />'; // 見やすくするために改行 if ( !$result ) { while ( $data = mysql_fetch_assoc( $result ) ) { echo $data['hinmei']; // 品名 echo $data['jan']; // JANコード echo '<br />'; // 改行タグ } } ||< 以上、再確認してください。 デバッグはこのような地道な作業の繰り返しです。 余談ですが、人力検索でソースコードを載せる場合は、下記のようにしてください。 もしくは下部の「コメントを書く」でコメント欄に書いてください。 (コメント欄ではHTMLタグなどが自動的にエスケープ処理されます。 ただし先頭空白などは消えてしまって階層構造が見づらくなりますが…。) >|| >|| ←実際は半角文字です。この3文字のあとには空白も含めて何も書いては行けません。 echo $sqlStr; // SQL文を出力させて目視確認 echo '<br />'; // 見やすくするために改行も入れときます。 $result = mysql_query( $sqlStr, $link ); echo mysql_num_rows($result); // SQLを実行して得られた行数を出力させて目視確認。 echo '<br />'; // 見やすくするために改行 if ( !$result ) { while ( $data = mysql_fetch_assoc( $result ) ) { echo $data['hinmei']; // 品名 echo $data['jan']; // JANコード echo '<br />'; // 改行タグ } } ||< ←実際は半角文字です。この3文字のあとには空白も含めて何も書いては行けません。 ||<

うぃんどさんのコメント
サンプル作って動かしてみたら…、 !が混じってました。 if ( !$result ) { ではなく if ( $result ) { です。 お手数かけてすみません。

うぃんどさんのコメント
私が作ったテスト用コードです。 チェック1からチェック5まで順にチェック箇所を追加して行って、 やっと…!が入っているという凡ミスに気づきました…。 >|php| <?php // ===== HEAD部分の出力 echo <<<EOT <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> EOT; // ===== 検索結果の出力 // テキスト受取 // isset で 値の存在を確認 // 値が存在すればトリムしたものを代入 // 値が存在しない場合は空文字列を代入 $texthinmei = isset( $_POST['hinmei'] ) ? trim( $_POST['hinmei']) : ''; $textjan = isset( $_POST['jan'] ) ? trim( $_POST['jan']) : ''; // テキスト分割 // preg_split は正規表現が使えるのでpreg_replaceは不要 $texthinmeiArray = preg_split( '/( | )+/', $texthinmei ); $textjanArray = preg_split( '/( | )+/', $textjan ); // チェック用出力1 echo '<pre>'; echo "チェック1\n"; echo "hinmeiの値\n"; echo $texthinmei . "\n"; var_dump ( $texthinmeiArray ); echo '</pre>'; echo '<pre>'; echo "janの値\n"; echo $textjan . "\n"; var_dump ( $textjanArray ); echo '</pre>'; // SQL作成 $sqlStr = ''; // 初期化 if( $texthinmei != '' and $textjan != '') { // 両方入力されている場合 $sqlStr = "SELECT * FROM syohin_list WHERE " . "((hinmei Like '%" . join("%') OR (hinmei Like '%", $texthinmeiArray) . "%')) AND " . "((jan Like '%" . join("%') OR (jan Like '%", $textjanArray) . "%'))"; } elseif( $texthinmei != '' ) { // 商品名だけ入力されている場合 $sqlStr="SELECT * FROM syohin_list WHERE " . "(hinmei Like '%" . join("%') OR (hinmei Like '%", $texthinmeiArray) . "%')"; } elseif( $textjan != '' ) { // JANだけ入力されている場合 $sqlStr="SELECT * FROM syohin_list WHERE " . "(jan Like '%" . join("%') OR (jan Like '%", $textjanArray) . "%')"; } else{ echo '<p style="color:red">商品名もJANも入力されていません。</p>'; } // チェック用出力2 echo '<pre>'; echo "チェック2\n"; echo "生成されたSQL\n"; echo $sqlStr; echo '</pre>'; // データベース接続と結果出力 // データベース名はtestになっていますがそちらの環境にあわせてください if ( $sqlStr != '' ) { $link = mysql_connect( 'localhost', 'root' ) or die( 'データベースへ接続できません。' ); $db = mysql_select_db( 'test' ) or die( 'データベースを選択できません。' ); $result = mysql_query( $sqlStr, $link ); // チェック用出力3 echo '<pre>'; echo "チェック3\n"; echo '結果は' . mysql_num_rows($result) . '件'; echo '</pre>'; if ( $result ) { // チェック用出力5 echo '<pre>'; echo "チェック5\n"; echo 'if文内に入った!'; echo '</pre>'; while ( $data = mysql_fetch_assoc( $result ) ) { // チェック用出力4 echo '<pre>'; echo "チェック4\n"; echo var_dump ( $data ); echo '</pre>'; echo $data['hinmei']; // 品名 echo $data['jan']; // JANコード echo '<br />'; // 改行タグ } } } // ===== 入力フォーム部分の出力 // phpファイル1つでテストできるように追加しています。 // 不要であれば、入力フォーム部分は消してもらってかまいません。 echo <<<EOT <form action="{$_SERVER['SCRIPT_NAME']}" method="POST"> 品名<input type="text" name="hinmei" size="100" value="{$texthinmei}"> <br /> JAN<input type="text" name="jan" size="100" value="{$textjan}" > <br /> <input type="submit" value="送信" /> </form> EOT; // ===== FOOT部分の出力 echo <<<EOT </body> </html> EOT; ||< データサンプル >|sql| CREATE TABLE syohin_list ( id MEDIUMINT NOT NULL AUTO_INCREMENT, hinmei TEXT NOT NULL, jan CHAR(13) NOT NULL, PRIMARY KEY (id) ); INSERT INTO syohin_list (hinmei, jan) VALUES ( 'スーパースリム', '4960685882345' ) , ( 'チョコチップ', '4903110015277' ) , ( 'ココナツ', '4901620301156' ) , ( 'コーン', '4901575406524' ) ; ||<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ