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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

10647閲覧

[PHP]自動販売機ツール作成中なのですが、つまずいてしまい先へ進めません...

newyee

総合スコア213

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2017/09/14 14:27

編集2017/09/14 14:29

現在、PHPの勉強で自動販売機ツールを作成中なのですが、うまく動作させることができず完全につまずいてしまっている状態です...
以下に僕のコードを記載させて頂きますが、主につまずいてしまっている点と致しましては3つございます。
一つ目は、商品追加ボタンを押しても、商品が追加されず一覧に表示されない。
2つ目は、在庫数を入力し変更ボタンを押してもUPDATEされない。
3つ目は、ステータス変更ボタンを押してもステータスが変更されない。
自動販売機ツールについてなのですが、実際に一度つくり上げることはできたのですが、MVCモデルの勉強の為(Controller,model,view)の3つのファイルに分けてもう一度作りなおしている段階です。
現在は管理画面を作成しています。
使用しているデータベースは以前作成したものと同じものを、使用しています。
なので、一度もDBへのINSERTには成功していないのですが商品一覧が出力されている状態です。
文字数制限の為、入力チェックなどを行っている「model.php」につきましては、割愛させていただこうと思います。
以下が「Controller.php」となります。

PHP

1<?php 2// 設定ファイル読み込み 3require_once '../include/conf/const.php'; 4// 関数ファイル読み込み 5require_once './model.php'; 6 7$drink_info_list = array(); 8$err_msg = array(); 9$success_msg = array(); 10$drink_name = ''; 11$price = 0; 12$stock = 0; 13$status = 0; 14$file_name =''; 15$drink_id = 0; 16$ext = ''; 17$link = get_db_connect(); 18if($_SERVER['REQUEST_METHOD'] === 'POST'){ 19 20 $submit_type = $_POST['submit_type']; 21 //var_dump($submit_type);exit(); 22 23 switch ($submit_type) { 24 case 'add_item': 25 26 $drink_name = $_POST['drink_name']; 27 $price = $_POST['price']; 28 //var_dump($price);exit(); 29 $stock = $_POST['stock']; 30 $status = $_POST['public_status']; 31 32 //登録値チェック 33 $err_msg[] = entry_name_check($drink_name); 34 $err_msg[] = entry_check_price($price); 35 $err_msg[] = entry_check_stock($stock); 36 //var_dump($price);exit(); 37 38 //アップロードファイル名を変数に代入 39 $temp_file = $_FILES['new_img']['tmp_name']; 40 $file_name = '../img' . $_FILES['new_img']['name']; 41 42 //拡張子取得 43 $ext = extention($file_name); 44 //拡張子チェック 45 $err_msg[] = extention_check($ext); 46 47 //ファイルパス+ファイル名 48 $upload_file = '../img' . $drink_id . $ext; 49 50 if(count($err_msg) === 0){ 51 52 //トランザクション開始 53 mysqli_autocommit($link, $false); 54 55 $sql = 'INSERT INTO drink_info_table(drink_name,price,status)VALUES(\'' . $drink_name . '\',' . $price . ',' . $status . ')'; 56 57 if(mysqli_query($link,$sql) === TRUE){ 58 59 $drink_id = mysqli_insert_id($link); 60 61 //drink_stock_tableにinsert 62 $err_msg[] = insert_drink_stock_table($drink_id,$stock); 63 64 }else{ 65 $err_msg[] = 'drink_info_table:insertエラー' . $sql; 66 } 67 68 //アップロード処理 69 $err_msg[] = upload_img($file_name,$temp_file,$upload_file); 70 71 //トランザクション成否判定 72 if(count($err_msg) === 0){ 73 74 $success_msg[] = '商品追加成功'; 75 76 mysqli_commit($link); 77 78 }else{ 79 $err_msg[] = '商品追加失敗'; 80 mysqli_rollback($link); 81 } 82 } 83 84 break; 85 86 case'change_value': 87 88 $drink_id = (int)$_POST['drink_id']; 89 90 if(isset($_POST['update_stock'])){ 91 $update_stock = (int)$_POST['update_stock']; 92 93 $sql = 'UPDATE drink_stock_table SET stock_number = ' . $update_stock . ' WHERE drink_id = ' . $drink_id; 94 95 if(mysqli_query($link,$sql) === TRUE){ 96 $success_msg [] = '在庫変更成功'; 97 }else{ 98 $err_msg[] = 'UPDATE drink_stock_table:updateエラー:' . $sql; 99 } 100 }else{ 101 $err_msg[] = '在庫変更失敗'; 102 } 103 104 break; 105 106 case 'change_status': 107 108 109 $status = (int)$_POST['status']; 110 $drink_id = (int)$_POST['drink_id']; 111 112 if(($status) === 1){ 113 114 $sql = 'UPDATE drink_info_table SET status = 0 WHERE drink_id = ' . $drink_id; 115 116 if(mysqli_query($link,$sql) === FALSE){ 117 118 $err_msg[] = 'drink_info_table:UPDATEエラー' . $sql; 119 120 }else{ 121 122 $success_msg[] = 'ステータス変更成功'; 123 } 124 125 }else{ 126 $sql = 'UPDATE drink_info_table SET status = 1 WHERE drink_id = ' . $drink_id; 127 128 if(mysqli_query($link,$sql) === FALSE){ 129 130 $err_msg[] = 'drink_info_table:UPDATEエラー' .$sql; 131 132 }else{ 133 134 $success_msg[] = 'ステータス変更成功'; 135 } 136 137 } 138 139 break; 140 141 } 142 143} 144 145//drink_info_table取得 146$drink_info_list = get_drink_table($link); 147 148 149//特殊文字をHTMLエンティティに変換 150$drink_info_list = entity_as_array($drink_info_list); 151//var_dump($drink_info_list);exit(); 152 153include_once './view.php'; 154 155 156?>

