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

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

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

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

PHP

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

Q&A

解決済

3回答

1921閲覧

どうしたらエラーが消えるでしょうか?

TOM.

総合スコア12

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/10/12 06:48

編集2018/10/12 07:10

前提・実現したいこと

職業訓練でPHPを学び始めて数か月です。卒業制作でPHPのサイトを作っていました。
通販サイトで商品管理ページ→商品登録情報ページ→商品登録情報編集ページ→更新完了ページ→商品管理ページと移動させたいのですが、更新完了ページにて下記のエラーが発生しました。

定義されていない変数を使おうとしていてエラーになっているのはわかるのですが、なぜ定義されていないかがわかりません。
先生に聞いてみても分からないと言われてしまいました。

また、エラー表示は出ていないものの、更新完了ページに更新後の内容を表示させる部分に何も表示されていませんでした。

エラーを消去し、更新後の情報を表示させるにはどうしたらよいでしょうか?
回答よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ Notice: Undefined index: image in C:\xampp\htdocs\originalsite\edit_complete.php on line 29 Notice: Undefined index: image in C:\xampp\htdocs\originalsite\edit_complete.php on line 30

商品登録情報編集ページのソースコード

PHP7.1

1 2<form action="edit_complete.php" method="post"> 3 <?php 4 $code=$_GET['code']; 5 6 $dsn='mysql:dbname=original;host=localhost'; 7 $user='root'; 8 $password=''; 9 $dbh=new PDO($dsn,$user,$password); 10 $dbh->query('SET NAMES utf8'); 11 12 $sql='SELECT*FROM stock_info WHERE code=?'; 13 $date[]=$code; 14 $stmt=$dbh->prepare($sql); 15 $stmt->execute($date); 16 17 while(1){ 18 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 19 if($rec==false){ 20 break; 21 } 22 if($rec['image']!=""){ 23 print "<img src='upload/".$rec['image']."'>"; 24 } 25 print "<input type='text' name='name' value='".$rec['name']."'>"; 26 print $rec['id']; 27 print "<input type='hidden' name='id' value='".$rec['id']."'>"; 28 print "<input type='number' name='price' value='".$rec['price']."'>"; 29 print "<input type='number' name='member_price' value='".$rec['member_price']."'>"; 30 ?> 31 <select name='category'> 32 <option value="1">うまい棒</option> 33 <option value="2">チョコレート類</option> 34 <option value="3">スナック菓子</option> 35 <option value="4">ガム類</option> 36 <option value="5">珍味</option> 37 </select> 38 <?php 39 print "<input type='number' name='stock' value='".$rec['stock']."'>"; 40 print "<input type='radio' name='marketing' value='0'"; 41 if($rec['marketing']==0){ 42 print "checked"; 43 } 44 print ">販売不可"; 45 print "<input type='radio' name='marketing' value='1'"; 46 if($rec['marketing']==1){ 47 print "checked"; 48 } 49 print ">販売可能"; 50 print "<textarea name='description' value='".nl2br($rec['description'])."'></textarea>"; 51 print "<input type='file' name='image'>"; 52 //↑ここに画像ファイルを入れても、完了ページにその画像が届かない 53 } 54 55 $dbh=null; 56 ?> 57 <input type="submit" name="submit" value="編集"> 58</form>

更新完了ページのソースコード

PHP7.1

1<?php 2function h($str){ 3 return htmlspecialchars($str,ENT_QUOTES,"UTF-8"); 4} 5 6$name=$_POST['name']; 7$id=$_POST['id']; 8$price=$_POST['price']; 9$member_price=$_POST['member_price']; 10$category=$_POST['category']; 11$category_id=$category; 12 13$category_master[1]="うまい棒"; 14$category_master[2]="チョコレート類"; 15$category_master[3]="スナック菓子"; 16$category_master[4]="ガム類"; 17$category_master[5]="珍味"; 18 19$category=$category_master[$category]; 20 21$description=$_POST['description']; 22 23$stock=$_POST['stock']; 24 25$marketing=$_POST['marketing']; 26 27//↓画像に関する処理 28$tmp_name=$_FILES['image']['tmp_name']; 29$file_type=$_FILES['image']['type']; 30 31$image_name="torachan".$id.".jpg"; 32 move_uploaded_file($tmp_name,"upload/".$image_name); 33//↑ここまで 34 35 $dsn='mysql:dbname=original;host=localhost'; 36 $user='root'; 37 $password=''; 38 $dbh=new PDO($dsn,$user,$password); 39 $dbh->query('SET NAMES utf8'); 40 41 $sql = "UPDATE stock_info SET name=?, price=?, member_price=?, category_id=?, category=?, description=?, stock=?, marketing=?, image=? WHERE sid='" . $id . "'"; 42 $stmt=$dbh->prepare($sql); 43 $stmt->bindValue('1', $name); 44 $stmt->bindValue('2', $price); 45 $stmt->bindValue('3', $member_price); 46 $stmt->bindValue('4', $category_id); 47 $stmt->bindValue('5', $category); 48 $stmt->bindValue('6', $description); 49 $stmt->bindValue('7', $stock); 50 $stmt->bindValue('8', $marketing); 51 $stmt->bindValue('9', $image_name); 52 $stmt->execute(); 53 $dbh=null; 54?> 55 56<!doctype html> 57<html> 58 <head> 59 <meta charset="utf-8"> 60 <title>商品管理</title> 61 </head> 62 63 <body> 64 更新情報 65 <?php 66 $dsn='mysql:dbname=original;host=localhost'; 67 $user='root'; 68 $password=''; 69 $dbh=new PDO($dsn,$user,$password); 70 $dbh->query('SET NAMES utf8'); 71 $sql='SELECT*FROM stock_info WHERE id="'.$id.'"'; 72 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 73 $stmt=$dbh->prepare($sql); 74 $stmt->execute(); 75 76 //↓ここから下が表示されない 77 //$recからのデータ抽出をwhileでループさせる 78 if($rec['image']!=""){ 79 print "<img src='upload/".$rec['image']."'>"; 80 } 81 print $rec['name']; 82 print $rec['id']; 83 print $rec['name']; 84 print $rec['price']; 85 print $rec['member_price']; 86 print $rec['category_id']; 87 print $rec['category']; 88 print $rec['description']; 89 print $rec['stock']; 90 print $rec['marketing']; 91 92 $dbh=null; 93 94?> 95 </body> 96</html>

試したこと

何を試せばいいのかさえ分かりませんでした。

補足情報(FW/ツールのバージョンなど)

データベース:MySQL
データベース名:original
テーブル名:stock_info
カラム名:code,name,id,price,member_price,category_id,category,description,stock,marketing,image

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

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

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

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

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

dice142

2018/10/12 06:52

ソースコードはファイルごとにコードブロックで囲んでいただければ見やすいです。
guest

回答3

0

<form action="edit_complete.php" method="post">

<form action="edit_complete.php" method="post" enctype="multipart/form-data">

として試す。
なぜならば、それをつけないとファイルのアップロードデータを処理できないから。

投稿2018/10/12 07:22

編集2018/10/15 01:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TOM.

2018/10/15 11:14

返信が遅れてすみません。 指摘された点を修正したところ、無事にアップロード出来ました。ありがとうございました。
guest

0

ベストアンサー

ファイル毎にコードが分割されていないため、多分に想像を含んで書きますが、
以下のコードの部分で「$_FILESにimageなんてないよ」って怒られちゃってます。
(恐らくここがedit_complete.phpの29、30行目でしょう)

PHP

1//↓画像に関する処理 2$tmp_name=$_FILES['image']['tmp_name']; 3$file_type=$_FILES['image']['type'];

$_FILESの中身を確認することが先決かと。

######追記
$_FILESについて
<input type='file' name=名前>formpostすれば、
$_FILES[名前]でアップロードしたファイルの要素を取得できる
というのは質問者さんの認識通りです。

PHP

1print "<input type='file' name='image'>"; 2//↑ここに画像ファイルを入れても、完了ページにその画像が届かない

上記より、postでうまいことファイルをアップロードできていないのではないかと推測されます。
$_FILESの中身について下に記述しましたが、
確認するべきは「商品登録情報編集ページ」からの$_POSTの方かもしれませんね。

m6u 様の回答にあるように、上記inputenctype="multipart/form-data"がないのが
うまいこといっていない原因な気がします。

PHP $_FILES(ファイル変数)のすべて!【初心者向け基本】

$_FILESの中身について
var_dump($_FILES)かなんかで見てみてください。
imageが含まれていないことが確認できるはずです。

投稿2018/10/12 06:58

編集2018/10/12 07:33
madoka9393

総合スコア992

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

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

TOM.

2018/10/12 07:14

$_FILESの中身というと、更新ページで<input type='file' name='image'>に入れた画像ファイルのことでしょうか。 更新ページで画像を入れて送信はしているのですが、エラーが出ています。見るべき場所が違うのでしょうか?
madoka9393

2018/10/12 07:26 編集

追記しました。 恐らくですがpostがうまいこといってない原因は m6u 様の回答の通りではないかと。 (編集してからenctypeがないことに気付きました…)
TOM.

2018/10/15 11:12

返信が遅れてすみません。 無事に解決しました、ありがとうございます。サイトも紹介して頂けたので、ベストアンサーに選ばせて頂きます。
guest

0

とりあえず以下のSQL文の更新する項目の間にカンマがありませんが、修正して実行したらどうなるでしょうか?

PHP

1$sql = "UPDATE stock_info SET name=?, price=?, member_price=?, category_id=?, category=?, description=?, stock=?, marketing=?, image=? WHERE sid='" . $id . "'";

投稿2018/10/12 06:54

tabuu

総合スコア2449

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

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

TOM.

2018/10/12 07:08

ご指摘の通り、確かにカンマが抜けてました。ありがとうございます。ただ、そこを直しても更新後の情報は表示されませんでした・・・。
tabuu

2018/10/12 07:30

他の方がおっしゃっているように、FORMタグを修正して、 <input type='file' name='image'> を <input type='file' name='image[]'> として、該当のエラーの箇所を、 $tmp_name=''; foreach ($_FILES['image']['tmp_name'] as $tmp) { if ($tmp) { $tmp_name = $tmp; break; } } 直接ここに書いたのでエラーチェックしていませんのでデバッグしてみてください。
tabuu

2018/10/12 07:40

と書きましたが、よく見ると複数行同時に編集するんですかね。 idやprice等のinputタグのnameはすべて配列にする必要があり、受け取ったPHP側でも配列をループして1行単位でupdateする必要があります。 課題の内容を変更できるのであれば1行単位でFORMタグを作ったほうが作りやすいと思います。
TOM.

2018/10/15 11:19

返信が遅れてすみません。 formタグを修正した時点で上手くいきました。sqlの不備も指摘して頂いてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問