質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

7379閲覧

[PHP]POSTに失敗してしまいます

newyee

総合スコア213

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/08/17 02:26

PHP勉強中の者です。現在自動販売機作成ツールの管理画面を作成しているのですが、POSTの処理につまずいてしまっています。
ご教授頂ければ幸いです。
現在作成しているコードは以下の通りです。
DBへの接続情報は隠させていただいています。
※文字数制限の為続きはコメント欄にて書かせていただきます。

php

1header("Content-type: text/html; charset=utf-8"); 2const HOST = ''; 3const DB_NAME = ''; 4const USER_NAME = ''; 5const PASSWORD = ''; 6$drink_name = ''; 7$drink_price = 0; 8$drink_quantity = 0; 9$drink_status = 0; 10$drink_id = 0; 11$tmp_file = ''; 12$file_name = ''; 13$upload_file_name = ''; 14$success_msg = array(); 15$err_msg = array(); 16$drink_info_list = array(); 17 18//DB接続 19if(($link = mysqli_connect(HOST,USER_NAME,PASSWORD,DB_NAME)) !== FALSE){ 20 21 mysqli_set_charset($link,'UTF8'); 22 23 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 24 25 $submit_type = $_POST['submit_type']; 26 27 switch ($submit_type) { 28 case 'add_item': 29 // 新規商品追加の場合 30 31 //POSTされた値を取得 32 $drink_name = $_POST['drink_name']; 33 $drink_price = $_POST['drink_price']; 34 $drink_quantity = $_POST['drink_quantity']; 35 $drink_status = (int)$_POST['public_status']; 36 37 38 $tmp_file = $_FILES['drink_img']['tmp_name']; 39 40 $file_name = 'img/' . $_FILES['drink_img']['name']; //hogehoge.php 41 42 43 // 登録値チェック 44 /* 45 46 17/08/15 47 issetは入力値判定には使えません。 48 issetは、「宣言されているか」というチェックになります。 49 50 入力されてるか、のチェックは言い換えると 51 (文字入力の場合は)変数の中の文字数が0文字より多いか 52 (数値の場合は)変数の中の数値が0より大きいか 53 というチェックです。 54 55 */ 56 57 // 1.名前が入力されているか 58 if($drink_name === '' ){ 59 $err_msg[] = '名前が入力されていません'; 60 } 61 // 2.値段が入力されているか 62 if($drink_price < 0 ){ 63 $err_msg[] = '値段が入力されていません'; 64 } 65 // 3.値段が数値か 66 if(ctype_digit($drink_price) === FALSE){ 67 $err_msg[] = '値段を入力してください'; 68 } 69 // 4.在庫数が入力されているか 70 if($drink_quantity < 0 ){ 71 $err_msg[] = '個数が入力されていません'; 72 } 73 // 5.在庫数が数値かどうか 74 if(ctype_digit($drink_quantity) === FALSE){ 75 $err_msg[] = '数値を入力してください'; 76 } 77 // 6.ファイルの拡張子チェック 78 // substr = sub string -> 文字の抜き取り 79 // strrpos = string reverse position -> 対象の文字が何文字目にあるか? 80 // strpos = string position 81 82 // strpos('あいうえお', 'あ') -> 0 83 // strrpos('あいうえお', 'あ') -> 0 84 85 //strrpos('cola.jpg', '.') -> 4 86 // substr('cola.jpg', 4) -> jpg 87 88 // substr('apple.jpg', strrpos('apple.jpg', '.') + 1); 89 // substr('apple.jpg', 5 + 1); 90 // $ext = substr('apple.jpg', 6);// 91 // 第一引数の文字を、第二引数の数値以降分抜き出す 92 // 第三引数がある場合は、その数byte分抜き出す 93 94 // strpos 95 // strrpos 96 97 $ext = substr($file_name, strrpos($file_name, '.') + 1); 98 if(!($ext === 'jpeg' || $ext === 'jpg' || $ext === 'png')){ 99 $error_msg[] = 'ファイル形式が異なります。画像ファイルはJPEG又はPNGのみ利用可能です。'; 100 } 101 102 // エラーがなかったら(validation check に引っかからなかった場合に登録) 103 if (count($error_msg) === 0) { 104 105 mysqli_autocommit($link, false); 106 107 // 1.INSERT to DB 108 109 // create sql 110 $sql = 'INSERT INTO drink_info_table(drink_name,price,status) VALUES(' . '\'' . $drink_name . '\',' . $drink_price . ',' . $drink_status . ')'; 111 112 // exec sql 113 if(mysqli_query($link,$sql) !== FALSE ){ 114 115 $drink_id = mysqli_insert_id($link); 116 117 // create sql 118 $sql = 'INSERT INTO drink_stock_table(drink_id, stock_number) VALUES (' . $drink_id . ',' . $drink_quantity . ')'; 119 120 // exec sql 121 if(mysqli_query($link,$sql) !== FALSE ){ 122 123 } else{ 124 $err_msg[] = 'drink_stock_table:insertエラー:' . $sql; 125 } 126 127 }else{ 128 $err_msg[] = 'drink_info_table:insertエラー:' . $sql; 129 } 130 131 // 2.UPLOAD PIC 132 if (count($error_msg) === 0) { 133 if (is_uploaded_file($tmp_file) === TRUE){ 134 $upload_file_name = 'img/' . $drink_id . '.' . $ext; 135 136 if ( move_uploaded_file($tmp_file,$upload_file_name) === TRUE){//同名ファイルがアップロードされた場合の処理 137 138 } else { 139 $err_msg[] = 'ファイルがアップロードできません'; 140 } 141 142 } else { 143 $err_msg[] = 'ファイルが選択されていません'; 144 } 145 } 146 147 // トランザクション成否判定 148 if(count($err_msg) === 0){ 149 $success_msg[] = '商品追加成功'; 150 mysqli_commit($link); 151 }else{ 152 mysqli_rollback($link); 153 } 154 } 155 156 break; 157 158 case 'change_value': 159 // 在庫数変更の場合 160 161 if(isset($_post['update_stock'])){ 162 $update_stock = (int)$_post['update_stock']; 163 $sql = 'UPDATE drink_stock_table SET stock_number = ' . $update_stock . 'WHERE drink_id = ' . $drink_id;//間違え 164 if(mysqli_query($link,$sql) === TRUE){ 165 $success_msg [] = '在庫変更成功'; 166 }else{ 167 $err_msg[] = 'UPDATE drink_stock_table:updateエラー:' . $sql; 168 } 169 //if($_POST['change_status']){ 170 // $success_msg [] = 'ステータス変更成功'; 171 //} 172 }$err_msg[] = '在庫変更失敗'; 173 174 break; 175 176 case 'change_status': 177 // ステータス変更の場合 178 if(isset($_POST['change_status']) === '公開->非公開'){ 179 $sql = 'UPDATE drink_info_table SET status = 0 WHERE drink_id = ' . $drink_id; 180 if(mysqli_query($link,$sql) === FALSE){ 181 $err_msg[] = 'ステータス変更失敗'; 182 183 } 184 }elseif(isset($_POST['change_status']) === '非公開->公開') { 185 186 $sql = 'UPDATE drink_info_table SET status = 1 WHERE drink_id = ' . $drink_id; 187 if(mysqli_query($link,$sql) === FALSE){ 188 $err_msg[] = 'ステータス変更失敗'; 189 } 190 }else{ 191 $err_msg[] = 'ステータス変更失敗'; 192 } 193 break; 194 195 } 196 197 198 } // POST end 199 200 //DBの値を取得 201 $sql = 'SELECT drink_info_table.drink_id,drink_name,price,status,stock_number 202 FROM drink_info_table 203 JOIN drink_stock_table 204 ON drink_info_table.drink_id = drink_stock_table.drink_id;'; 205 if($result = mysqli_query($link,$sql)){ 206 $i = 0; 207 while($row = mysqli_fetch_assoc($result)){ 208 $drink_info_list[$i]['drink_id'] = htmlspecialchars($row['drink_id'],ENT_QUOTES, 'UTF-8'); 209 $drink_info_list[$i]['drink_name'] = htmlspecialchars($row['drink_name'],ENT_QUOTES, 'UTF-8'); 210 $drink_info_list[$i]['price'] = htmlspecialchars($row['price'],ENT_QUOTES, 'UTF-8'); 211 $drink_info_list[$i]['status'] = htmlspecialchars($row['status'],ENT_QUOTES, 'UTF-8'); 212 $drink_info_list[$i]['stock_number'] = htmlspecialchars($row['stock_number'],ENT_QUOTES, 'UTF-8'); 213 214 $i++; 215 216 217 } 218 219 } 220}else{ 221 $err_msg[] = 'DB接続失敗'; 222} 223

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/17 02:28

