ファンタビの世界観を作る二人にインタビュー!

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で検索したりのまったくのド素人なので、間違っている箇所を見つける事ができません。
どうか、上記でどこを訂正したらよいのかアドバイスを下さい。
よろしくお願い致します。

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

  • yambejp様
    毎回迅速に回答下さいましてありがとうございます。

    >入力したデータ(pnk)がpartsnumberと完全一致するデータをor検索すればいいのですか?

    ↓元々の質問です。
    pnk_1には「123456」 pkn_2には「789012」という全く異なった番号が入力されて、「検索」ボタンを押すと、「123456」と「789012」の価格と在庫が表示されるという仕組みです。

    これを投稿したところ「or検索」でとコードを教えていただきました。最初はテキストそれぞれに名前をつけてPOSTで持ってこようと思っていましたがコードが膨大になりすぎて収拾つかなくなってしまったのでアドバイスをいただきたく投稿した次第です。
    合ってますでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/04/04 16:17
  • 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 )」と表示されます。 度々ですみません。アドバイスいただけますでしょうか。

      補足日時:2018/04/05 14:54
  • 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
    ずるずると質問質問の繰り返しで申し訳ありません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2018/04/05 17:24
  • 何度もすみません。「where 1」の後ろに入れてませんでした。訂正してSQLエラーはでなくなりました。ありがとうございます。ですが、まだSELECT ・・・(略) partsnumber in(?) Array ( [0] => 6903118B ) が表示されます。結果表示(テーブルの中にそれぞれの情報が表示される)までには至っていません。
    それと、コードの中で1箇所気になったところがあったので教えていただきたいのですが。
    $stmt = $pdo->prepare($sql); の「$pdo」の部分ですが、よく目にするのは「$dbh(サーバ接続部分)」ですがこの「$pdo」は何を意味しているのでしょうか。

    いい加減、ウンザリしているのは重々承知の上ですが応用力がなく自分だけではどうにもできないので、もう少し?だけアドバイスを続けていただければ幸いです。よろしくお願いします。

    No.4の回答に寄せられた補足コメントです。 補足日時:2018/04/06 15:34
  • ありがとうございます。実は質問する前に「$pdo」にした時には500エラーがでてたので「$dbh」に変更してみました。エラーが出なかったので、ここが違うのかな、とは思ったのですが、何分初心者なので「$pdo」は間違ってなくて私が書いたコードのどこかに間違いがあるかもしれないと思い、気になって聞いてみました。実際、未だにSELECT文が画面に表示されているので・・・。PHPに関してはwebや書籍を見てますが、人によって使うコードが違いますしその人なりのこだわりみたいなのがあったりで混乱する時はあります。ちゃんと教室にでも通って基本中の基本から教わればいいのでしょうが会社ではそうもいかず、ほとんどわかっていない状態で先に進んでいるのが現状です。yambejpさんのように根気よく教えて頂ける人は初心者にとって本当に貴重な存在です。本当にありがとうございます。

    No.5の回答に寄せられた補足コメントです。 補足日時:2018/04/06 16:58

A 回答 (5件)

入力したデータ(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に処理するだけ
?>
この回答への補足あり
    • good
    • 0
この回答へのお礼

丁寧に教えていただきありがとうございました。

お礼日時:2018/04/09 13:59

> $stmt = $pdo->prepare($sql); の「$pdo」の部分ですが、よく目にするのは


>「$dbh(サーバ接続部分)」ですがこの「$pdo」は何を意味しているのでしょうか。

おっと失礼しました。これは私の転記ミスです
$stmt = $pdo->prepare($sql);
↓↓↓
$stmt = $dbh->prepare($sql);

と読み替えて下さい。
普段、pdoでの接続のインスタンスを$pdoと書いているためのクセがでました
公式マニュアルのサンプルも$dbhと$pdoと乱立してますね
その他クエリも$queryと$sqlと2派閥あるようで、どちらが優れているとかなく
好きな方を使えばいいでしょう
この回答への補足あり
    • good
    • 0

「where 1」の後ろにちゃんと半角スペースいれてますか?

この回答への補足あり
    • good
    • 0

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());
}
この回答への補足あり
    • good
    • 0

ごめんなさいちょっと不具合がでてました



>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);
?>
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


人気Q&Aランキング

おすすめ情報