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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

3回答

1207閲覧

PHPでデータベースに画像をアップロードできない

ShotaTakasaki

総合スコア21

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/04/21 07:05

編集2020/04/23 10:16

気づけばプロ並みPHPと言う本で現在phpを学習しているPHP初心者です
そこでデータベースに画像をアップロードができません
買い物サイトをサンプルで作っていて、商品を新しく登録する際に
商品のcode,name,price,gazouをデータベースのテーブルには作成しています
構造は画像の通りです
イメージ説明

以下のコードをXAMPPで実行し、新規で商品を登録すると、

Notice: Undefined index: gazou_name in /opt/lampp/htdocs/product/pro_add_done.php on line 13 SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'gazou' cannot be null#0 /opt/lampp/htdocs/product/pro_add_done.php(29): PDOStatement->execute(Array) #1 {main}

というエラーが出てデータベースに商品を登録できません
データベースのgazouがnullが許可されていないと思ったので、
データベースのnullにチェックを入れて再度実行したら、
商品の登録は出来たのですが画像はnullになってしまいます
どのようにすれば画像がアップできるようになるのでしょうか?
ご教授いただければと思います

pro_add.php(商品新規登録画面)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; "charset="utf-8"> <title>Flitch</title> </head> <body> <p>商品追加</p> <form method = "post" action="pro_add_check.php" enctype="multipart/form-data"> <p>商品名を入力してください</p> <p><input type="text" name="name" style="width: 200px"></p> <p>価格を入力してください</p> <p><input type="text" name="price" style="width: 50px"></p> <p>画像を選んでください</p> <p><input type="file" name="gazou" style="width: 400px"></p> <p><input type="button" onclick="history.back()" value="戻る"></p> <p><input type="submit" value="OK"></p> </form> </body> </html>
pro_add_check.php(商品新規登録確認画面)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; "charset="utf-8"> <title>Flitch</title> </head> <body> <?php $pro_name=$_POST['name'];// 商品名 $pro_price=$_POST['price'];// 値段 $pro_gazou=$_FILES['gazou'];// 商品の画像 $pro_name=htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8');// 悪意のある入力をブロック $pro_price=htmlspecialchars($pro_price,ENT_QUOTES,'UTF-8');// 悪意のある入力をブロック $pro_gazou=htmlspecialchars($pro_gazou,ENT_QUOTES,'UTF-8');// 悪意のある入力をブロック if($pro_name=='')// もし名前が空欄なら { print'<p>商品名が入力されていません</p>'; } else// そうでなければ { print'<p>商品名:'.$pro_name.'</p>';// 商品名を表示する } if(preg_match("/^[0-9]+$/", $pro_price)==0)// 【テキスト通りではできなかった】 もし、半角英数字で入力されてなかったら、 { print'<p>半角英数字で入力してください</p>'; } else// 半角英数字で入力されていたら、 { print'価格:';// 値段を表示する print$pro_price; print'円<br />'; } if($pro_gazou['size']>0)// もし、画像のサイズが0より大きいなら、 { if($pro_gazou['size']>1000000)// もし画像の大きさが1000000より大きいなら { print'画像が大きすぎます'; } else// 画像のサイズが1000000より小さかったら、 { move_uploaded_file($pro_gazou['tmp_name'], './gazou/'.$pro_gazou['name']);// 画像をアップロードして画像の名前を表示する print'<img src="./gazou/'.$pro_gazou['name'].'">'; print'<br />'; } } if($pro_name==''|| preg_match("/^[0-9]+$/", $pro_price)==0 || $pro_gazou['size'] > 1000000)// 【テキスト通りではできなかった】もし、商品名が空欄or半角英数字で入力されていないor画像サイズが1000000より大きいなら、 { print'<form>'; print'<input type ="button" onclick="history.back()" value="戻る">';// 戻るボタンを表示する print'</form>'; } else// そうでなければ、 { print'<p>上記の商品を追加します</p>'; print'<form method="post" action="pro_add_done.php">';// pro_add_done.phpに移動 print'<input type="hidden" name="name" value="'.$pro_name.'">';// 移動後のページ用の見えないデータ print'<input type="hidden" name="price" value="'.$pro_price.'">';// 移動後のページ用の見えないデータ print'<input type="hidden" name="gazou_name" value="'.$pro_gazou['name'].'">';// 移動後のページ用の見えないデータ print'<br />'; print'<input type="button" onclick="history.back()" value="戻る">'; print'<input type="submit" value="OK">'; print'</form>'; } ?> </body> </html>
pro_add_done.php(商品新規登録実行画面)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; "charset="utf-8"> <title>Flitch</title> </head> <body> <?php try { $pro_name=$_POST['name']; $pro_price=$_POST['price']; $pro_gazou_name=$_POST['gazou_name']; $pro_name=htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8'); $pro_price=htmlspecialchars($pro_price,ENT_QUOTES,'UTF-8'); $dsn='mysql:dbname=shop;host=localhost;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql='INSERT INTO mst_product(name,price,gazou) VALUES(?,?,?)'; $stmt=$dbh->prepare($sql); $data[]=$pro_name; $data[]=$pro_price; $data[]=$pro_gazou_name; $stmt->execute($data); $dbh=null; print$pro_name; print'を追加しました。<br />'; } catch(Exception $e) { //print'ただいま障害により大変ご迷惑をお掛けしております。'; echo $e->getMessage();// エラーを表示するために入力 echo $e->getTraceAsString();// エラーを表示するために入力 exit(); } ?> <a href="pro_list.php">戻る</a> </body> </html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/21 07:25

