PHP DBの値とPOSTの値の差をだして文字列で結果表示するには - PHPプロ!Q&A掲示板

4960

  • 募集中!! 0P

PHP DBの値とPOSTの値の差をだして文字列で結果表示するには

質問日時 / 2018年7月6日 15:57    回答数 / 1件

Questioner:  memenaginagi  このエントリーをはてなブックマークに追加 

キーワード / PHP    値代入   

DBの値とPOSTした値との差を"○""△""×"で表示するようにはどうしたらいいでしょうか。

DBのnameが[stock]、htmlよりPOSTしてきたnameを[syryo]とします。[suryo]よりも[stock]のほうが+10以上あれば"○"。[suryo]よりも[stock]のほうが+1~+9であれば"△"。[stock]が0ならば"×"という表示にしたいのです。

単純に書くと・・・
1)[stock]=50 [suryo]=2 [stock]>([suryo]+10)=”○”
[suryo]よりも10以上あるので"○"
2)[stock]=8 [suryo]=2 [stock]は[suryo]より6多いので"△"
3)[stock]=0 [suryo]=9 [AAA]が0なので"×"

おそらく、ifと不等号をうまく組み合わせればできるだろうとは思い、不等号も記述する順番も何通りかしてみましたが思ったような結果が表示されません。

html
  1. <table width="750" border="0">
  2. <tr><td><div id="pg_title">Parts Order</div></td></tr>
  3. <td><form method="post" action="order_input_view.php">
  4. <div id="sent14">最大10件まで入力が可能です。</p>
  5. </div>
  6. <div align="center">
  7. <p><input class="pnnmber" type="text" name="pnk[1]" placeholder="番号"><input class="suryo" type="text" name="qty[1]" placeholder="数量"></p>
  8. <p><input class="pnnmber" type="text" name="pnk[2]" placeholder="部品番号"><input class="suryo" type="text" name="qty[2]" placeholder="数量"></p>
  9. -以下省略-
  10. </div>
  11. <table width="80%">
  12. <div align="center">
  13. <input type="submit" class="searbtton" value="Search"/>
  14. <input type="reset" class="searbtton" value="Clear"/>
  15. <input type="submit" class="searbtton" value="Order" formaction="order_input_view.php"/></div></table>
  16. </form></td></table>

php
  1. <?php
  2. foreach(["pnk","qty"] as $val){
  3.  $$val=filter_input(INPUT_POST,$val,FILTER_DEFAULT,["options"=>["default"=>[]],"flags"=>FILTER_REQUIRE_ARRAY]);
  4.  $$val=array_filter(array_unique($$val),function($x){
  5.  return $x!=="";
  6.  });
  7.  }
  8.  if(count($pnk)>0){
  9.  foreach($pnk as $key=>$val){
  10.  }
  11.  }
  12.   
  13. try{  
  14.   
  15. SQLサーバーへ接続
  16.  
  17. $sql='SELECT partsnumber,description,unitprice,stockqty FROM parts_price WHERE 1 ';
  18. $data=[];
  19.  if(count($pnk)>0){
  20.  $sql.="and partsnumber in(";
  21.  $sql.=implode(array_fill(0,count($pnk),"?"),",");
  22.  $sql.=")";
  23. $data=array_merge($data,$pnk);
  24.  
  25.  }
  26.  
  27. /*デバック用
  28. print $sql."<br>";
  29.  print_r($data);
  30. */
  31.   
  32.  
  33. $stmt = $dbh->prepare($sql);
  34. $stmt->execute($data);
  35. $rows=$stmt->fetchAll();
  36.  
  37. }
  38.   catch(PDOException $e)
  39. {
  40.   die($e->getMessage());
  41. }
  42.   
  43. ?>
  44.  
  45. <table width="80%" class="aaa">
  46.   <td scope="col"><div id="sent16_stl_cen">Parts Number</div></td>
  47.   <td scope="col"><div id="sent16_stl_cen">Description</div></td>
  48.   <td scope="col"><div id="sent16_stl_cen">Unit Price</div></td>
  49.   <td scope="col"><div id="sent16_stl_cen">Stock</div></td>
  50.   <td scope="col"><div id="sent16_stl_cen">suryo</div></td>
  51.   <td scope="col"><div id="sent16_stl_cen">shiran</div></td>
  52.   
  53. <?php
  54. print "<tr>\n";
  55. foreach($rows as $row){ 
  56. foreach(["partsnumber","description","unitprice","stockqty"] as $val){
  57.   
  58. if($val=="unitprice") $row[$val]=number_format($row[$val]);
  59. $$val=htmlspecialchars($row[$val]);  
  60. }
  61.  
  62. foreach($pnk as $key=>$val){
  63. if($val==$partsnumber){
  64. $show_qty = isset($qty[$key])?$qty[$key]:"なし";
  65. $kekka = ($stockqty)-($show_qty);
  66.  
  67. print <<<eof
  68.   
  69. <th class="th"><div id="sent14_stl">{$val}</div></th>
  70. <th class="th"><div id="sent14_stl">{$description}</div></th>
  71. <th class="th" align="right"><div id="sent14"_stl>{$unitprice}</div></th>
  72. <th class="th"><div id="sent14_stl">{$stockqty}</div></th>
  73. <th class="th"><div id="sent14_stl">{$show_qty}</div></th>
  74. <th class="th"><div id="sent14_stl">{$kekka}</div></th>
  75.  
  76. eof;
  77. print "<tr>\n";
  78.  
  79. break;  
  80. }
  81. }
  82. }
  83. ?>
  84.  
  85. </table>