以下はview.phpとなります。
![イメージ説明]
イメージ説明
イメージ説明
イメージ説明
以下は実行画面となります。
イメージ説明

お手数ですが、どなたか教えて下さる方いましたらご教授願えれば幸いです...

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、問題の切り分けのためtry{} catch(){}で囲ってみたほうが良いと思います。ロジックのミスの場合はこのコードでは解決しないので、下記で問題がないようならecho,var_dump()などでどこまでコードが実行されているか、範囲を狭めるように探していきます。

こういう作業がめんどうであればxdebugなどを使ってステップ実行するとすぐに解決できます。

php

1try { 2 $link = get_db_connect(); 3 if($_SERVER['REQUEST_METHOD'] === 'POST'){ 4 ... 5 } 6 $drink_info_list = get_drink_table($link); 7 $drink_info_list = entity_as_array($drink_info_list); 8 include_once './view.php'; 9} catch (Exception $e) { 10 //デバッグ 11 echo '<pre>'; 12 echo 'エラーファイル:'. $e->getFile() ."\n"; 13 echo 'エラー行:'. $e->getLine() ."\n"; 14 echo 'エラー内容:'. $e->getMessage() ."\n\n"; 15 echo 'トレース:'. print_r($e->getTrace()) ."\n"; 16 echo '</pre>'; 17 exit(); 18}

SQLのコネクションはきちんと取得できていますでしょうか?

商品更新もできないということは、コネクション(ハンドラー)が取得できていない可能性が高いです。下記のようにデバッグしてみてはいかがでしょうか。

model.phpでコネクションエラー処理を行っているのであれば下記コードは書かなくてよいです。

php

1try { 2 $link = get_db_connect(); 3 4 //コネクションエラー処理 5 if (! $link) { 6 echo mysqli_connect_error(); 7 }

また、SQLエラーは下記のようにmysqli_error()を使うとDBからのエラーメッセージを取得可能です。

php

1if (! mysqli_query(...)) { 2 $err_msg[] = '...エラー:'.mysqli_error($link); 3}

新規商品追加について、下記のようにアップロードファイルがあるのか、ないのか条件分岐せずに書いてあるので添付ファイルないときはエラーが出ているはずです。

php

1$temp_file = $_FILES['new_img']['tmp_name'];

同じURLにPOSTしているので大丈夫なのでしょうが、フォーム関連のHTMLは最低限きちんと書いたほうが良いです。通常、POST時のエンコードはURLエンコードを行うapplication/x-www-form-urlencodedで、初期値なので指定する必要はありません。action先がないのできちんと指定したほうが良いです。

もちろん、同じPHPにPOSTしていると思うので、結果は変わりません。

html

1<form action="POST先URL" method="post"> 2 ... 3</form> 4<!-- ファイルアップロードがある時 --> 5<form action="POST先URL" method="post" enctype="multipart/form-data"> 6 ... 7</form>

投稿2017/09/14 19:12

Tomak

総合スコア1652

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

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

newyee

2017/09/15 13:25

ご回答下さりありがとうございます! ご説明くださったように、var_dumpで少しずつ調べていったらエラーを一つずつ見つけることができました。しかしながら、またアップロードチェックの所でつまずいてしまっているのですけどね... まぁなんとか粘ってやってみようともいます!
Tomak

2017/09/15 13:33

新規商品追加について、まずは、アップロードなしで新規商品追加ができるか試してみるとよいと思います。 在庫数更新はうまくいったでしょうか? 不具合箇所が絞れたなら、それぞれのswitch()のケースで分けて質問内容を修正してみてはいかがでしょうか? もちろん自力で解決できそうであればそれにこしたことないですが。
newyee

2017/09/15 13:40

ご返信感謝いたします。 アドバイス頂いた通り、アップロード処理をせずに商品を追加しましたら、商品追加成功と表示され、商品を追加することができました! 在庫数変更に関しましては、商品追加のフォームが全て完成してからにしようと思っているので、まだ手をつけていない状態です... 商品追加に関しましての最大の難関は、アップロード処理をどうするか...なんですよね... 結構粘ったのですがほんとに何故なのか理解できなくて... model.phpのアップロード処理を書いた、関数と合わせて少し見て頂くことは可能でしょうか...?
newyee

2017/09/15 14:05

すみません。今見直していたらかなりミスをおかしていました... $err_msg[] = upload_img($temp_file,$file_name,$upload_file); 上記の「$temp_file」を$tmp_fileにしていたという... なんですけど、まだ画像は保存されておらず表示もできていないので、その辺り調べてみようと思います!
Tomak

2017/09/15 14:25

全版なのですが、ファイルパスのスラッシュが抜けていると思います。「../img」ではなく「../img/」なのではないでしょうか? 例えば、下記のようなコードです。 ---- $file_name = '../img/' . $_FILES['new_img']['name'];
newyee

2017/09/15 14:29

チェックして頂きありがとうございます。 最後のスラッシュ、というのは、「img」の中を指定したいからスラッシュを最後につける、ということでしょうか? ファイルパスについても、あまり詳しくなくて初歩的なご質問になってしまい申し訳ないです...
newyee

2017/09/15 14:43

ご指摘頂いた通り修正しましたら、アップロードができ「img」フォルダにアップロードファイルが格納できました。ありがとうございます。 まだ表示はできていないのですが、view.phpの以下の部分でおかしな点などはありますでしょうか...? <td><img src="../img/<?php echo $value['drink_id'] . $ext ;?>"></td>
Tomak

2017/09/15 14:45

../ ← これは上のディレクトリ(フォルダー) ./ ← これは現在のディレクトリ(フォルダー) 画像ファイルはimgディレクトリに入っていて、そのディレクトリの位置はひとつ上の階層ですよね? ですので下記のような書き方になるわけです。 ---- ../img/画像ファイル名.jpg スラッシュ自体はディレクトリの「区切り」の意味です。Windowsだとディレクトリの区切りは「\」です。PHPは普通Linuxなのでディレクトリの区切りに「/」を使います。 '../img/' . $_FILES['new_img']['name']; ---- つぎに↑これについてです。 $_FILES['new_img']['name'] ←これは画像ファイル名です(拡張子あり) ですのでコードの中にいくつか存在している「../img」の表記は「../img/」とならなければならないはずです。
newyee

2017/09/15 14:50

なるほど... ご丁寧に教えて頂きありがとうございます... はい。imgディレクトリは一つ上の階層です! ご指摘頂きました点はすべて修正してみました! 本当にご丁寧にご指導いただき感謝しかございません...
Tomak

2017/09/15 14:51

ブラウザでHTMLソースを表示して下記部分の画像URLを確認してみます。 ブラウザのURLロケーションバーに画像のURLを直接入力してみて正しい画像URLと、HTMLソートの差分を確認すれば、何をどうすれば画像が表示されるようになるかわかると思います。 ---- <td><img src="../img/<?php echo $value['drink_id'] . $ext ;?>"></td>
newyee

2017/09/15 15:07

ご回答下さったやり方が分からなかったので、var_dumpなどをして見比べてみたのですが、違った所はないと思うですよね... ただ一点、$value['drink_id']の中身を確認しようとvar_dumpしてみたのですが、確認はできなかったのですが、おそらくはアップロードされた画像と同じかと思われます...
newyee

2017/09/16 09:54

アドバイス頂きありがとうございました。 取り敢えずここの部分は新しく質問としてまとめて、投稿致したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問