アプリ版:「スタンプのみでお礼する」機能のリリースについて

どなたかアドバイスをください・・・。

SQLへ接続しOR条件で一致したものの情報だけを表示できるプログラム(アドバイスいただいたもの)を使用して別のページを作成中なのですが、うまくデータを持ってこれません。
現在検索ボックスが10個設置してあります。"pnk[]"の部分がor条件でSQLデータと一致した場合に、次のorder_view.phpで情報が表示されるようになります。このhtmlの段階で"pnk[]"に対する数量(必要数量)を入力して次ページで入力した数量とデータに登録されている数量を同時に表示をさせたいのです。

先週から色々と変更追加を繰り返してみましたが解決できず、今日の段階で投稿させていただくことにしました。

現在はname属性「suryo1」だけをPOSTしてみて受け取ることができるのは確認しています。

order.html
<P><input class="pnnmber" type="text" name="pnk[]"><input class="suryo" type="text" name="suryo1" ></p>
<p><input class="pnnmber" type="text" name="pnk[]" ><input class="suryo" type="text" name="suryo2" ></p>
<p><input class="pnnmber" type="text" name="pnk[]" ><input class="suryo" type="text" name="suryo" ></p>


order_vew.php
<?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!=="";
});
$suryo = $_POST['suryo1'];

try{

SQLへ接続(省略)

$sql='SELECT * FROM DB WHERE 1 ';
$data=[];
if(count($pnk)>0){
$sql.="and partsnumber in(";
$sql.=implode(array_fill(0,count($pnk),"?"),",");
$sql.=")";
$data=array_merge($data,$pnk);

}

(デバック部分省略)


$stmt = $dbh->prepare($sql);
$stmt->execute($data);
$rows=$stmt->fetchAll();

}
catch(PDOException $e)
{
die($e->getMessage());
}

?>

(html部分省略)
<?php
if(count($rows)>0){
print "<tr>\n";
foreach($rows as $row){
foreach(["partsnumber","description","unitprice","stockqty"] as $val){

if($val=="unitprice") $row[$val]=number_format($row[$val]);
$$val=htmlspecialchars($row[$val]);
}


print <<<eof

<th class="th"><div id="sent14_stl">{$partsnumber}</div></th>
<th class="th"><div id="sent14_stl">{$description}</div></th>
<th class="th" align="right"><div id="sent14"_stl>{$unitprice}</div></th>
<th class="th"><div id="sent14_stl">{$stockqty}</div></th>
<th class="th"><div id="sent14_stl">{$suryo}</div></th>

eof;
print"<tr>\n";
}
}
?>

どうかわかりやすくアドバイスよろしくお願い致します。

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

  • >pnkとsuryoを行ごとにグルーピングしたいということでしょうか?
    グルーピングという表現がハマるのかはわかりませんが、pnk[]とpnk[]に対する入力数量suryoが1setになればいいうことなので、多分大丈夫だと思います。
    今回教えていただいたphpの部分は、(html部分省略)より下のif(count・・・(略)からprint<<<echoの間のforeach文を変更すればいいということでしょうか。
    お手数ですがご教示お願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/05/29 13:10
  • ご丁寧にありがとうございました。
    [1]は"aaa”と"なし"が表示。[2]は"bbb"と"123"が表示。[3]はsuryo側に"456"の入力はあるけどpnnmber側に値が入っていないので表示自体されない・・・ということですよね。
    教えていただいた通りそれぞれ表示することができました。ありがとうございました。ついでに1つ教えていただきたいことが・・・。今は同じファイル内の適当な場所にコードをかいてうまく表示できているのですが、これを正規の場所(テーブルの中)で表示をさせたいのです。下記のコードだと「array」がでてしまいます。
    <th class="th"><div id="sent14_stl">{$suryo}</div></th>←この部分
    SQLからのデータは{xxx}で問題なく表示されています。度々で申し訳ありませんがご教示お願い致します。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/05/29 16:13
  • お世話になっています。度々ですみません&説明不足ですみません。「テーブルに・・・」と記入したのは、投稿文は省略していますが表示結果テーブルがすでにありまして、そこに表示されるようにしたかったのです。
    <table width="80%">
    <td scope="col"><div id="sent16_stl_cen">Parts Number</div></td>
    (以降省略)
    <td scope="col"><div id="sent16_stl_cen">suryo</div></td>
    (PHP→forech文)

    行数が足りないので次に続きます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2018/05/30 15:46
  • print <<<eof
    <th class="th"><div id="sent14_stl">{$partsnumber}</div></th>
    (以降所略)
    <th class="th"><div id="sent14_stl">{$suryo]}</div></th>
    eof;
    print"<tr>\n";
    }

    ?>
    上記の”<th class="th"><div id="sent14_stl">{$suryo]}</div></th>”の部分にhtmlで入力した$suryo[]の値が表示されるようにしたいのです。
    「$partsnumber」はOR検索でヒットしたSQLデータが表示されています。同じように{$suryo[$key]}をいれると1行だけならば入力数値が反映されるのですが2行以上を同時検索すると結果は空白になります。
    大変お手数ですが再度アドバイスお願いします。

      補足日時:2018/05/30 15:56

