
PHP
<?php
$item_name='';
$price ='';
$stock = '';
$status='';
$update_stock='';
$host = 'localhost';
$username = '********';
$password = '********';
$dbname = '********';
$charset = 'utf8';
$process_kind = "";
$date = date('Y-m-d H:i:s');
$delete ='';
$dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset;
$img_dir = './img/';
$data = array();
$err_msg = array();
$clear_msg = array();
$new_img_filename = '';
try {
$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES utf8mb4'));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if(isset($_POST['process_kind'])=== TRUE){
$process_kind=$_POST['process_kind'];
}
if($process_kind==='insert_item'){
if(isset($_POST['item_name']) === TRUE) {
$item_name = $_POST['item_name'];
}
if(isset($_POST['price']) === TRUE) {
$price = $_POST['price'];
}
if(isset($_POST['stock'])=== TRUE) {
$stock = $_POST['stock'];
}
if(isset($_POST['status'])=== TRUE) {
$status = $_POST['status'];
}
if($item_name === '') {
$err_msg[] = '商品名を入力してください';
}
if($price === '') {
$err_msg[] = '価格を入力してください';
} else if (preg_match("/^[0-9]+$/",$price)!==1) {
$err_msg[] = "価格を0以上の半角数字で入力してください";
}
if($stock === '') {
$err_msg[] = '個数を入力してください';
} else if (preg_match("/^[0-9]+$/",$stock)!==1) {
$err_msg[] = "個数を0以上の半角数字で入力してください";
}
if(preg_match('/^[01]$/',$status)===0){
$err_msg[] = 'ステータス値が不正です';
}
if (is_uploaded_file($_FILES['new_img']['tmp_name']) === TRUE) {
$extension = pathinfo($_FILES['new_img']['name'], PATHINFO_EXTENSION);
if ($extension === 'png' || $extension === 'jpeg'|| $extension === 'jpg') {
$new_img_filename = sha1(uniqid(mt_rand(), true)). '.' . $extension;
if (is_file($img_dir . $new_img_filename) !== TRUE) {
if (move_uploaded_file($_FILES['new_img']['tmp_name'], $img_dir . $new_img_filename) !== TRUE) {
$err_msg[] = 'ファイルアップロードに失敗しました';
}
} else {
$err_msg[] = 'ファイルアップロードに失敗しました。再度お試しください。';
}
} else {
$err_msg[] = 'ファイル形式が異なります。画像ファイルはJPEGとPNGのみ利用可能です。';
}
} else {
$err_msg[] = 'ファイルを選択してください';
}
if (count($err_msg) === 0 && $_SERVER['REQUEST_METHOD'] === 'POST') {
$dbh->beginTransaction();
try {
$sql = 'INSERT INTO ec_item_master (item_name,price,img,status,create_datetime)
VALUES(?, ?, ?, ?, now())';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $item_name, PDO::PARAM_STR);
$stmt->bindValue(2, $price, PDO::PARAM_INT);
$stmt->bindValue(3, $new_img_filename, PDO::PARAM_STR);
$stmt->bindValue(4, $status, PDO::PARAM_INT);
$stmt->execute();
$item_id = $dbh->lastInsertId();
print '商品を追加しました</br>';
$sql = 'INSERT INTO ec_item_stock (item_id,stock,create_datetime,update_datetime)
VALUES(?,?,now(),now())';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1,$item_id, PDO::PARAM_INT);
$stmt->bindValue(2,$stock, PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetchAll();
$dbh->commit();
print 'データ登録完了';
} catch (PDOException $e) {
throw $e;
$dbh->rollback();
$err_msg[] = 'データの追加に失敗しました';
}
}
}else if ($process_kind==='update_stock'){
if(isset($_POST['stock'])===TRUE){
$stock=$_POST['stock'];
}
if(isset($_POST['item_id'])===TRUE){
$item_id=$_POST['item_id'];
}
if($stock === '') {
$err_msg[] = '在庫数を入力してください';
} else if (preg_match("/^[0-9]+$/",$stock)!==1) {
$err_msg[] = "在庫数は0以上の半角数字で入力してください";
}
if(preg_match('/^[0-9]+$/',$item_id)===0){
$err_msg[] = 'item_idの値が不正です';
}
if(empty($err_msg)){
try{
$sql='update ec_item_stock set stock = ? , update_datetime = ? where item_id = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1,$stock, PDO::PARAM_INT);
$stmt->bindValue(2,$date, PDO::PARAM_STR);
$stmt->bindValue(3,$item_id,PDO::PARAM_INT);
$stmt->execute();
print'在庫数を変更しました';
} catch (PDOException $e) {
throw $e;
}
}
}else if ($process_kind==='change_status'){
if(isset($_POST['status'])===TRUE){
$status = $_POST['status'];
}
if(isset($_POST['item_id'])===TRUE){
$item_id = $_POST['item_id'];
}
if(preg_match('/[01]/',$status) !== 1){
$err_msg[] ='不正なステータスが指定されています。';
}
if(empty($err_msg)) {
$clear_msg[] = 'ステータスが変更されました';
}
try{
if(empty($err_msg)){
if($status === '0'){
$status = 1;
}else{
$status = 0;
}
$sql = 'UPDATE ec_item_master SET status = ? ,update_datetime = ? WHERE item_id = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1,$status, PDO::PARAM_INT);
$stmt->bindValue(2,$date, PDO::PARAM_STR);
$stmt->bindValue(3,$item_id,PDO::PARAM_INT);
$stmt->execute();
}
} catch (PDOException $e){
throw $e;
}
}else if($process_kind==='delete_item'){
if(isset($_POST['item_id'])===TRUE){
$item_id = $_POST['item_id'];
}
if(preg_match('/^[0-9]+$/',$item_id)===0){
$err_msg[] = 'item_idの値が不正です';
}
if(empty($err_msg)){
$dbh->beginTransaction();
try {
$sql='DELETE FROM ec_item_stock WHERE item_id = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $item_id, PDO::PARAM_INT);
$stmt->execute();
$sql='DELETE FROM ec_item_master WHERE item_id = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1,$item_id, PDO::PARAM_INT);
$stmt->execute();
$dbh->commit();
$clear_msg[]= 'データ削除完了';
} catch (PDOException $e) {
throw $e;
$dbh->rollback();
$err_msg[] = 'データの削除に失敗しました';
}
}
}
}
$sql = 'SELECT ec_item_master.item_id,item_name,price,img,status,stock_id,stock FROM ec_item_master INNER JOIN ec_item_stock ON ec_item_master.item_id = ec_item_stock.item_id';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
foreach ($rows as $row) {
$data[] = $row;
}
} catch(PDOException $e) {
$err_msg['db_connect'] = 'DBエラー:' .$e->getMessage();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<title>ECサイト</title>
</head>
<body>
<h1>管理ページ</h1>
<?php if (count($clear_msg) !== 0) {
foreach ($clear_msg as $clear) { ?>
<p><?php print $clear; ?></p>
<?php }
} ?>
<?php if (count($err_msg) !== 0) {
foreach ($err_msg as $err) { ?>
<p class="err"><?php print $err; ?></p>
<?php }
} ?>
<h2>商品登録</h2>
<form method="post" enctype="multipart/form-data">
<div>商品名:<input type="text" name="item_name"/></div>
<div>値 段:<input type="text" name="price"/></div>
<div>部 数:<input type="text" name="stock"/></div>
<div>商品画像:<input type="file" name="new_img"></div>
<div>
ステータス:
<select name="status">
<option value="1">公開</option>
<option value="0">非公開</option>
</select>
</div>
<div><input type="submit" name="insert_item" value="登録をする"/></div>
<input type="hidden" name="process_kind" value="insert_item">
</form>
<h2>商品情報一覧・変更</h2>
<p>商品一覧</p>
<table>
<tr>
<th>商品画像</th>
<th>商品名</th>
<th>価格</th>
<th>在庫数</th>
<th>ステータス</th>
<th>削除ボタン</th>
</tr>
<?php foreach ($data as $value) { ?>
<?php $btn_label = $value['status']===0 ? '非公開 → 公開' :' 公開 → 非公開'; ?>
<tr <?php echo $value['status']===0 ? 'class="gray"' :''; ?>>
<form method="post">
<td><img src ="<?php print $img_dir . $value['img'];?>"></td>
<td><?php print htmlspecialchars ($value['item_name'],ENT_QUOTES);?></td>
<td><?php print htmlspecialchars ($value['price'],ENT_QUOTES);?>円</td>
<td><input type="text" name="stock" value="<?php print htmlspecialchars ($value['stock'],ENT_QUOTES);?>">個 <input type="submit" name="update_stock" value="変更"