6 プログラムを作る四

  ここで扱うプログラムは、ほぼ前回のものとかわりません。わずかに違うのは、保存する画像のサイズを縮小して保存する点です。
一応、phpプログラムでデータベースを操作すプログラムについては、今回で終わります。
  本当に中途半端なのですが、章の後半は、レコードを更新・削除の例を紹介します。

Ⅰ サムネイル画像の保存


 この前と同じ繰り返しなので退屈かもしれませんね。もっと短くまとめることができるんもしれけど、これで精一杯です。

walk_titlephoto_select.php

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
	<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<style>
	img{
	    max-height: 400px;
	    }
	</style>
	<script type="text/javascript" src="./jquery.js"></script>
	<script type="text/javascript">
	$(function() {
	  $('input[type=file]').after('<span></span>');

	  // アップロードするファイルを選択
	  $('input[type=file]').change(function() {
	    var file = $(this).prop('files')[0];

	    // 画像以外は処理を停止
	    if (! file.type.match('image.*')) {
	      // クリア
	      $(this).val('');
	      $('span').html('');
	      return;
	    }

	    // 画像表示
	    var reader = new FileReader();
	    reader.onload = function() {
	      var img_src = $('<img>').attr('src', reader.result);
	      $('span').html(img_src);
	    }
	    reader.readAsDataURL(file);
	  });
	});
	</script>
	</head>
	<body text="black" background="./gazo/background1.gif">
	<center><h2>登録する画像の選択</h2><br>
	アップロードするファイルを選択してください。:<br>
	<table cellpadding="1" cellspacing="1" align="center">
	<tr><td bgcolor=#eeaa88><pre>保存する画像 : </pre></td>
	<form  action="walk_titlefileupload.php" enctype="multipart/form-data" method="post">
	<tr><td algin="left" valign="top"><input type="file" name="userfile" accept="image/*"></td></tr>
	<tr><td>  </td></tr>
	<tr><td align="center"><input type=submit value="登録する"><input type=reset value="リセット"></td></tr>
	</table>
	</form>
	<center>
	<form action="サイト名" method="post">
	<input type="submit" value="メインに戻る"/>
	</form> 
	</center>
	</body>
	</html>

ここもほとんど同じですね、でも一つだけちがうのは、画像の横幅を指定できるということかな。デフォルトは、200ピクセルですが、自由にかえられるよ。

walk_titlefileupload.php

	<html>
	<head><title>我が家のホームページ</title></head>
	<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
	</head>
	<body text="black" background="./gazo/background1.gif">
	<center><h3>画像の新規登録</h3></center>
	<?php
	$filepath="";
	$file = $_FILES['userfile'];
	$ext = substr($file['name'],-4);
	if($ext =='.jpg' || $ext == '.JPG'){
	   $filepath = './img/' . $file['name'];
	   $success = move_uploaded_file($file['tmp_name'],$filepath);
	   if($success){
	 	  print("<center><img src=\"$filepath\" width=\"250\"></center>");
	   }else{
	 	 print("ファイルのアップロードに失敗しました。");
	  }
	}
	$db= new PDO("mysql:host=127.0.0.1;dbname=walkphoto;charset=utf8",'root','password');
	?>
	<table border="0" align="center">
	<form action="walk_titlefileupload.php" method="POST">
	<input type="hidden" name="filepath" value="<?php echo $filepath ?>">
	<tr> 
	<td bgcolor="#eeaa88">タイトル名 :</td>
	<td width="100">
	<select name="id" >
	<?php
	$result = $db->query("SELECT * FROM places");
	while ($row = $result ->fetch(PDO::FETCH_NUM)) {
	?>
		   <option value="<?php echo $row[0]?>"><?php echo $row[2]?></option>
	<?php
	}=
	?>
	</select></td>
	</tr>
	<tr>
	<td>横幅(px) :</td>
	<td><input type="text" name="w_len" value="200"></td>
	</tr>
		<input type="hidden" name="filepath" value="<?php echo $filepath ?>">
	<tr>
	<td colspan="2" align="center">
	<input type=submit value="送信する"><input type=reset value="リセット">
	</td>
	</tr>
	</table><p>
	</form>
	<?php

	 $db=null;

	?>
	<cener>
	<form action="サイト名" method="post">
	<input type="submit" value="メインに戻る"/>
	</form> 
	</center>

	</body>
	</html>

