初めて質問させていただいております。

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/04/15 15:17:28
  • 終了:2013/04/22 15:20:05
id:ancorotamutamu

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件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492013/04/15 21:32:44

訂正箇所

echo $sqlStr;

訂正例

$result = mysql_query( $sqlStr, $link );
if ( !$result ) {
    while ( $data = mysql_fetch_assoc( $result ) ) {
        echo $data['hinmei'];  // 品名
        echo $data['jan'];  // JANコード
        echo '<br />';  // 改行タグ
    }
}
他4件のコメントを見る
id:windofjuly

サンプル作って動かしてみたら…、
!が混じってました。

if ( !$result ) {
ではなく
if ( $result ) {
です。

お手数かけてすみません。

2013/04/17 02:07:52
id:windofjuly

私が作ったテスト用コードです。

チェック1からチェック5まで順にチェック箇所を追加して行って、
やっと…!が入っているという凡ミスに気づきました…。

<?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;

データサンプル

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' )
;
2013/04/17 02:48:04
  • id:ancorotamutamu
    うぃんど殿

    本当に、親切丁寧にコメント記入方法までも教えていただき、ありがとうございます。
    このコメント欄より今後はコメントすれば良いのですね。

    あれからデバック作業をしてます、まだ解決出来てないですが、一つ一つ演算子、英語小文字大文字、スペースなど何度も見直してみます。

    また、先ほど回答で指摘していただいた箇所は、
    ご指摘の通り、重複して記入していたために、2度実行出力されていました。お手本を回答いただいてるのを、
    自分で打ち替えて壊すのが怖いので、
    下にコピペしてとっている事が原因です。

    すいません…、本当に親切丁寧に指導していただいてるのに、すぐに解決出来る起点や経験などが無く、ご迷惑お手数おかけしてます。引き続き作業してみます。
  • id:ancorotamutamu
    うぃんど殿
    本当に感謝しています。
    !を外したら、出力出来ました‼‼!
    きずけなかった事が、申しわけないです。。。ぜんぜんまだまだダメです。

    テスト用コードやデータサンプルまで作成していただき、すごく心強く、勉強になります。
    別で大切に保存し、再度アレンジなどしていって、勉強させていただきます。
    こちらに質問させていただき、ウィンド殿に回答していただかなければ、ここまでたどり着く事が出来ませんでした。
    一人で本を見ながら、もうどうして良いのかわからなくなり悩んでいた時とは、ぜんぜん違い、ダイレクトに息詰まっている内容への回答をいただけ、やり取りしていただける事が私にはありがたいです。
    まだまだダメな初心者ですが、こんな私でもいつかウィンド殿のように困っている人に恩返しできるように…まだまだ永遠の先だとは思うのですが。
    継続していこうと思います。
    引き続き、画像が検索できるようにする。プルダウンメニューで検索できるようにする。ラジオボタンで検索できるようにする。など、ウィンドウ殿の作成していただいたコードを見ながらやってみようと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません