dポイントプレゼントキャンペーン実施中!

現在、PHP(5.6)とmySQL(5.1)を利用して検索システムを作っています。
そこで、どうしても「完全一致」で値が表示されないので困っています。DBには5件の情報がありますが、これらが「すべて表示」されるか「該当なし」とでるか結果が両極端なのです。
kensaku.htmlで商品番号(数字7ケタ+アルファベット1ケタ/例:1111111A)を入力すると、検索した商品番号だけの情報が表示されるようにしたいのですが・・・。

下記にhtmlとphpのソースをコピペしますので、どの部分がおかしいのかご教示下さい。

ーkensaku.html部分ー
<body>
< form action="list.php" method="post">
商品番号:
<input type="text" name="pn" />
<input type="submit" value="検索" >
< /form>

< /body>

ーlist.php部分ー
<?php
$db_user = ユーザー名
$db_pass = パスワード
$db_host = ホスト名
$db_name = データベース名
$db_type = データベースの種類(mysql)

$dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8";

try {
$pdo = new PDO($dsn, $db_user,$db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
print "接続しました... <br>";
} catch(PDOException $Exception) {
die('エラー :' . $Exception->getMessage());
}

// POSTされたデータ
$pn = $_POST['pn'] ;

try {
$sql= "SELECT * FROM Parts WHERE syohin_bango=’$pn’”;
$stmh = $pdo->prepare($sql);
$stmh->bindValue(':syohin_bango', $pn, PDO::PARAM_STR );
$stmh->execute();
$count = $stmh->rowCount();
print "検索結果は" . $count . "件です。<BR>";

} catch (PDOException $Exception) {
print "エラー:" . $Exception->getMessage();
}

if($count < 1){
print "該当がありません。お問い合わせ下さい。<BR>";
}else{
?>

以下、画面上に表示されるhtml部分は省略します。

関連する場所を(POSTの部分やWHERE句などなど)色々と変えてみましたが、5件全ての情報が表示されてしまったり全く表示されなかったりエラーがでたりと希望する結果が得られません。
現在上記の状態で「検索結果は0件です・・・(略)」と表示されます。

長々となりましたが、どこで不具合があるのか間違いをご教示下さい。
よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    ありがとうございました。WHERE句の部分、この条件式は思いつかなかったです。
    $sql= "SELECT * FROM Parts WHERE syohin_bango=:syohin_bango”;
    さっそく試してみました。結果・・・値は返ってきませんでした。やはりPOSTで渡した商品番号はDBに存在はしているのに、「検索結果はありません」と表示されてしまいます。
    ちなみにDB側のデータ型で関係してくることがありますか?調べる対象が数字+アルファベットで整数ではないので、データ型はテキストにしているのですが。そのデータ型の違いで検索できていないとか・・・。
    「dbを検索したけどそんなのは見あたらない」と返してきているのであれば、SQLのデータ型とかがひっかかっているのではと、ふと思いました。度々ですみませんが、このあたりも含めてご教示いただければと思います。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/10/18 13:32
  • うーん・・・

    下記は検索結果のPHP文です。(実装の部分は略してます。)
    <?php while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {?>
    <TR>
    <TD align="center"><?=htmlspecialchars($row['partsnumber'])?></TD>
    <TD><?=htmlspecialchars($row['parts_name'])?></TD>
    <TD><?=htmlspecialchars($row['unit_price'])?></TD>
    <TD align="center"><?=htmlspecialchars($row['stock_qty'])?></TD>
    </TR>
    <?php} ?>

    結果的に、上記に検索した番号の情報が表示されるようになるのが希望です。

      補足日時:2017/10/18 13:48

A 回答 (2件)

前記したとおりcount(*)でやってもダメですか?


であればデータがないとみるのが妥当でしょう
番号もint型にしていますが、stringでチェックしてもいいかもしれません

どうしてもというのであれば、まずは
$sql= "SELECT * FROM Parts WHERE syohin_bango=’123456’”;
$stmh = $pdo->query($sql);

のようにスタティックに番号をいれてみてヒットするかチェックして下さい
    • good
    • 0
この回答へのお礼

ありがとう

アドバイスしていただいた通りチェックしましたら、やはりデータ型に問題があったようです。「商品番号」ではなく「商品名」で検索したところヒットしたので、思い切ってテーブルを0から作り直して、再度「商品番号」を検索してみたところヒットするようになりました。(データ型をCHAR(8)に変更) ありがとうございました。

お礼日時:2017/10/18 15:24

prepare処理があきらかにおかしいです



$sql= "SELECT * FROM Parts WHERE syohin_bango=’$pn’”;
$stmh = $pdo->prepare($sql);
$stmh->bindValue(':syohin_bango', $pn, PDO::PARAM_STR );
$stmh->execute();

↓↓↓
bindvalueするのが:syohin_bangoなんですから
$sql= "SELECT * FROM Parts WHERE syohin_bango=:syohin_bango”;

ですね、ただ件数をしらべるならrowCountを見るのではなく

$sql= "SELECT count(*) as count FROM Parts WHERE syohin_bango=:syohin_bango”;
のようにして

$count=$stmh->fetch(PDO::FETCH_ASSOC)["count"];

のような処理をしたらどうでしょう?
この回答への補足あり
    • good
    • 0

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