//tips
//php理解
続いて商品修正画面を確認。
<body>
<?php
try
{
$pro_name=$_POST['code'];
$pro_name=$_POST['name'];
$pro_price=$_POST['price'];
$pro_code=htmlspecialchars($pro_code,ENT_QUOTES,'UTF-8');
$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 = 'UPDATE mst_product SET name=?,price=? WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[]=$pro_name;
$data[]=$pro_price;
$data[]=$pro_code;
$stmt->execute($data);
$dbh=null;
print'修正しました。<br/>';
}
catch(Exception $e)
{
print'ただいま障害によろ大変迷惑をおかけしております。';
echo $e->getMessage();
exit();
}
?>
<a href="pro_list.php">戻る</a>
</body>
商品削除実行画面も作成。
<body>
<?php
try
{
$pro_code=$_POST['code'];
$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 = 'DELETE FROM mst_product WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[]=$pro_code;
$stmt->execute($data);
$dbh=null;
}
catch(Exception $e)
{
print'ただいま障害によろ大変迷惑をおかけしております。';
exit();
}
?>
削除しました。</br>
<br/>
<a href="pro_list.php">戻る</a>
</body>
商品画像の追加方法を確認していく。画像のカラムは画像だがvarchar型で定義されており、画像ファイル名を管理し、実際の画像は画像用のフォルダに格納する。productフォルダにgazouフォルダを作成。
そして登録画面に画像情報を追加する。
<!DOCTYPE html>
<html>
<head>
<meta charset-"UTF-8">
<title>登録画面</title>
</head>
<body>
商品追加<br/>
<br/>
<form method="post" action="pro_add_check.php" enctype="multipart/form-data">
商品名を入力してください<br/>
<input type="text" name="name" style="width:200px"><br/>
価格を入力してください<br/>
<input type="text" name="price" style="width:50px"><br/>
画像を選んでください<br/>
<input type="file" name="gazou" style="width:400px"><br/>
<br/>
<input type ="button" onclick="history.back()" value="戻る">
<input type ="submit" value="OK">
</form>
</body>
</html>
画像もinputタグで取り込むことができ、input type=“file”とする。これにより画像だけでなくファイルを取り込めるようになる。
ファイルをうまく取り込むためにはformタグにenctypeの情報を追加しておく必要があるので忘れない。
ここから選んだ画像ファイルをチェックする機能を追加していく。
<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');
if($pro_name=='')
{
print'商品名が入力されていません。<br/>';
}
else
{
print'商品名:';
print$pro_name;
print'<br/>';
}
if(preg_match('/^[0-9]+$/',$pro_price)==0)
{
print'価格をきちんと入力してください。<br/>';
}else{
print'価格:';
print $pro_price;
print'円<br/>';
}
if($pro_gazou['size']>0){
if($pro_gazou['size']>1000000)
{
print'画像が大きすぎます';
}else{
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)
{
print'<form>';
print'<input type="button" onclick="history.back()" value="戻る">';
print'</form>';
}
else
{
print'上記の商品を追加します。<br/>';
print'<form method ="post" action="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>
これで実行してみると下記のエラーが発生。手動でproductのgazouフォルダにjpg画像を挿入し、画像は表示できた。コードのgazouフォルダへのアップロード命令が実行できていないよう。
Warning: move_uploaded_file(./gazou/broccoli.jpg): failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/product/pro_add_check.php on line 41
Warning: move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phpnol4Mo' to './gazou/broccoli.jpg' in /Applications/XAMPP/xamppfiles/htdocs/product/pro_add_check.php on line 41
下記サイトを参考にgazouフォルダの情報を確認し、共有部分の制限を読み書きに変更。
これにより無事にエラーは解決した。
$pro_gazou=$_FILE[‘gazou’]で画像情報を変数に入れて、サイズ、仮のアップロード場所と名前、画像ファイルの名前を格納された情報として$pro_gazouから取り出している。
move_upload_file(移動元,移動先);で移動させるが、画像ファイルは$pro_gazou[’tmp_name’]が示すフォルダにあり、そこにアップロードされた際に、サーバにファイル名が書き換えられるので、再度元のファイル名に直してgazouフォルダに移動させるという工程を踏んでいる。
プログラムと同じフォルダは.、一段上のフォルダは..で表す。
データベースにも画像名を追加していきたいので、下記のように対応している。
<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();
exit();
}
?>
<a href="pro_list.php">戻る</a>
</body>
商品詳細参照画面にも画像が出るようにする。
<body>
<?php
try{
$pro_code=$_GET['procode'];
$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='SELECT name,price,gazou FROM mst_product WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[]=$pro_code;
$stmt->execute($data);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$pro_name=$rec['name'];
$pro_price=$rec['price'];
$pro_gazou=$rec['gazou'];
$dbh=null;
if($pro_gazou_name=''){
$disp_gazou='';
}else{
$disp_gazou='<img src="./gazou/'.$pro_gazou_name.'">';
}
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
商品情報参照<br/>
<br/>
商品コード<br/>
<?php print $pro_code;?>
<br/>
商品名<br/>
<?php print $pro_name;?>
<br/>
価格<br/>
<?php print $pro_price;?>円
<br/>
<?php print $disp_gazou;?>
<br/>
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
</body>
画像の修正にも対応できるようにする。
古いファイルの削除はunlink(‘ファイル名’)で削除可能。
<body>
<?php
try
{
$pro_name=$_POST['code'];
$pro_name=$_POST['name'];
$pro_price=$_POST['price'];
$pro_gazou_name_old=$_POST['gazou_name_old'];
$pro_gazou_name=$_POST['gazou_name'];
$pro_code=htmlspecialchars($pro_code,ENT_QUOTES,'UTF-8');
$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 = 'UPDATE mst_product SET name=?,price=?,gazou=? WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[]=$pro_name;
$data[]=$pro_price;
$data[]=$pro_code;
$data[]=$pro_gazou_name;
$stmt->execute($data);
$dbh=null;
if($pro_gazou_name_old!='')
{
unlink('./gazou/'.$pro_gazou_name_old);
}
print'修正しました。<br/>';
}
catch(Exception $e)
{
print'ただいま障害によろ大変迷惑をおかけしております。';
echo $e->getMessage();
exit();
}
?>
<a href="pro_list.php">戻る</a>
</body>