A 回答 (3件)

pnkとsuryoを行ごとにグルーピングしたいということでしょうか?



<form method="post">
<P><input class="pnnmber" type="text" name="pnk[1]"><input class="suryo" type="text" name="suryo[1]" ></p>
<p><input class="pnnmber" type="text" name="pnk[2]"><input class="suryo" type="text" name="suryo[2]" ></p>
<p><input class="pnnmber" type="text" name="pnk[3]"><input class="suryo" type="text" name="suryo[3]" ></p>
<input type="submit" value="go">
</form>
<?php
foreach(["pnk","suryo"] as $val){
$$val=filter_input(INPUT_POST,$val,FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]);
$$val=array_filter(array_unique($$val),function($x){
return $x!=="";
});
}
print_r($pnk);
print_r($suryo);
?>
この回答への補足あり
    • good
    • 0

うまく伝わらないかもしれませんがこう



<form method="post">
<P><input class="pnnmber" type="text" name="pnk[1]" value="aaa"><input class="suryo" type="text" name="suryo[1]"></p>
<p><input class="pnnmber" type="text" name="pnk[2]" value="bbb"><input class="suryo" type="text" name="suryo[2]" value="123"></p>
<p><input class="pnnmber" type="text" name="pnk[3]"><input class="suryo" type="text" name="suryo[3]" value="456"></p>
<input type="submit" value="go">
</form>
<?php
foreach(["pnk","suryo"] as $val){
$$val=filter_input(INPUT_POST,$val,FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]);
$$val=array_filter(array_unique($$val),function($x){
return $x!=="";
});
}
foreach($pnk as $key=>$val){
print "pnk:{$key}={$val},suryo=".(isset($suryo[$key])?$suryo[$key]:"なし")."<br>\n";
}
?>

pnkのキーにあてはまるsuryoを表示することができます
この回答への補足あり
    • good
    • 0

組み込み方次第ですね。

やってることは#2と同じです

<form method="post">
<P><input class="pnnmber" type="text" name="pnk[1]" value="aaa"><input class="suryo" type="text" name="suryo[1]"></p>
<p><input class="pnnmber" type="text" name="pnk[2]" value="bbb"><input class="suryo" type="text" name="suryo[2]" value="123"></p>
<p><input class="pnnmber" type="text" name="pnk[3]"><input class="suryo" type="text" name="suryo[3]" value="456"></p>
<input type="submit" value="go">
</form>
<?php
foreach(["pnk","suryo"] as $val){
$$val=filter_input(INPUT_POST,$val,FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]);
$$val=array_filter(array_unique($$val),function($x){
return $x!=="";
});
}
if(count($pnk)>0){
print "<table border>\n";
print "<tr><th>pnk</th><th>suryo</th></tr>\n";
foreach($pnk as $key=>$val){
print "<tr>\n";
print "<td>{$val}</td><td>".(isset($suryo[$key])?$suryo[$key]:"なし")."</td>\n";
print "</tr>\n";
}
print "</table>\n";
}
?>
この回答への補足あり
    • good
    • 0

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