飲料の「画像」「名前」「値段」を管理する簡単なサービスを作成あとに、
在庫数も(下のテーブルで)管理できるよう機能を拡張しようとしています。
画像・名前・値段を表示することろまでは完了したのですが
以下のエラーが出てます。
1.'stock'が定義されていない(Undefined variableと表示されます)
2.PDO::lastInsertId()の求めるものがない?
(call to a member function lastinsertid() on stringと表示されます)
3.値段の<input>に半角数字を入れると、'stock'のためのpreg_matchがなぜか反応し
エラーメッセージを出します。($error[]='半角で数値を入力して下さい01';)
自分なりにどこが問題か数日考えたのですが、特になぜ「'stock'が定義ていない」と出るのか分かりません。
ここがおかしいからエラーが出ているのでは?という箇所ありましたら教えてください。
<?php $host = ’localhost’; $username = '割愛します'; $password = '割愛します'; $dbname = '割愛します'; $charset = 'utf8'; // MySQL用のDSN文字列 $dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset; //エラー項目を入れる配列 $error = []; //空配列 $data = []; //画像 $img_dir = './img/'; $new_img_filename= ''; //名前と値段を調べる if($_SERVER['REQUEST_METHOD'] === 'POST'){ //名前がセットされているか確認 if(isset($_POST['drink_name'])==TRUE){ $drink_name = $_POST['drink_name']; } if($drink_name===''){ $error[] = '商品名を記入して下さい'; } //値段がセットされているか・半角か確認 if(isset($_POST['price']) ===TRUE){ $price = $_POST['price']; } if(preg_match('/\A[0-9]+\z/',$price)==0){ $error[]='半角で数値を入力して下さい00'; } } // アップロード画像ファイルの保存 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // HTTP POST でファイルがアップロードされたかどうかチェック if (is_uploaded_file($_FILES['new_img']['tmp_name']) === TRUE) { // 画像の拡張子を取得 $extension = pathinfo($_FILES['new_img']['name'], PATHINFO_EXTENSION); // 指定の拡張子であるかどうかチェック if ($extension === 'jpg' || $extension === 'jpeg') { // 保存する新しいファイル名の生成(ユニークな値を設定する) $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) { $error[] = 'ファイルアップロードに失敗しました'; } } else { $error[] = 'ファイルアップロードに失敗しました。再度お試しください。'; } } else { $error[] = 'ファイル形式が異なります。画像ファイルはJPEGのみ利用可能です。'; } } else { $error[] = 'ファイルを選択してください'; } } //stock numberが半角かどうか調べる /* ※エラー: Undefined variablesとでる。。*/ /*※エラー:数値をprice*に入れると 、こちらが反応する*/ if($_SERVER['REQUEST_METHOD'] === 'POST'){ //名前がセットされているか確認 if(isset($_POST['stock'])==TRUE){ $stock = $_POST['stock']; } if(preg_match('/\A[0-9]+\z/',$stock)==0){ $error[]='半角で数値を入力して下さい01'; /*このエラーで判断する限り、エラーはここで既に発生している*/ } } // アップロードした新しい画像ファイル名の登録、既存の画像ファイル名の取得 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); //トランザクション開始 $dbh->beginTransaction(); // エラーがなければ、アップロードした新しい画像ファイル名・名前・値段を保存 + stock数登録 try{ if(empty($error)===TRUE && $_SERVER['REQUEST_METHOD']==='POST'){ //「ドリンク商品情報テーブル」にデータ書き込み $sql = 'INSERT INTO test_drink_master(img_file_name, drink_name, price, create_datetime) VALUES(?, ?, ?, NOW())'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $new_img_filename, PDO::PARAM_STR); $stmt->bindValue(2, $drink_name, PDO::PARAM_STR); $stmt->bindValue(3, $price, PDO::PARAM_STR); var_dump($sql); $stmt->execute(); //↓のテーブルにidを $id=$sql->lastInsertId(); //「ドリンク在庫情報テーブル」にデータ書き込み $sql = 'INSERT INTO test_drink_stock(drink_id, stock, create_datetime) VALUES(?, ?, NOW())'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $id, PDO::PARAM_STR); $stmt->bindValue(2, $stock, PDO::PARAM_STR); $stmt->execute(); //コミット処理 $dbh->commit(); } } catch(PDOException $e){ //ロールバック処理 $dbh->rollback(); $error[] = '登録に失敗しました。理由:'.$e->getMessage(); } //テーブルからの読み込み $sql = 'SELECT * FROM test_drink_master ORDER BY create_datetime DESC'; $stmt = $dbh->prepare($sql); $stmt->execute(); $data = $stmt->fetchAll(); } catch(PDOException $e){ $error[] = '接続できませんでした。理由:'.$e->getMessage(); } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>query</title> <link rel="stylesheet" href="style.css"> </head> <body> <h1>自動販売機管理ツール</h1> <br> <div class="form"> <h2>新規商品追加</h2> <form method="POST" action="manage.php" enctype="multipart/form-data"> <label> 名前:<input type="text" name="drink_name"> </label> <br> <label> 値段:<input type="text" name="price"> </label> <br> <input type="file" name="new_img"> <br> <button type="submit">商品を追加</button> <?php foreach($error as $value){ ?> <p><?php print $value; ?></p> <?php } ?> </form> </div> <h2>商品情報変更</h2> <table border="1" style="border-collapse: collapse"> <tr> <th>商品画像</th> <th>商品名</th> <th>価格</th> <th>在庫数</th> </tr> <?php foreach($data as $value){ ?> <tr> <td class="img"><img src="img/<?php print $value['img_file_name']; ?>"></td> <td class="drink_name"><?php print $value['drink_name']; ?></td> <td class="price"><?php print $value['price']; ?></td> <td class="stock"> <form class="stock" method="POST" action="manage.php"> <input type="text" name="stock">個 <button type="submit">変更</button> </form> </td> </tr> <?php } ?> </table> </body> </html>
回答2件
あなたの回答
tips
プレビュー