
or条件でpostで受け取った値の情報をDBへ接続して検索結果として表示させたいのですが・・・。
検索画面にテキストを3箇所設置しています。このテキストには異なる数字が入力されることになります。この入力された値に対する結果をDBからひっぱってきて表示させるというものを作りたいのです。
●html
<input class="text" type="text" name="pnk[]">
<input class="text" type="text" name="pnk[]"><br/>
<input class="text" type="text" name="pnk[]"><br/>
</br><input type="submit" class="subbtn" value="Search"></div>
●php
<?php
try
{
require_once('../../common/common.php');
if(!$_POST){exit;}
$data=[];
foreach($_POST['pnk']as $val){
if(trim($val)===""){continue;}
$data[]=trim($val);
}
//DBへ接続(省略)
$sql='SELECT partsnumber,description,unitprice,stockqty FROM parts_price';
if(count($data)>0){
$sql.='where'.implode('or',array_fill(0,count($data),'(partsnumber=?)'));
}
printf('%s<br>', htmlspecialchars($sql, ENT_QUOTES));
echo "<pre>";
print_r($data);
echo "</pre>";
$stmt=$dbh->prepare($sql);
$stmt->execute($data);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$partsnumber=$rec['partsnumber'];
$description=$rec['description'];
$unitprice=$rec['unitprice'];
$stockqty=$rec['stockqty'];
$dbh=null;
}
catch(Exception $e)
{
print'該当する部品番号はありません。';
exit();
}
?>
//省略
<th scope="col">Parts Number</th>
<th scope="col">Description</th>
<th scope="col">Unit Price</th>
</tr>
<td><?php print $partsnumber;?></td>
<td><?php print $description;?></td>
<td align="right"><?php print number_format($unitprice)?></td>
上記のPHPコードはアドバイスをいただいたものに元々の自作のコードを合作させたものですが、私のコードの書き方がおかしいのか、余計なコードが入っているのか画面には下記のように表示されてしまいます。
SELECT partsnumber,description,unitprice,stockqty FROM parts_pricewhere(partsnumber=?)
Array
(
[0] => 6903118B
)
該当する部品番号はありません。
書籍を読んだりWEBで検索したりのまったくのド素人なので、間違っている箇所を見つける事ができません。
どうか、上記でどこを訂正したらよいのかアドバイスを下さい。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
入力したデータ(pnk)がpartsnumberと完全一致するデータをor検索すればいいのですか?
<form method="post">
<input class="text" type="text" name="pnk[]"><br>
<input class="text" type="text" name="pnk[]"><br>
<input class="text" type="text" name="pnk[]"><br>
<input type="submit" class="subbtn" value="Search">
</form>
<?php
$pnk=filter_input(INPUT_POST,"pnk",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
$pnk=array_filter(array_unique($pnk),function($x){
return $x!=="";
});
$sql="select * from tbl where 1 ";
$data=[];
if(count($pnk)>0){
$sql.="and partsnumber in (";
$sql.=implode(array_fill(0,count($pnk),"?"),",");
$sql.=") ";
$data=array_merge($data,$pnk);
}
print $sql."<br>";
print_r($data);
//あとはpdoでprepareに処理するだけ
?>
No.5
- 回答日時:
> $stmt = $pdo->prepare($sql); の「$pdo」の部分ですが、よく目にするのは
>「$dbh(サーバ接続部分)」ですがこの「$pdo」は何を意味しているのでしょうか。
おっと失礼しました。これは私の転記ミスです
$stmt = $pdo->prepare($sql);
↓↓↓
$stmt = $dbh->prepare($sql);
と読み替えて下さい。
普段、pdoでの接続のインスタンスを$pdoと書いているためのクセがでました
公式マニュアルのサンプルも$dbhと$pdoと乱立してますね
その他クエリも$queryと$sqlと2派閥あるようで、どちらが優れているとかなく
好きな方を使えばいいでしょう
No.3
- 回答日時:
pdoの部分はこう
try{
$dsn = 'mysql:host=localhost; dbname=test1;charset=utf8;';
$user = 'root';
$password = '****';
$dbh= new PDO($dsn, $user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
//$sqlと$dataは#2の通り取得
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
$rows=$stmt->fetchAll();
}catch(PDOException $e){
die($e->getMessage());
}
No.2
- 回答日時:
ごめんなさいちょっと不具合がでてました
>pnk_1には「123456」 pkn_2には「789012」という全く異なった番号が入力されて、
>「検索」ボタンを押すと、「123456」と「789012」の価格と在庫が表示される
>という仕組みです
上記条件で問題なさそうなので、こうですね。
・デフォルトではWHERE 1なので全データ表示
・pnk欄に適当な数値を入れてsearchするとwhere句に条件が追加されて絞り込まれます
<form method="post">
<input class="text" type="text" name="pnk[]" value="123456"><br>
<input class="text" type="text" name="pnk[]" value="789012"><br>
<input class="text" type="text" name="pnk[]"><br>
<input type="submit" class="subbtn" value="Search">
</form>
<?php
$pnk=filter_input(INPUT_POST,"pnk",FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]);
$pnk=array_filter(array_unique($pnk),function($x){
return $x!=="";
});
$sql="select * from tbl where 1 ";
$data=[];
if(count($pnk)>0){
$sql.="and partsnumber in (";
$sql.=implode(array_fill(0,count($pnk),"?"),",");
$sql.=") ";
$data=array_merge($data,$pnk);
}
print $sql."<br>";
print_r($data);
?>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セッション関数を使わずにファ...
-
PHP8でWarning:Undefined varia...
-
phpの問い合わせフォームを作っ...
-
composerをインストールしたい...
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
phpに関わる所での、form actio...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
SplFileObject を利用したとき...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
ゆゆにゃ。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
配列をhiddenで
-
検索時の選択内容を保持する方法
-
DBの値をチェックボックスに反...
-
フォームボタンを押すたびに数...
-
PHPで、ボタンを押すと同じペー...
-
同じページでフォームデータを...
-
ラジオボタンをsessionで使いたい
-
フォームでのリセットを使う方法
-
POSTやGETの変数をフォーム無し...
-
HTMLフォームで複数選択のチェ...
-
PHPで画像の渡しが上手く行きま...
-
アップロードの際にファイルパス
-
テキストボックスに初期値を入れる
-
フォームへの前回入力値をクリ...
-
HTMLのリンクをクリックするこ...
-
フォームのテキストボックスに...
-
画面が更新されてもチェックボ...
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
おすすめ情報
yambejp様
毎回迅速に回答下さいましてありがとうございます。
>入力したデータ(pnk)がpartsnumberと完全一致するデータをor検索すればいいのですか?
↓元々の質問です。
pnk_1には「123456」 pkn_2には「789012」という全く異なった番号が入力されて、「検索」ボタンを押すと、「123456」と「789012」の価格と在庫が表示されるという仕組みです。
これを投稿したところ「or検索」でとコードを教えていただきました。最初はテキストそれぞれに名前をつけてPOSTで持ってこようと思っていましたがコードが膨大になりすぎて収拾つかなくなってしまったのでアドバイスをいただきたく投稿した次第です。
合ってますでしょうか。
yambejp様
またまたご丁寧にご回答ありがとうございました。
prepareコードを今朝からずっとつくっていますが結果が伴いません。
$stmt=$dbh->prepare($sql);
$stmt->execute($data,$pnk);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$partsnumber=$rec['partsnumber'];
//以下省略
htmlに「6903118B」と入力しphpでとばすと画面に「SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE 1and partsnumber in (?) Array ( [0] => 6903118B )」と表示されます。 度々ですみません。アドバイスいただけますでしょうか。
yambejp様
回答ありがとうございました。
教えていただいたコードを追加したのですが下記のエラーがでます。
SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE 1and partsnumber in(?)
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'partsnumber in(?)' at line 1
ずるずると質問質問の繰り返しで申し訳ありません。
何度もすみません。「where 1」の後ろに入れてませんでした。訂正してSQLエラーはでなくなりました。ありがとうございます。ですが、まだSELECT ・・・(略) partsnumber in(?) Array ( [0] => 6903118B ) が表示されます。結果表示(テーブルの中にそれぞれの情報が表示される)までには至っていません。
それと、コードの中で1箇所気になったところがあったので教えていただきたいのですが。
$stmt = $pdo->prepare($sql); の「$pdo」の部分ですが、よく目にするのは「$dbh(サーバ接続部分)」ですがこの「$pdo」は何を意味しているのでしょうか。
いい加減、ウンザリしているのは重々承知の上ですが応用力がなく自分だけではどうにもできないので、もう少し?だけアドバイスを続けていただければ幸いです。よろしくお願いします。
ありがとうございます。実は質問する前に「$pdo」にした時には500エラーがでてたので「$dbh」に変更してみました。エラーが出なかったので、ここが違うのかな、とは思ったのですが、何分初心者なので「$pdo」は間違ってなくて私が書いたコードのどこかに間違いがあるかもしれないと思い、気になって聞いてみました。実際、未だにSELECT文が画面に表示されているので・・・。PHPに関してはwebや書籍を見てますが、人によって使うコードが違いますしその人なりのこだわりみたいなのがあったりで混乱する時はあります。ちゃんと教室にでも通って基本中の基本から教わればいいのでしょうが会社ではそうもいかず、ほとんどわかっていない状態で先に進んでいるのが現状です。yambejpさんのように根気よく教えて頂ける人は初心者にとって本当に貴重な存在です。本当にありがとうございます。