
現在、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件です・・・(略)」と表示されます。
長々となりましたが、どこで不具合があるのか間違いをご教示下さい。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
前記したとおりcount(*)でやってもダメですか?
であればデータがないとみるのが妥当でしょう
番号もint型にしていますが、stringでチェックしてもいいかもしれません
どうしてもというのであれば、まずは
$sql= "SELECT * FROM Parts WHERE syohin_bango=’123456’”;
$stmh = $pdo->query($sql);
のようにスタティックに番号をいれてみてヒットするかチェックして下さい
アドバイスしていただいた通りチェックしましたら、やはりデータ型に問題があったようです。「商品番号」ではなく「商品名」で検索したところヒットしたので、思い切ってテーブルを0から作り直して、再度「商品番号」を検索してみたところヒットするようになりました。(データ型をCHAR(8)に変更) ありがとうございました。
No.1
- 回答日時:
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"];
のような処理をしたらどうでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPで、sessionのタイムアウト...
-
エクセルをMysqlに格納
-
PHP 10件表示 "前へ" "次へ"
-
jspでMysql検索で困っています。
-
カラムにデータがあるかないか...
-
stringaddslashes 半角¥が消える
-
Yomi-search(PHP)を設置する...
-
PHPのUndefined index や varia...
-
検索結果をgoogleのように数件...
-
phpにて出欠登録管理を作成して...
-
検索表示について
-
phpのParse errorについて
-
mysql_query等でレコード数を変...
-
SQL文の連結が、うまくいきません
-
mysql_fetch_assoc()の非推奨
-
縦に長い<table>でなく横に長い...
-
mysql_fetch_objectの書き方を...
-
DBで検索結果に該当するデータ...
-
SQL文2つ実行
-
PHPで絞り込み検索結果の件数を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー3131 FROM 句の構...
-
SQL文が実行できません
-
VBAをつかってクエリの情報を抽...
-
テキストボックスに入れた内容...
-
エラー3011
-
Accessのテーブルへ複数の主キ...
-
SQL文の実行に失敗しました???
-
LocalのNotesメールDBをVBAで参...
-
時刻型にNULLでセットしたい
-
codeigniter 複数モデルでトラ...
-
VBSの中で書くSQL文の記...
-
例外処理
-
SELECT文を発行して、ACCESSよ...
-
array_mapを使ったエスケープ処理
-
ExcelVBAでAccessのデータを検...
-
Call to undefined method MDB2...
-
MySQLでデータベースにデータin...
-
Pro*Cの構文エラー
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
おすすめ情報
ありがとうございました。WHERE句の部分、この条件式は思いつかなかったです。
$sql= "SELECT * FROM Parts WHERE syohin_bango=:syohin_bango”;
さっそく試してみました。結果・・・値は返ってきませんでした。やはりPOSTで渡した商品番号はDBに存在はしているのに、「検索結果はありません」と表示されてしまいます。
ちなみにDB側のデータ型で関係してくることがありますか?調べる対象が数字+アルファベットで整数ではないので、データ型はテキストにしているのですが。そのデータ型の違いで検索できていないとか・・・。
「dbを検索したけどそんなのは見あたらない」と返してきているのであれば、SQLのデータ型とかがひっかかっているのではと、ふと思いました。度々ですみませんが、このあたりも含めてご教示いただければと思います。
下記は検索結果の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} ?>
結果的に、上記に検索した番号の情報が表示されるようになるのが希望です。