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

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

ただいまの
回答率

90.49%

  • PHP

    20770questions

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

  • phpMyAdmin

    666questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,082

newyee

score 115

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

<?php 
// 設定ファイル読み込み
require_once '../include/conf/const.php';
// 関数ファイル読み込み
require_once './model.php';

$drink_info_list = array();
$err_msg = array();
$success_msg = array();
$drink_name = '';
$price = 0;
$stock = 0;
$status = 0;
$file_name ='';
$drink_id = 0;
$ext = '';
$link = get_db_connect();
if($_SERVER['REQUEST_METHOD'] === 'POST'){

    $submit_type = $_POST['submit_type'];
    //var_dump($submit_type);exit();

    switch ($submit_type) {
        case 'add_item':

        $drink_name = $_POST['drink_name'];
        $price = $_POST['price'];
        //var_dump($price);exit();
        $stock = $_POST['stock'];
        $status = $_POST['public_status'];

        //登録値チェック
        $err_msg[] = entry_name_check($drink_name);
        $err_msg[] = entry_check_price($price);
        $err_msg[] = entry_check_stock($stock);
        //var_dump($price);exit();

        //アップロードファイル名を変数に代入
        $temp_file = $_FILES['new_img']['tmp_name'];
        $file_name = '../img' . $_FILES['new_img']['name'];

        //拡張子取得
        $ext = extention($file_name);
        //拡張子チェック
        $err_msg[] = extention_check($ext);

        //ファイルパス+ファイル名
        $upload_file = '../img' . $drink_id . $ext;

        if(count($err_msg) === 0){

            //トランザクション開始
            mysqli_autocommit($link, $false);

            $sql = 'INSERT INTO drink_info_table(drink_name,price,status)VALUES(\'' . $drink_name . '\',' . $price . ',' . $status . ')';

            if(mysqli_query($link,$sql) === TRUE){

                $drink_id = mysqli_insert_id($link);

                //drink_stock_tableにinsert
                $err_msg[] = insert_drink_stock_table($drink_id,$stock);

            }else{
                $err_msg[] = 'drink_info_table:insertエラー' . $sql;
            }

            //アップロード処理
            $err_msg[] = upload_img($file_name,$temp_file,$upload_file);    

           //トランザクション成否判定
           if(count($err_msg) === 0){

               $success_msg[] = '商品追加成功';

               mysqli_commit($link);

           }else{
               $err_msg[] = '商品追加失敗';
               mysqli_rollback($link);
            }
        }

        break;

        case'change_value':

            $drink_id = (int)$_POST['drink_id'];

                if(isset($_POST['update_stock'])){
                    $update_stock = (int)$_POST['update_stock'];

                    $sql = 'UPDATE drink_stock_table SET stock_number = ' . $update_stock . ' WHERE drink_id = ' . $drink_id; 

                    if(mysqli_query($link,$sql) === TRUE){
                        $success_msg [] = '在庫変更成功'; 
                    }else{
                        $err_msg[] = 'UPDATE drink_stock_table:updateエラー:' . $sql;
                    }
                }else{
                    $err_msg[] = '在庫変更失敗';   
                }

            break;

        case 'change_status':


            $status = (int)$_POST['status'];
            $drink_id = (int)$_POST['drink_id'];

            if(($status) === 1){

                $sql = 'UPDATE drink_info_table SET status = 0 WHERE drink_id = ' . $drink_id; 

                if(mysqli_query($link,$sql) === FALSE){

                    $err_msg[] = 'drink_info_table:UPDATEエラー' . $sql;    

                }else{

                    $success_msg[] = 'ステータス変更成功';
                }

            }else{
                $sql = 'UPDATE drink_info_table SET status = 1 WHERE drink_id = ' . $drink_id; 

                if(mysqli_query($link,$sql) === FALSE){

                    $err_msg[] = 'drink_info_table:UPDATEエラー' .$sql;    

                }else{

                    $success_msg[] = 'ステータス変更成功';
                }

            }

            break;    

    }

}

//drink_info_table取得
$drink_info_list = get_drink_table($link);


//特殊文字をHTMLエンティティに変換
$drink_info_list = entity_as_array($drink_info_list);
//var_dump($drink_info_list);exit();

include_once './view.php';


?>


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

try {
    $link = get_db_connect();
    if($_SERVER['REQUEST_METHOD'] === 'POST'){
        ...
    }
    $drink_info_list = get_drink_table($link);
    $drink_info_list = entity_as_array($drink_info_list);
    include_once './view.php';
} catch (Exception $e) {
    //デバッグ
    echo '<pre>';
    echo 'エラーファイル:'. $e->getFile() ."\n";
    echo 'エラー行:'. $e->getLine() ."\n";
    echo 'エラー内容:'. $e->getMessage() ."\n\n";
    echo 'トレース:'. print_r($e->getTrace()) ."\n";
    echo '</pre>';
    exit();
}

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

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

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

try {
    $link = get_db_connect();

    //コネクションエラー処理
    if (! $link) {
        echo mysqli_connect_error();
    }

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/15 22:25

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

    キャンセル

  • 2017/09/15 22:33

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

    キャンセル

  • 2017/09/15 22:40

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

    キャンセル

  • 2017/09/15 23:05

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

    キャンセル

  • 2017/09/15 23:25

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

    キャンセル

  • 2017/09/15 23:29

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

    キャンセル

  • 2017/09/15 23:43

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

    キャンセル

  • 2017/09/15 23:45

    ../ ← これは上のディレクトリ(フォルダー)
    ./ ← これは現在のディレクトリ(フォルダー)

    画像ファイルはimgディレクトリに入っていて、そのディレクトリの位置はひとつ上の階層ですよね? ですので下記のような書き方になるわけです。
    ----
    ../img/画像ファイル名.jpg

    スラッシュ自体はディレクトリの「区切り」の意味です。Windowsだとディレクトリの区切りは「\」です。PHPは普通Linuxなのでディレクトリの区切りに「/」を使います。

    '../img/' . $_FILES['new_img']['name'];
    ----
    つぎに↑これについてです。
    $_FILES['new_img']['name'] ←これは画像ファイル名です(拡張子あり)
    ですのでコードの中にいくつか存在している「../img」の表記は「../img/」とならなければならないはずです。

    キャンセル

  • 2017/09/15 23:50

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

    キャンセル

  • 2017/09/15 23:51

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

    キャンセル

  • 2017/09/16 00:07

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

    キャンセル

  • 2017/09/16 18:54

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

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20770questions

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

  • phpMyAdmin

    666questions

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