何を実現したいのか、しかしどういうエラーが発生しどういう現象が発生するのか、を書いてほしい。
kei344

2017/08/17 02:30

「失敗」とはどのような状況でしょうか。出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。
newyee

2017/08/17 02:38

ただいまコメント欄につい追記させて貰いました。すみません。コードが長くなってしまい。切り抜いての説明が難しいと思ったもので...
guest

回答2

0

ベストアンサー

$_POSTです。$_postではありません。

isset($_post['update_stock'])

こちらを

isset($_POST['update_stock'])

と変更してみてください。

また、SQL文に誤りがあります。

$sql = 'UPDATE drink_stock_table SET stock_number = ' . $update_stock . 'WHERE drink_id = ' . $drink_id;//間違え

となっていますが、

$sql = 'UPDATE drink_stock_table SET stock_number = ' . $update_stock . ' WHERE drink_id = ' . $drink_id;//間違え

のように、WHEREの前に空白ができるようにしてください。

また、UPDATEの際、$drink_idが常に0になってしまっていますので

<input type="hidden" name="drink_id" value="<?php echo $drink_id ?>">

をHTMLに含めて、PHP側で

if (isset($_POST['drink_id'])){ $drink_id = $_POST['drink_id']; }

も追加してください。

投稿2017/08/17 02:39