このサイトのプログラムを採用させていただきました。 そっくりそのまま、関数にしたのですぐに機能すると思ったけど、そうでもなかったのです。どこでつまずいたのかは後でわかります。

walk_titlefile_save.php

	<html>
	<head><title>我が家のホームページ</title></head>
	<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
	</head>
	<body text="black" background="./gazo/background1.gif">
	<center><h2>タイトル画像の新規登録</h2></center>
	<?php

	function make_thumbnail($srcPath,$dstPath,$width_s){

	   $imagesize=getimagesize($srcPath);
	   //サイズを取得
	   $width=$imagesize[0];
	   $height=$imagesize[1];
	   //サムネイルのサイズ
	   //$width_s=120;
	   $height_s=round($width_s*$height/$width);
	 
	//--------------------------------------------------------
	//  ②imagecreatefromjpeg関数で画像を取り出しサンプリングに使う。
	//--------------------------------------------------------    
	     $image=imagecreatefromjpeg($srcPath);
	  
	//--------------------------------------------------------
	//  ③imagecreatetruecolor関数でベースをつくり
	//    そこにサンプリングしてコピーする
	//--------------------------------------------------------
	 
	     $image_s=imagecreatetruecolor($width_s, $height_s);
	                
	     //サンプリングする
	     $result=imagecopyresampled($image_s,$image,0,0,0,0,$width_s,$height_s,$width,$height);
	 
	//--------------------------------------------------------
	//  ④imagejpg関数でブラウザあるいはファイルとして出力する
	//--------------------------------------------------------
	 
	     if($result){ //サンプリングによる画像作成成功
	            if(imagejpeg($image_s,$dstPath)){ 
	                 $msg="サムネイル作成成功";
	               }else{
	                 $msg="サムネイル作成失敗";
	               }
	      }else{
	            $msg="サンプリング失敗";
	      }
	                
	         //取り出した元画像とサンプリングのための作成したベースが画像を削除する
	         imagedestroy($image);
	         imagedestroy($image_s);
	         return $msg;
	}
	$filepath=htmlspecialchars($_REQUEST['filepath'],ENT_QUOTES);
	$id=htmlspecialchars($_REQUEST['id'],ENT_QUOTES);
	$w_len=htmlspecialchars($_REQUEST['w_len'],ENT_QUOTES);
	↓最初のつまずき
	$srcfile=$_SERVER['DOCUMENT_ROOT']."/wordpress/walkphoto".substr($filepath,1);
	$db= new PDO("mysql:host=127.0.0.1;dbname=walkphoto;charset=utf8",'root','lczqx23k#H');
	$sql="SELECT * FROM places WHERE id=" .$id;
	$result=$db->query($sql);
	$row=$result->fetch(PDO::FETCH_ASSOC);
	$yname=$row['yname'];
	$imagename="./photoes/".$yname.".jpg";
	$db=null;
	↓二つ目のつまずき
	font color="red">$dstfile= $_SERVER['DOCUMENT_ROOT']."/wordpress/walkphoto".substr($imagename,1);
	$success=copy($srcfile,$dstfile);
	if($success){
		
		$msg=make_thumbnail($srcfile,$dstfile,200);
		if($msg=="サムネイル作成成功"){
			print("<img src=\"$imagename\">\n");
			print("<center><font color=\"red\">画像が更新されない場合、コントロールキーとRキーを同時に押すと画像が更新されます。(Firefoxの場合)</font></center>");

		}else{
		    echo $message;
		}
	}
	?>

	<center>
	<form action="サイト名" method="post">
	<input type="submit" value="HOMR"/>
	</form> 
	</center>
	</body>
	</html>

最初のつまずきも二つ目のつまずきも原因が同じです。php特有の式で、文字列と式や変数をつなげる「ドット(.)」の位置が不正確なために元の画像の場所も、サムネイル画像を作成する場所も指定できないのです。

エラーのメッセージも英語のためちんぷんかんぷんです。
次のようなそこで考えたのはすごく原始的な解決方法でした。

