6 プログラムを作る三

  phpMyAdminwでデータの追加の例を紹介します。
  次に画像データのデータベースへの登録をphpのプログラムで行った例を紹介します。
  家庭内のネットワークでの処理を前提にしているので、phpを動作させても問題にならないと思います。

1 phpMyAdminでデータの追加

これからは、ぼくが案内するね。まず、サイト名/phpMyAdminでログインしてね。

テーブル「places」を選び、上のバーの「挿入」タグをクリックします。

入力画面になります。問題はカラム名のidですね。今までのデータの最後尾が「13」ですから「14」ですよ。ynamは半角、jnameは全角ですよ。

実行ボタンを押すと、クエリー文が表示されます。プログラムを書くときは、この文のようにプログラムを書けばいいよ。

どうですか。まちがえたら、データを削除してやりなおせばいいので簡単でしょう。文だけを扱うには、この方法が一番良いと思います。
でも次のように画像を登録する場合(たとえパス名だけの登録とはいえ)、少し複雑になるので、プログラムで処理した方がまちがえがないように思います。

2 phpでデータの追加

  「walk_photo_select.php」→「walk_fileupload.php」→「walk_file_save.php」→「walk_photo_regist.php」 と目まぐるしくファイルのリレーが続き、画像の新規登録を含む、「photoes」テーブルのデータの追加がされます。   

(1)walk_photo_select.php

このファイルは、ユーザーがPC内の画像を見ながら選択するところだけれど、phpらしいところがありません。別にphpでなくてhtmlファイルでもいいのです。
JavaScriptが活躍しています。このままプログラムを実行しても、うまく動作しません。なぜならjquery.jsと言うファイルが存在しないからです。 このサイトからjquery.jsをダウンロードしてください。
次に示す方法で作業してください。その際エディタを使ってコピーアンドペーストと保存をしてください。
お手元にエディタがない方はフリーのエディタをダウンロードしてみてください。サクラエディタとか秀丸エディタとかありますよ。

①ダウンロードページで「Download the compressed production jQuery-3.5.1」をクリック

②表示されたコードをすべてマウスで選択し、コピーする。

③エディタで白紙のファイルを開き、貼り付けます。

④「js」フォルダーに「jquery-3.5.1.min.js」というファイル名で保存する。

したがって、プログラムの方も<script type="text/javascript" src="js/jquery-3.5.1.min.js">

<walk_photo_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" />
	<font color="#008b8b"><style>
	img{
	    max-height: 400px;
	    }
	</style>
	<script type="text/javascript" src="js/jquery.js">
	</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文に注意してください。
	<form  action="walk_fileupload.php" enctype="multipart/form-data" method="post">
	<tr><td algin="left" valign="top"><input type="file" name="userfile" accept="image/*"><input type=submit value="登録する"><input type=reset value="リセット">&llt;/td></tr>
	</table>
	</form>
	<center>
	<form action="サイト名" method="post">
	<input type="submit" value="メインに戻る"/>
	</form> 
	</center>
	</body>
	</html>

①こんな画面になります。

②PC内を画像を確かめながら選択でるよ。選べたら開くボタンを押します。

③ファイル名だけを送信します。

(2)walk_fileupload.php


大事なことを落としていました。phpだけとは限りませんが、ファイルをアップロードする際、 一時的なファイルを仮のディレクトリ(フォルダー)に移動します。
一時的とはいえ、その場所にユーザーに書き込み権を与えておかなければいけないのですね。
そのフォルダーは、このphpのプログラムのあるフォルダーの中の「img」としてプログラムでは指定されています。

①「mkdir img」と入力。「/var/www/walkphoto」の下に「img」というディレクトリを作る。

②「chmod 666 img」と入力。ユーザーに読み書きのパーミッションを許可。


ではプログラムを見ていくね。赤の所は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>6lt;h3>画像の新規登録</h3></center>
	<?php
	$filepath="";
	$file = $_FILES['userfile'];
	画像ファイルのみをアップロードの対象としているので、拡張子があてはまるかどうかを判定しています。
	substrは、オプションがマイナスですから後ろから数字分だけ取り出す関数です。
	$ext = substr($file['name'],-4);
	if($ext =='.gif' || $ext =='.jpg' || $ext == '.png' || $ext == '.JPG'){
	   $filepath = './img/' . $file['name'];
	   $successは、テンポラリファイルを一時的に保存(移動)できたかどうかの判定に使われる。
	   $success = move_uploaded_file($file['tmp_name'],$filepath);
	   if($success){
	 	↓成功すれば画像が表示される
	 	  print("<center><img src=\"$filepath\" width=\"250\"></center>");
	   }else{
	 	 print("ファイルのアップロードに失敗しました。");
	  }
	}
	
	画像はどの場所に属しているか、つまり「places」テーブルとの関連づけを行います。
	$db= new PDO("mysql:host=127.0.0.1;dbname=walkphoto;charset=utf8",'root','password');
	?>
	<table border="0" align="center">
	<form action="walk_file_save.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>コメント :</td><td><input type="text" name="comment" length="200"></td></tr>
	<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>