編集2017/08/17 04:33
tsuemura

総合スコア663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2017/08/17 02:47

早速の回答ありがとうございます。 訂正してみた所、isset($_POST['update_stock'])ここの部分に関しましてはTUREとなり解決することができました。 ただUPDATEエラーがでてしまったんですけど、これはPOSTと関係ない所ですもんね。。。
tsuemura

2017/08/17 02:52

エラーの内容を教えてもらえますか? mysqli_error($link) で取得できると思います。
newyee

2017/08/17 03:01

返信ありがとうございます。 下記がエラーの内容となります 「UPDATE drink_stock_table:updateエラー:UPDATE drink_stock_table SET stock_number = 0WHERE drink_id = 0」 在庫数を入力しても、stock_number = 0となっていることから反映されていないのではないかと思っています...
tsuemura

2017/08/17 03:15

回答に追記しましたが、 SET stock_number = 0WHERE drink_id = 0 となっていますので、 SET stock_number = 0 WHERE drink_id = 0 のように、前の文と後の文の間に空白を空けましょう。
newyee

2017/08/17 04:05

ありがとうございます。エラーもでず在庫数変更と表示もでました。 ただ、一点だけ気になることがあるのですが、エラーなくUPDATEが成功しているのですが、入力した在庫数がデフォルトの表示から変わらず、例えば「3→4」に変更した場合でも「3」のままの表示なっているんですよね...データベースの中身も変更がないままです。 <input type="text"name="update_stock" value="<?php echo $values['stock_number']?>"> ここの$values['stock_number']に問題があるとみているのですが、何故なのか分からないです...
tsuemura

2017/08/17 04:31