エラーが出た所から下の部分をカットし、カットした部分をもちろん保存しておきます。

	$filepath=htmlspecialchars($_REQUEST['filepath'],ENT_QUOTES);
	$id=htmlspecialchars($_REQUEST['id'],ENT_QUOTES);
	$w_len=htmlspecialchars($_REQUEST['w_len'],ENT_QUOTES);
	↓ カット
	($srcfile=$_SERVER['DOCUMENT_ROOT']."/wordpress/walkphoto".substr($filepath,1);)
  
  
  
  ?>←挿入
	↓以下は残しておく
	<center>
	<form action="サイト名" method="post">
	<input type="submit" value="HOMR"/>
	</form> 
	</center>
	</body>
	</html>

$dstfileが思いどおりに表示されるか試してみた。

	$filepath=htmlspecialchars($_REQUEST['filepath'],ENT_QUOTES);
	$id=htmlspecialchars($_REQUEST['id'],ENT_QUOTES);
	$w_len=htmlspecialchars($_REQUEST['w_len'],ENT_QUOTES);
	($dstfile= $_SERVER['DOCUMENT_ROOT']."/wordpress/walkphoto".substr($imagename,1);)
	?>
	<?php echo $dstfile?>
	
	<center>
	<form action="サイト名" method="post">
	<input type="submit" value="HOMR"/>
	</form> 
	</center>
	</body>
	</html>	

一つ目も二つ目も思い通りに表示されたら、保存した文を戻す、

	$filepath=htmlspecialchars($_REQUEST['filepath'],ENT_QUOTES);
	$id=htmlspecialchars($_REQUEST['id'],ENT_QUOTES);
	$w_len=htmlspecialchars($_REQUEST['w_len'],ENT_QUOTES);
	$db= new PDO("mysql:host=127.0.0.1;dbname=walkphoto;charset=utf8",'root','lczqx23k#H');
	$sql="SELECT * FROM places WHERE id=" .$id;
	$result=$db->query($sql);
	$row=$result->fetch(PDO::FETCH_ASSOC);
	$yname=$row['yname'];
	$imagename="./photoes/".$yname.".jpg";
	$db=null;
	$dstfile= $_SERVER['DOCUMENT_ROOT']."/wordpress/walkphoto".substr($imagename,1);
	$success=copy($srcfile,$dstfile);
	if($success){
		
		$msg=make_thumbnail($srcfile,$dstfile,200);
		if($msg=="サムネイル作成成功"){
			print("<img src=\"$imagename\">\n"):
			print("<center><font color=\"red\">画像が更新されない場合、コントロールキーとRキーを同時に押すと画像が更新されます。(Firefoxの場合)</font></center>");

		}else{
		    echo $message;
		}
	}
	?>

	<center>
	<form action="サイト名" method="post">
	<input type="submit" value="HOMR"/>
	</form> 
	</center>
	</body>
	</html>

phpの式で「ドット(.)」で文字列などをつなぐ場面が数多く出てきます。単純に半角の入力モードでドットを入力すれば問題ないのですが、よけいな間隔を作ったりするとこのような羽目におちいります。

Ⅱ レコードの更新・削除

(1)削除の例

	<?php
	// 変数の初期化
	$sql = null;
	$res = null;
	$dbh = null;
	try {	// DBへ接続	
		$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');
		// SQL作成	
		$sql = "DELETE FROM user_list WHERE id = 3";
		// SQL実行	
		$res = $dbh->query($sql);
	} catch(PDOException $e) {	
		echo $e->getMessage();
		die();}
	// 接続を閉じる
		$dbh = null;

(2)更新の例

	<?php
	// 変数の初期化
	$sql = null;
	$res = null;
	$dbh = null;
	try {	
		// DBへ接続	
		$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');
		// SQL作成	
		$sql = "UPDATE user_list SET age = 15 WHERE id = 4";
		// SQL実行	
		$res = $dbh->query($sql);
	} catch(PDOException $e) {	
		echo $e->getMessage();
		die();}
	// 接続を閉じる
		$dbh = null;

どちらも$sqlの作り方がむずかしいだけで困難な所が見られません。
また更新や削除などは、phpMyAdminを利用することをおすすめします。
  ウェブにはphpについてのプログラムの事例がたくさん公開されています。いろいろ考えが思いついたら検索をかけてみてください。
  さて、このシリーズもしめくくりをむかえます。
  最後にメニューについて取り組みます。