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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

710閲覧

同データベースの2つのカラムをUPDATEしたいのですが、上手くいかないです

nouzoe_hiroaki

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2019/07/18 14:01

制作しているシステム

PHPで自動販売機のシステムを制作
管理、在庫、購入履歴の3つのデータベースに管理

発生している問題

$query = "UPDATE stock_table SET stock = {$stock},update_date = {'$up_date'} WHERE drink_id = {$drink_id}"; if(mysqli_query($link, $query) !== TRUE) { $error[] = 'エラー3'; } stock_tableの在庫、更新の時刻を同時にUPDATEしたいのですが上のコードが上手く機能せず $error[] の 'エラー3'が表示されます 因みにvar_dumpで$up_dateを確認するとしっかり取得されています

該当のソースコード

<?php $drink_data = array(); $uploaddir = '../upload_img/'; $error = array(); $up_date = date('Y-m-d H:i:s'); $host = 'localhost'; $user = ''; $passwd = ''; $dbname = ''; $link = mysqli_connect($host, $user, $passwd, $dbname); if($link){ mysqli_set_charset($link, 'utf8'); if($_SERVER['REQUEST_METHOD'] === 'POST'){ if(isset($_POST['name']) === TRUE && isset($_POST['price']) === TRUE && isset($_POST['stock']) === TRUE && isset($_POST['status']) === TRUE){ $name = $_POST['name']; $price = $_POST['price']; $stock = $_POST['stock']; $date = date('Y-m-d H:i:s'); $up_date = date('Y-m-d H:i:s'); $status = $_POST['status']; if(isset($_FILES['img_name']) === TRUE){ $uploadfile = basename($_FILES['img_name']['name']); if(is_uploaded_file($_FILES['img_name']['tmp_name'])===TRUE){ $mime = $_FILES['img_name']['type']; if($mime === 'image/png' || $mime === 'image/jpeg'){ if(move_uploaded_file($_FILES['img_name']['tmp_name'], $uploaddir.$uploadfile)===FALSE){ $error[] = "失敗!"; } }else{ $error[] = '形式が違います'; } }else{ $error[] = 'ファイル未選択'; } } if($name === ''){ $error[] = '名前が入力されていません'; } if($price === ''){ $error[] = '値段が入力されていません'; }else if(preg_match('/^[0-9]+$/',$price) === 0){ $error[] = '値段は整数値で入力してください'; } if($stock === ''){ $error[] = '個数が入力されていません'; }else if(preg_match('/^[0-9]+$/',$stock)===0){ $error[] = '個数は整数値で入力してください'; } if(preg_match('/^[01]$/',$status)===0){ $error[] = 'ステータス値が不正です'; } if(count($error)===0){ mysqli_autocommit($link, false); $query = "INSERT INTO drink_table(name,price,created_date,update_date,status,drink_img) VALUES ('$name',$price,'$date','$up_date',$status,'$uploadfile')"; if(mysqli_query($link, $query) === false){ $error[] = 'エラー1'; }else{ $drink_id = mysqli_insert_id($link); $sql = "INSERT INTO stock_table VALUES ($drink_id,$stock,'$date','$up_date')"; if(mysqli_query($link, $sql) === false){ $error[] = 'エラー2'; } } if (count($error) === 0) { mysqli_commit($link); } else { mysqli_rollback($link); } } }else if(isset($_POST['stock_button'])===TRUE){ $drink_id = ''; $stock = ''; //$up_date = date('Y-m-d H:i:s'); if(isset($_POST['drink_id'])===TRUE){ $drink_id = $_POST['drink_id']; } if(isset($_POST['stock'])===TRUE){ $stock = $_POST['stock']; } $query = "UPDATE stock_table SET stock = {$stock},update_date = {'$up_date'} WHERE drink_id = {$drink_id}"; var_dump($up_date); if(mysqli_query($link, $query) !== TRUE) { $error[] = 'エラー3'; } }else if(isset($_POST['status_button'])===TRUE){ $status = ''; if(isset($_POST['drink_id'])===TRUE){ $drink_id = $_POST['drink_id']; } if(isset($_POST['status'])===TRUE){ $status = $_POST['status']; } $query = "UPDATE drink_table SET status = {$status} WHERE drink_id = {$drink_id}"; if(mysqli_query($link, $query) !== TRUE) { $error[] = 'エラー4'; } } } $query = 'SELECT drink_table.drink_id,name,price,stock,status,drink_img FROM drink_table JOIN stock_table ON drink_table.drink_id = stock_table.drink_id '; $result = mysqli_query($link,$query); while($row = mysqli_fetch_array($result)){ $drink_data[] = $row; } mysqli_free_result($result); mysqli_close($link); }else{ print 'DB接続失敗'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>サンプル</title> <style> 省略 </style> </head> <body> <section> <?php foreach($error as $value){?> <p><?php print $value; ?></p> <?php }?> <h1>新規商品追加</h1> <form enctype="multipart/form-data" method = "post"> <div> <label>名前:<input type = "text" name = "name" value = ""></label> </div> <div> <label>値段:<input type = "text" name = "price" value = ""></label> </div> <div> <label>個数:<input type = "text" name = "stock" value = ""></label> </div> <div> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <input type = "file" name = "img_name"> </div> <div> <select name = "status"> <option value ="0">非公開</option> <option value ="1">公開</option> </select> </div> <div> <input type ="hidden" name = "sql_kind" value ="insert"> </div> <div> <input type ="submit" value ="商品追加"> </div> </form> </section> <section> <h1>商品情報変更</h1> <table> <caption>商品一覧</caption> <tbody> <tr> <th>商品画像</th> <th>商品名</th> <th>価格</th> <th>在庫数</th> <th>ステータス</th> </tr> <?php foreach ($drink_data as $value){ ?> <tr class = "status_false"> <td><img src = "<?php print htmlspecialchars($uploaddir.$value['drink_img'], ENT_QUOTES, 'UTF-8'); ?>"></td> <td><?php print htmlspecialchars($value['name'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?php print htmlspecialchars($value['price'], ENT_QUOTES, 'UTF-8'); ?></td> <td> <form method = "post"> <input type = "hidden" name = "drink_id" value = "<?php print htmlspecialchars($value['drink_id'], ENT_QUOTES, 'UTF-8'); ?>"> <input type = "text" name = "stock" value = "<?php print htmlspecialchars($value['stock'], ENT_QUOTES, 'UTF-8'); ?>">個 <input type = "submit" name ="stock_button" value = "変更"> </form> </td> <td> <form method = "post"> <input type = "hidden" name = "drink_id" value = "<?php print htmlspecialchars($value['drink_id'], ENT_QUOTES, 'UTF-8'); ?>"> <?php if(htmlspecialchars($value['status'], ENT_QUOTES, 'UTF-8')==='0'){ ?> <input type = "submit" name ="status_button" value = "非公開→公開"> <input type = "hidden" name = "status" value = '1' > <style type="text/css"> .status_false{ background-color:gray; } </style> <?php }else{?> <input type = "submit" name ="status_button" value = "公開→非公開"> <input type = "hidden" name = "status" value = '0' > <?php }?> </form> </td> </tr> <?php }?> </tbody> </table> </section> </body> </html>

試したこと

データベースから直接sql文を取得してみた
シングルコートを外してみた
$stockや$up_dateの{}を[]に変えてみた
else if内の(isset($_POST['stock_button'])===TRUE){
のなかで改めて$up_date = date('Y-m-d H:i:s');
としてみた
UPDATE ~ SET以降、update_dateのカラムは入れずに stock = {$stock} WHERE drink_id = {$drink_id}のみだと正常に機能します

問題の発生した環境

PHP

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

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

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

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

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

guest

回答1

0

ベストアンサー

正しく展開されない変数があります

php

1$up_date = "test"; 2echo "{'$up_date'}"; 3//{'test'}

$query = "UPDATE stock_table SET stock = {$stock},update_date = {'$up_date'} WHERE drink_id = {$drink_id}";

$query = "UPDATE stock_table SET stock = {$stock},update_date = {$up_date} WHERE drink_id = {$drink_id}";

ただ、数値でないのでしたらSQLの値をセットする部分はシングルクォートで囲うべきですね。

$query = "UPDATE stock_table SET stock = '{$stock}',update_date = '{$up_date}' WHERE drink_id = {$drink_id}";

直接sql文を取得してみた

今回の場合、PHPで組んだSQLで正しく動いてないのですから、PHPで実行しようとしているSQLを取得して、正しいSQLか、DBに対して直接実行するとどうなるかを確かめましょう。

ただ・・・
現在のコードですとSQLインジェクションの脆弱性がありますし、
諸々含めるとmysqli系よりもPDOで対応されたほうが良いでしょう。
全体的に作り直しとなりますが、後々のメンテナンス性とか可読性とか加味するとメリットのほうが大きいと思います。

投稿2019/07/18 14:11

編集2019/07/18 14:12
m.ts10806

総合スコア80850

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

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

nouzoe_hiroaki

2019/07/18 14:19

初心者中の初心者の初歩的なミスでした! 迅速なご回答にも感謝です!今回とあるオンライン講座の課題でしてmysqliでの処理になりますが、今後のためにもPDO、念頭に置いときます!
m.ts10806

2019/07/18 14:24

解決されたようで何よりです。
m.ts10806

2019/07/18 14:25

PDOはともかくSQLのエスケープはしておいたほうが良いかと思います。 mysqli系にもPDOでするようなprepare→bind→execute の流れはありますので(PHPマニュアルは必ず確認してください)
nouzoe_hiroaki

2019/07/18 14:48

了解しました!次の受講時、講師に質問してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問