実行するとこんな画面になります。

(3)walk_file_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
	// 最大値
	「photoes」の最大値を求める関数
	function maxNum($conn,$table) {
	$result= $conn->query("SELECT * FROM ".$table);
	$result->execute();
	$count=$result->rowCount();
    return $count + 1;
	}
	//イメージファイルの名前
	「画像のパス名」求める関数
	function getImagename($conn,$id,$name,$table1,$table2) {
		$result1 = $conn->query("SELECT ". $name . " FROM " . $table1 . " WHERE id=".$id);
		$row = $result1->fetch(PDO::FETCH_NUM);
		$yomi=$row[0];
		$result2 = $conn->query("SELECT COUNT(*) FROM " . $table2 . " WHERE image LIKE './photoes/" . $yomi . "%'");
		$row2 = $result2->fetch_row(PDO::FETCH_NUM);
		$count=$row2[0] + 1;
		$image="";
		if($count <10){
			$image="./photoes/" . $yomi . "0" . $count . ".jpg";
		}else{
			$image="./photoes/" . $yomi . $count . ".jpg";
			
		}
		return $image;
	}
	「places」テーブルのjnameのデータを求める関数
	
	function getPlace($conn,$name,$table,$id){
		$result1 = $conn->query("SELECT ". $name . " FROM " . $table . " WHERE id=".$id);
		$row = $result1->fetch(PDO::FETCH_NUM);
		return $row[0];
	}
	
	$filepath=htmlspecialchars($_REQUEST['filepath'],ENT_QUOTES);
	$id=htmlspecialchars($_REQUEST['id'],ENT_QUOTES);
	
	ここが一番わかりにくい所です。
まず「$_SERVER['DOCUMENT_ROOT']です。
これはApacheの設定ファイルhttpd.confで指定したドキュメントルートをさします。
ですから、phpブログラムがある場所を表していない可能性があります。
ぼくの場合、次のように直しました。
$srcpath=$_SERVER['DOCUMENT_ROOT'].substr($filepath,1); ↓修正 $srcpath=$_SERVER['DOCUMENT_ROOT']."/walkphoto".substr($filepath,1); $db= new PDO("mysql:host=127.0.0.1;dbname=walkphoto;charset=utf8",'root','パスワード'); $no=maxNum($db,"photoes"); $place=getPlace($db,"jname","places",$id); $image=getImagename($db,$id,"yname","places","photoes"); ここも修正しなければいけないでしょうね、 $dstpath=$_SERVER['DOCUMENT_ROOT']."/walkphoto".substr($imagename,1); $success=copy($srcpath,$dstpath); if($success){ unlink($srcpath); //データーベースに登録 $sql="INSERT INTO photoes (no,id,image,comment) VALUES(".$no.",".$id.",'".$image ."','".$comment."')"; $result_flag = $db->query($sql); $db=null; } else { // 移動に失敗したら表示される echo '移動できません!'; } if($result_flag){ ?> <center><h2>新規画像の登録</h2></center> <center><img src="<?php echo $image?>" width="250"></cente> <table cellpadding="1" cellspacing="1" align="center"> <tr><td>番号</td><td><?php echo $no?></td></tr> <tr><td>索引</td><td><?php echo $id?></td></tr> <tr><td>コメント</td><td><?php echo $comment?></td></tr> <tr><td>イメージ名</td><td><?php echo $image?>"></td></tr> </table> <center><p>以上の通り登録しました。</p></center> <?php } ?> <center> <form action="サイト名" method="post"> <input type="submit" value="メインに戻る"/> </form> </center> </body> </html>

実行するとこんな画面になります。

  PDOでレコードを追加する式はこの例の他にあるようですが、一番単純でしっくりした式を例としました。
  次の章は、画像からタイトル用の画像をプログラムで作るプログラムで取り組みます、
  一応、「プログラムを作る」をしめくくりとします。