いや、$drink_idが常に0になっているからではないでしょうか。 HTMLのformに、データベースから取得したdrink_idを載せて、POSTリクエストにdrink_idが含まれるようにしてください。回答にサンプルを追記しておきます。
newyee

2017/08/17 04:56

ありがとうございます。 参考にさせて頂きます。
guest

0

HTML

1 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <title>自動販売機</title> 7 <style> 8 table,th,tr,td{ 9 border:solid 1px; 10 } 11 </style> 12</head> 13<body> 14 <?php foreach($success_msg as $value){?> 15 <p><?php echo $value;?></p> 16 <?php } ?> 17 <?php foreach($err_msg as $value){?> 18 <p><?php echo $value;?></p> 19 <?php } ?> 20 <h1>自動販売機管理ツール</h1> 21 <section> 22 <h2>新規商品追加</h2> 23 <form method="post" enctype="multipart/form-data"> 24 <div> 25 <label>名前<input type="text" name="drink_name"></label> 26 </div> 27 <div> 28 <label>値段<input type="text" name="drink_price"></label> 29 </div> 30 <div> 31 <label>個数<input type="text" name="drink_quantity"></label> 32 </div> 33 <div><input type="file"name="drink_img"></div> 34 <div> 35 <select name="public_status"> 36 <option value="0">非公開</option> 37 <option value="1">公開</option> 38 </select> 39 </div> 40 <div><input type="submit" value="送信"></div> 41 <input type="hidden" name="submit_type" value="add_item" /> 42 </form> 43 </section> 44 <section> 45 <h2>商品情報変更</h2> 46 <table> 47 <caption>商品一覧</caption> 48 49 <tbody> 50 <tr> 51 <th>商品画像</th> 52 <th>商品名</th> 53 <th>価格</th> 54 <th>在庫数</th> 55 <th>ステータス</th> 56 </tr> 57 <!-- foreachで回す --> 58 <!-- 在庫数変更のform --> 59 60 <?php foreach ($drink_info_list as $values) { 61 //var_dump($values); 62 //exit(); 63 ?> 64 65 <tr> 66 67 <form method ="post"> 68 <td><img src="<?php $upload_file_name ;?>"></td> 69 <td><?php echo $values['drink_name']; ?></td> 70 <td><?php echo $values['price']?></td> 71 <td> 72 <input type="text"name="update_stock" value="<?php echo $values['stock_number']?>"> 73 <input type="submit"value="変更"> 74 </td> 75 <input type="hidden" name="submit_type" value="change_value" /> 76 </form> 77 <!-- ステータス変更のform --> 78 <form method ="post"> 79 <td> 80 81 <?php if((int)$values['status'] === 1){ ?> 82 <input type="submit" name="change_status" value="公開->非公開"> 83 <?php } else { ?> 84 <input type="submit" name="change_status" value="非公開->公開"> 85 <?php } ?> 86 87 88 </td> 89 <input type="hidden" name="submit_type" value="change_status"> 90 </form> 91 92 <?php } ?> 93 </tr> 94 95 </tbody> 96 </table> 97 </section> 98</body> 99</html>

ここまでが現在作成しているコードとなります。

投稿2017/08/17 02:28

newyee

総合スコア213

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2017/08/17 02:35

長くなってしまいすみません。 切り抜いてご説明するのは難しいと思ったもので... 問題となっている箇所なのですが、HTML内の、 <input type="text"name="update_stock" value="<?php echo $values['stock_number']?>"←ここの部分でPOSTされた値が if(isset($_post['update_stock']))←ここのif文でFALSEとなってしまい在庫数を変更することができません。 ステータス変更の部分についても同様に、 <?php if((int)$values['status'] === 1){ ?> <input type="submit" name="change_status" value="公開->非公開"> <?php } else { ?> <input type="submit" name="change_status" value="非公開->公開"> <?php } ?> ここでPOSTした値が、FALSEとなってしまいステータス変更ができずにいます...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問