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

4960

  • 0P

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

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

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-1memenaginagi早速アドバイスありがとうございました。 また1週
  ┗A01-1-1shimixあ、すみません。単純なtypoですかね(汗 >>CODE i
   ┗A01-1-1-1memenaginagiお世話になっております。昨日、投稿したつもりだった
    ┗A01-1-1-1-1shimixこちらでは、そのエラーは出ませんねぇ・・・ 念の
     ┗A01-1-1-1-1-1memenaginagiお世話になっております。 コードありがとうございま

回答一覧

並び替え:

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へ

A01-1
replyermemenaginagi [7月17日 16:35]

早速アドバイスありがとうございました。

また1週間以上放置してしまって申し訳ありません。専任業務ではないので他業務で時間をとられてしまってるうちに放置という結果となってしまいました。大変失礼しました。

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

上記の件ですが「$kekka = ($stockqty)-($show_qty);」の状態にする前に思考錯誤したコードはもちろん残っておらず、また結果もどの組み合わせで「arry」が表示されてしまったのか、なるはずもないのに検索結果がすべて同じ数量になったのかなど覚えておりません。ただ質問時に記載したように、単純にエクセル関数のようなif複数条件を使っただけなのです。重ね重ね申し訳ありません。

今回アドバイスしていただきましたコードで56行目~58行目の3行だけがsynax error whitespaceのエラーがでてしまい、実際のところ画面場での確認ができておりません。
度々で申し訳ありませんがご教示お願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [7月17日 18:05]

あ、すみません。単純なtypoですかね(汗
  1. if($val !== $row['partsnumber']) { continue; }

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyermemenaginagi [7月20日 13:14]

お世話になっております。昨日、投稿したつもりだったのですがされてなかったので再投稿です。(もしダブってましたらすみません)
アドバイスいただきました167行目
  1. if($val !== $row['partsnumber']) { continue; }
に変更しましたが、やはりエラーは変わりません。スペースでひっかかってる部分があるのか?と思い(スペースがあるように見える箇所に実は入ってなかったり、逆にスペースがないように見えて実は入っていたり・・・。)単純にこちらに明記されているコードをコピペしてみたのですがそれでも状況が変わりませんでした。
現時点でのエラーは167行目、168行目、169行目のエラーが下記のようにでます。
syntax error,unexpected quoted-string and whitespace(T_ENCAPSED_AND_WHITESPACE)
167行目のみ上記のエラーに追加があります。
expexting identifier(T_STRING)or variable(T_VARIABLE) or number(T_NUM_STRING)

お手数ですがエラー内容を確認していただきアドバイスいただければ幸いです。
宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyershimix [7月20日 16:42]

こちらでは、そのエラーは出ませんねぇ・・・

念のためtypoを修正したバージョンを転記しておきます(汗

  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.   $sql='select * from parts_price';
  21.   if (count($pnk) > 0) {
  22.     $sql .= ' where partsnumber in (' . implode(''array_fill(0count($pnk)'?')) . ')';
  23.   }
  24.   $stmt = $dbh->prepare($sql);
  25.   $stmt->execute($pnk);
  26.   $rows = $stmt->fetchAll();
  27. } catch(PDOException $e) {
  28.   die($e->getMessage());
  29. }
  30. ?>
  31. <table width="80%" class="aaa">
  32. <td scope="col"><div id="sent16_stl_cen">Parts Number</div></td>
  33. <td scope="col"><div id="sent16_stl_cen">Description</div></td>
  34. <td scope="col"><div id="sent16_stl_cen">Unit Price</div></td>
  35. <td scope="col"><div id="sent16_stl_cen">Stock</div></td>
  36. <td scope="col"><div id="sent16_stl_cen">suryo</div></td>
  37. <td scope="col"><div id="sent16_stl_cen">shiran</div></td>
  38.  
  39. <?php
  40. $trhtml = <<<eot
  41. <tr>
  42. <th class="th"><div id="sent14_stl">%s</div></th>
  43. <th class="th"><div id="sent14_stl">%s</div></th>
  44. <th class="th" align="right"><div id="sent14"_stl>%s</div></th>
  45. <th class="th"><div id="sent14_stl">%d</div></th>
  46. <th class="th"><div id="sent14_stl">%s</div></th>
  47. <th class="th"><div id="sent14_stl">%s</div></th>
  48. </tr>
  49. eot;
  50. foreach ($rows as $row) {
  51.   $show_qty = "なし";
  52.   $kekka = "";
  53.   foreach($pnk as $key=>$val) {
  54.     if ($val !== $row['partsnumber']) { continue}
  55.     $show_qty = sprintf('%d'$qty[$key]);
  56.     $kekka = sprintf('5d'$row['stockqty'] - $qty[$key]);
  57.     // ここで $row['stockqty']と$qty[$key]を比較して、$kekkaに何らかの文字をセットしてもよい
  58.     break;
  59.   }
  60.   printf($trhtml,
  61.     htmlspecialchars($row['partsnumber']ENT_QUOTES),
  62.     htmlspecialchars($row['description']ENT_QUOTES),
  63.     number_format($row['unitprice']),
  64.     $row['stockqty'],
  65.     $show_qty,
  66.     $kekka);
  67. }
  68. ?>
  69. </table>

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyermemenaginagi [7月23日 17:29]

お世話になっております。
コードありがとうございました。今回、単純に全ての部分をコピペしてみたところ、エラーがでませんでした。
167行目~169行目が原因だったわけではなく他の部分が悪さしていて、エラーがでてしまっていたのですかね。
これから$kekkaに代入するための計算式を作ってみようと思います。また何かわからないことがあればご質問させてもらいます。本当に助かりました。ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

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

>>続きを読む

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

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

Q&A掲示板 新着情報