phpの65行目ぐらいに$kekka = ($stockqty)-($show_qty);とあります。
今は単純な引き算のみにしていますが問題なく数値が表示されています。ここにif~を書いてみたのですが、思うように結果が表示されません。記述の順番や不等号の使い方が間違っているだろうとは思いますが、その要因がわかりません。
どなたかアドバイスをいただけないでしょうか。
宜しくお願い致します。


ツリー一覧

┗A01shimix>不等号も記述する順番も何通りかしてみましたが思っ

回答一覧

並び替え:

A01
answerershimix [7月6日 18:33]

>不等号も記述する順番も何通りかしてみましたが思ったような結果が表示されません。

どういう記述を試されたのかを書いてください。文法的に間違っているならエラーになるハズですので(デバッグ用にエラーは全部表示する設定ですよね)。



あと・・可変変数ばかりでロジックが読めません(可変変数の扱いばかりが気になってしまう)。正直「使い過ぎ」です。可変変数でしか書けないものは仕方ありませんが、そういうわけではありませんよね?
  1. <?php
  2. $pnk = [];
  3. $qty = [];
  4. if ((isset($_POST['pnk']))&&(is_array($_POST['pnk'))&&(isset($_POST['qty']))&&(is_array($_POST['qty'))) {
  5.   foreach ($_POST['pnk'] as $key=>$val) {
  6.     if (trim($val) === "") { continue}
  7.     $pnk[] = trim($val);
  8.     $qty[] = isset($_POST['qty'][$key]) ? intval($_POST['qty'][$key]) : 0;
  9.   }
  10. }
  11. echo "pnk<pre>";
  12. var_dump($pnk);
  13. echo "</pre>";
  14. echo "qty<pre>";
  15. var_dump($qty);
  16. echo "</pre>";
  17.  
  18. try{  
  19. // DBへ接続
  20.  
  21.   $sql='select * from parts_price';
  22.   if (count($pnk) > 0) {
  23.     $sql .= ' where partsnumber in (' . implode(''array_fill(0count($pnk)'?')) . ')';
  24.   }
  25.  
  26.   $stmt = $dbh->prepare($sql);
  27.   $stmt->execute($pnk);
  28.   $rows=$stmt->fetchAll();
  29. } catch(PDOException $e) {
  30.   die($e->getMessage());
  31. }
  32. ?>
  33. <table width="80%" class="aaa">
  34. <td scope="col"><div id="sent16_stl_cen">Parts Number</div></td>
  35. <td scope="col"><div id="sent16_stl_cen">Description</div></td>
  36. <td scope="col"><div id="sent16_stl_cen">Unit Price</div></td>
  37. <td scope="col"><div id="sent16_stl_cen">Stock</div></td>
  38. <td scope="col"><div id="sent16_stl_cen">suryo</div></td>
  39. <td scope="col"><div id="sent16_stl_cen">shiran</div></td>
  40.  
  41. <?php
  42. $trhtml = <<<eot
  43. <tr>
  44. <th class="th"><div id="sent14_stl">%s</div></th>
  45. <th class="th"><div id="sent14_stl">%s</div></th>
  46. <th class="th" align="right"><div id="sent14"_stl>%s</div></th>
  47. <th class="th"><div id="sent14_stl">%d</div></th>
  48. <th class="th"><div id="sent14_stl">%s</div></th>
  49. <th class="th"><div id="sent14_stl">%s</div></th>
  50. </tr>
  51. eot;
  52. foreach ($rows as $row) {
  53.   $show_qty = "なし";
  54.   $kekka = "";
  55.   foreach($pnk as $key=>$val){
  56.     if($val !== $row['partsnumber']){ { continue}
  57.     $show_qty = sprintf('%d'$qty[$key]);
  58.     $kekka = sprintf('5d'$row['stockqty'] - $qty[$key]);
  59.     // ここで $row['stockqty']と$qty[$key]を比較して、$kekkaに何らかの文字をセットしてもよい
  60.     break;
  61.   }
  62.   printf($trhtml
  63.       htmlspecialchars($row['partsnumber']ENT_QUOTES),
  64.       htmlspecialchars($row['description']ENT_QUOTES),
  65.       number_format($row['unitprice']),
  66.       $row['stockqty'],
  67.       $show_qty,
  68.       $kekka);
  69. }
  70. ?>
  71. </table>

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)