気づけばプロ並み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>
回答3件
あなたの回答
tips
プレビュー