アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
データ更新用のPHPプログラムを作成中なのですが
更新テストをするとデータが消えてしまいました
どこをどのように修正すればいいでしょうか?

一部抜粋したPHPプログラムですが、ご教示いただければ幸いに存じます。<(_ _)>

<?php
require 'define.php';
$msg = " ";

$mode = ($_GET['mode'] == "" ? $_POST['mode'] : $_GET['mode']);
$shop_cd = ($_GET['shop_cd'] == "" ? $_POST['shop_cd'] : $_GET['shop_cd']);

// DB接続
if (!($cn = mysqli_connect(DBHOST,DBUSER,DBPASSWORD,DBNAME)
)) {
$msg = "DB接続不可"; exit; // DB接続不可
}
$cn -> set_charset('utf8');

if ($mode == "mode") {
$temp_flg = ($_GET['temp_flg'] == "" ? $_POST['temp_flg'] : $_GET['temp_flg']);
$receipt_no= ($_GET['receipt_no'] == "" ? $_POST['receipt_no'] : $_GET['receipt_no']);
$shop_cd = ($_GET['shop_cd'] == "" ? $_POST['shop_cd'] : $_GET['shop_cd']);
$reg_date = ($_GET['reg_date'] == "" ? $_POST['reg_date'] : $_GET['reg_date']);
$upd_date = ($_GET['upd_date'] == "" ? $_POST['upd_date'] : $_GET['upd_date']);

$gl_tblname = TENPO_TBL;
$sql = "delete from " . $gl_tblname . " where shop_cd = '" . $shop_cd . "' ";
$rs = mysqli_query($cn, $sql) or die("Could not delete =[" . $sql . "]\n");

$sql = "insert into " . TENPO_TBL . " values (";
if ($temp_flg == 1) $sql .= "1, ";
else $sql .= "0, ";
$sql .= $receipt_no . ", ";
$sql .= "'" . $shop_cd . "', ";
$sql .= "now(), "; // 登録日時
$sql .= "now() "; // 更新日時

$sql .= ')';
if (!($rs = mysqli_query($cn, $sql))) {mysqli_close($cn); $msg = "insert 不可"; exit;}
$msg = "変更しました! 必ずプレビューで確認してください。";

} else {
$sql = "select * from " . TENPO_TBL . " where shop_cd = '" . $shop_cd . "' ";
$rs = mysqli_query($cn, $sql);

$row = mysqli_fetch_assoc($rs);

$temp_flg = $row['temp_flg'];
$receipt_no = $row['receipt_no'];
$shop_cd = $row['shop_cd'];
$reg_date = $row['reg_date'];
$upd_date = $row['upd_date'];
}
// DB切断
mysqli_close($cn);
?>

A 回答 (2件)

とりあえず変数の設定はこう


$list=["mode","shop_cd","temp_flg","receipt_no","shop_cd","reg_date","upd_date"];
foreach($list as $val){
$$val = filter_input(INPUT_GET,$val)?:filter_input(INPUT_POST,$val);
}

その上で、変数をSQL文に直接埋め込むのはNG
prepareで処理して下さい

またdeleteしてinsertする意味はないのでは?
insert into on duplocate key updateコマンドを利用してはどうでしょうか?
    • good
    • 0
この回答へのお礼

ご教示ありがとうございました。
確かに deleteしてinsertする方法でした。

ご教示通り修正したところ
うまく動きましたありがとうございました。<(_ _)>

お礼日時:2018/04/19 17:39

PHPが、、、というWebアプリケーションのプログラミング言語の視点でお考えになる前に、「データベースのテーブルのあるレコードのある項目の値を更新しようとしたところ、更新対象のレコードが削除された」といった視点で物事をとらえましょう。


つまり「リレーショナルデータベースのMySQLのあるテーブルに対してこのようなSQLを発行したところ・・・」と考えられることです。

試験中のプログラムはどのようなSQLを生成しましたか?
それが分からない場合はMySQLに対してそのSQL文を発行する直前にSQL文をダンプする(テキストファイルに書き出すのでもよいし、画面表示でもよい)コードを入れましょう。
そういうコードをデバッグ用サブルーチンとして事前に作って置けば試験などで問題が出た際のロジック調査で役立ちます。

参考まで。
    • good
    • 0
この回答へのお礼

ご教示ありがとうございます。
すでにデータもあり更新プログラムがあったのですが
Postgress用だったので MySQLに変更を試みています。
エラーログを見たところ
PHP Notice: Undefined index: upd_date、、、などはあります。
ただ、Warningは出ていません。

どこの記述に問題があるのかが特定できていない状態です。<(_ _)>

お礼日時:2018/04/17 14:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!