気づけばプロ並みPHPがPHP7対応版じゃなければ、かなり古い本で今どきの事情が反映されていないため、別の書籍での学習をおすすめします。
ShotaTakasaki

2020/04/21 08:31

m6uさん そうなのですね・・・ この本が一番やりたいことに近くて選んだのですが・・・ m.ts10806 解決してないのですが、もしかしたらその先を実装したら直るかと思ってやってみたら結局変わらずでした・・・ 書籍を変えることも検討したいのですが、中々今やっているようなことを解説している書籍が見つからなくて・・・
退会済みユーザー

退会済みユーザー

2020/04/21 08:39

データベースに最終的に登録する3つ目のphpで、なんらPOST受信したデータを検証せずデータベース登録する流れが、フォームに悪意を持って細工されたときにしくじりそうで怖いと思った。 また、データの中身を気にせずなんでもかんでも htmlspecialchars() で加工していて、とくにデータベースに登録するデータを加工してしまうのはナンセンスだと思う。 あと、今現在のテーブルの構造を見ていないので、構造を見せてもらえればまたいくつものアドバイスが付くかもしれない。
m.ts10806

2020/04/21 08:40

目的が何かによります。 PHPマニュアルを活用できるようになることは最優先です。
ShotaTakasaki

2020/04/21 08:48

m6uさん まずはセキュリティよりも一通りのそれっぽい機能を実装してみたいという段階です テーブルの構造画像で載せましたのでご意見頂けたらと思います m.ts10806さん まずは、練習中という段階ですので一通りのユーザーが情報を登録する機能(画像や動画込み)、メールのやりとり、ログイン機能などを実装したいと思っています
guest

回答3

0

ベストアンサー

これ、Insertまでこけずにできるのに、画像パスのカラム内は空っぽなんだけどーってことでしょうか?

確認画面の時点で$_FILES['gazou']は正しく取得できてますか?
そのへんから怪しそうなら、$_FILES配列内のerror確認してみるとか。
https://www.flatflag.nir87.com/move_uploaded_file-970#_FILES

めっちゃ小さい画像なら保存できるようならこのあたりの設定とか、
http://bashalog.c-brains.jp/12/02/02-105952.php
画像の保存ディレクトリの権限(プログラム側から実行できるか)設定とかもよくつまづく要素かと。

投稿2020/04/23 23:44

編集2020/04/23 23:58
rinrinwonder

総合スコア9

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

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

ShotaTakasaki

2020/04/24 07:07

pro_add_check.phpの15行目を消したら直りました
guest

0

確認画面だとtempのgazou_nameをhiddenで持たせる想定でいるのに、
inputがgazouのままになってるままだからじゃないですかね。

投稿2020/04/23 09:11

hot3

総合スコア37

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

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

ShotaTakasaki

2020/04/23 09:48

ありがとうございます! 確かにご指摘の通り、入力が間違っておりました ただ他にも間違っているのかまだ画像が上げられません・・・ 他の部分も確認してみます
hot3

2020/04/23 10:03 編集

print$pro_name; print'を追加しました。<br />'; この部分もスペース入ってないのが気になります。 よく見たら他のprintもスペース入ってないんですね。 自分使わないのでよくわからなかったです。すみません
ShotaTakasaki

2020/04/23 10:07

スペースなくても大丈夫そうだったので入れてませんでした 細かく見て頂き、ありがとうございます
guest

0

shop.mst_product.price がdatetime型になっていて、書式が合ってないってことだから、
テーブルの定義を確認して直してください。

$pro_price として与えているデータが、datetime(日付時刻型)だとみなされるような書き方をしていて、intに与えるには書式がおかしいってことかなと。
INSERT INTO文に与えている $pro_price の中身をチェック。

投稿2020/04/21 07:24

編集2020/04/23 03:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ShotaTakasaki

2020/04/23 03:34

ありがとうございます 引き続き進めてみたら今度はエラーがこうなりました・・・ データベースは画像の通りに設定しているのですが・・・ Notice: Undefined index: gazou_name in /opt/lampp/htdocs/product/pro_add_done.php on line 13 SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'gazou' cannot be null#0 /opt/lampp/htdocs/product/pro_add_done.php(29): PDOStatement->execute(Array) #1 {main}
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問