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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PHP

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

Q&A

解決済

2回答

1414閲覧

なぜ「変数が定義されていない」とエラーが出るか分かりません。

miikan023

総合スコア3

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/05/30 08:56

編集2021/05/30 09:08

飲料の「画像」「名前」「値段」を管理する簡単なサービスを作成あとに、
在庫数も(下のテーブルで)管理できるよう機能を拡張しようとしています。

画像・名前・値段を表示することろまでは完了したのですが
以下のエラーが出てます。

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>

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

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

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

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

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

y_waiwai

2021/05/30 09:01

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
miikan023

2021/05/30 09:04

承知しました!!今日初めて質問するので、そのような配慮に欠けていました<(_ _)>いまから編集しなおします。
y_waiwai

2021/05/30 09:10

おお、すばらしい! これで回答がたくさんつくことでしょう<ムセキニン
guest

回答2

0

2.PDO::lastInsertId()の求めるものがない?

(call to a member function lastinsertid() on stringと表示されます)

いいえ。

$id=$sql->lastInsertId();

とされてますが、そもそも$sqlは文字列を保持した変数です。

↓ここ

php

1 //「ドリンク商品情報テーブル」にデータ書き込み 2 $sql = 'INSERT INTO test_drink_master(img_file_name, drink_name, price, create_datetime) VALUES(?, ?, ?, NOW())'; 3

PDO::lastInsertIdはPDOオブジェクトが持っているメソッドです。
現時点のコードでPDOオブジェクトを保持しているのは$dbhではないでしょうか。

1.'stock'が定義されていない(Undefined variableと表示されます)
3.値段の<input>に半角数字を入れると、'stock'のためのpreg_matchがなぜか反応し

新規追加のフォームにはstockという名前の入力コントロールはないですね。
リクエストを受け付けるプログラムが同じ場合、「今どちらのボタンが押されたか」を判断するための情報を送信して分岐させる必要があります。

buttonタグ使われているなら、そのbuttonタグに同じnameを設定し、valueで分岐をかけるとかですね。

ちなみに、「商品情報変更」のほう、「何を」を表す情報が送信されるようになっていません。
商品個別に編集させるのであれば、特定できるキーとなる情報(一位となる情報)を一緒に送信する必要があるのではないでしょうか。

つまり現状では「新規追加と同時にストックも登録できるフォーム構成になっていない」と言えます。
submitされるのはそのボタンが所属するフォームだけです。

投稿2021/05/30 09:38

編集2021/05/30 09:40
m.ts10806

総合スコア80875

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

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

0

ベストアンサー

1.3.について、isset($_POST['stock'])==TRUEがtrueになっているのか一度確認してみてください。
もしfalseの場合は、$stock = $_POST['stock'];を通っていないため、$stockが定義されておらず、またpreg_matchが0を返します(一致する文字列は無いため)。

該当コード付近:

//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'; /*このエラーで判断する限り、エラーはここで既に発生している*/ } }

2.について
変数$sqlは文字列'INSERT INTO test_drink_stock(drink_id, stock, create_datetime) VALUES(?, ?, NOW())';です。意図している変数は~~$stmt~~$dbhではないでしょうか。

該当コード:

//↓のテーブルにidを $id=$sql->lastInsertId();

投稿2021/05/30 09:26

編集2021/05/30 09:44
yuuyu

総合スコア1139

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

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

yuuyu

2021/05/30 09:45

これは失礼いたしました。lastInsertIdはPDOが持っている関数ですね。修正しました。
miikan023

2021/05/31 13:37

上記二点と、その他諸々無事動かすことができました!!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問