ポンクソフト

画像アップロード掲示板 - PHPとPostgreSQLの連携入門

前ページ PHPとPostgreSQLの連携入門 TOP 次ページ

目次

  1. PHPとPostgreSQLの連携入門
  2. 掲示板1
  3. 掲示板2
  4. 5Wゲーム
  5. 販売管理システム
  6. 画像アップロード掲示板
  7. ショッピングカート

画像アップロード掲示板

PostgreSQL とは直接関係ないのですが、画像の扱い方を解説します。フォームからの画像ファイルアップロード・画像サムネイルの生成方法をここで学びます。

テーブルの作成

以下のようなテーブルを「pgbbs3」という名前で作成してください。掲示板2で作成した pgbbs2 と全く同じです。
列名データ型その他説明
noserial primary key記事番号
nametext名前
titletext題名
contentstext内容
timetimestamp default 'now'書き込み時刻
delkeytext削除キー
psqlを使う場合は、以下のように入力します(# はプロンプト)。
# create table pgbbs3(no serial primary key, name text, title text, contents text, time timestamp default 'now', delkey text);

画像ディレクトリの作成

ソースを格納するディレクトリに「image」ディレクトリを作成し、属性変更して「その他」に書込許可属性を与えます。

プログラムの作成

以下のソースを入力してください。但し
dbname=postgres user=postgres password=postgres
上記の部分は、テーブルを作成したDB名、ユーザ名、パスワードに変更してください。
<?php
$con = pg_connect("dbname=postgres user=postgres password=postgres");
if ($_POST['write']) {
  $name = get_form($_POST['name']);
  if (strlen($name) > 100) exit();
  if (!$name) $name = "名無しさん";
  $title = get_form($_POST['title']);
  if (strlen($title) > 100) exit();
  if (!$title) $title = "無題";
  $contents = get_form($_POST['contents']);
  if (strlen($contents) > 500) exit();
  if (!$contents) error("本文を入力してください");
  $delkey = get_form($_POST['delkey']);
  $expire = time() + 3600 * 24 * 30;
  setcookie("name", $name, $expire);
  setcookie("delkey", $delkey, $expire);
  $tname = $_FILES['image']['tmp_name'];
  if ($tname) {
    if (!is_uploaded_file($tname)) error("不正なアップロード");
    $type = $_FILES['image']['type'];
    if ($type != "image/jpeg" && $type != "image/pjpeg") {
      error("JPEG形式ではありません");
    }
    $rs = pg_query($con, "select last_value from pgbbs3_no_seq");
    $no = pg_fetch_result($rs, 0, 0) + 1;
    $path = "image/$no.jpg";
    move_uploaded_file($tname, $path);
    $path_t = "image/{$no}_t.jpg";
    list($sw, $sh) = getimagesize($path);
    $dw = 128;
    $dh = $dw * $sh / $sw;
    $src = imagecreatefromjpeg($path);
    $dst = imagecreatetruecolor($dw, $dh);
    imagecopyresized($dst, $src, 0, 0, 0, 0, $dw, $dh, $sw, $sh);
    imagejpeg($dst, $path_t);
  }
  pg_query($con, "insert into pgbbs3(name,title,contents,delkey) values('$name','$title','$contents','$delkey')");
} else {
  $name = $_COOKIE['name'];
  $delkey = $_COOKIE['delkey'];
}
if ($_POST['delete']) {
  $no = get_form($_POST['no']);
  $delkey = get_form($_POST['delkey']);
  $rs = pg_query($con, "delete from pgbbs3 where no=$no and delkey='$delkey'");
  if (pg_affected_rows($rs) == 0) error("記事削除に失敗しました");
}

// フォームの文字列を取得する
function get_form($str) {
  $str = pg_escape_string(htmlspecialchars($str));
  $str = ereg_replace("\n|\r|\r\n", "<br>", $str);
  return $str;
}

// エラー表示して終了
function error($msg) {
  print "<p><font color='red'>$msg</font></p>\n";
  exit();
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>画像アップロード掲示板</title>
</head>
<body>
<p>JPEGファイルのみアップロードできます。</p>
<form method="post" action="pgbbs3.php" enctype="multipart/form-data">
お名前:<input type="text" name="name" value="<?php print $name ?>"><br>
題 名:<input type="text" name="title"><br>
<input type="hidden" name="max_file_size" value="30000">
画像:<input type="file" name="image"><br>
削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br>
<textarea name="contents" cols="60" rows="5"></textarea><br>
<input type="submit" name="write" value="送信">
</form>
<hr>
<form method="post" action="pgbbs3.php">
記事番号:<input type="text" name="no">
削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>">
<input type="submit" name="delete" value="記事削除">
</form>

<?php
$rs = pg_query($con, "select * from pgbbs3 order by no desc");
while ($row = pg_fetch_array($rs)) {
  $time = substr($row['time'], 0, 19);
  $no = $row['no'];
  print "<hr>No.{$no} <strong>{$row['title']}</strong>";
  print " 投稿者:{$row['name']} 投稿日時:$time";
  $fn = "image/{$no}.jpg";
  $fn_t = "image/{$no}_t.jpg";
  if (file_exists($fn)) print "<br><br><a href='$fn'><img src='$fn_t' border='0'></a>";
  print "<br><br>{$row['contents']}\n";
}
pg_close($con);
?>

</body>
</html>
入力が終わったら「pgbbs3.php」というファイル名で保存、サーバにアップロードし、実行してみてください。

ソースの解説

$tname = $_FILES['image']['tmp_name'];
$_FILES は $_GET や $_POST と同じく PHP のスーパーグローバル変数で、フォームのファイル名入力フィールド(<input type="file" …>)の内容を受け取ります。二次元配列となっており、['image']の部分がフィールド名です。$_FILES[フィールド名]['tmp_name']はサーバにファイルがアップロードされたときの一時的なファイル名を返します。
if (!is_uploaded_file($tname)) error("不正なアップロード");
is_uploaded_file 関数は、引数のファイル名が POST でアップロードされたファイルの場合のみ、true を返します。
$type = $_FILES['image']['type'];
$_FILES[フィールド名]['type']はアップロードされたファイルのMIMEタイプを返します。JPEGファイルなら image/jpeg または image/pjpeg が返ります。
    if ($type != "image/jpeg" && $type != "image/pjpeg") {
      error("JPEG形式ではありません");
    }
今回はJPEGファイルのみを扱うので、それ以外のMIMEタイプならばエラーで終了します。
    $rs = pg_query($con, "select last_value from pgbbs3_no_seq");
    $no = pg_fetch_result($rs, 0, 0) + 1;
    $path = "image/$no.jpg";
アップロードされたファイルはあくまで一時的なものなので、消える前にコピーする必要があります。今回は image ディレクトリを作成し、その直下に(書き込む記事番号).jpgという名前のファイルにコピーするようにしています。例えば記事番号が 15 ならば image/15.jpg というファイルが作成されるわけです。
move_uploaded_file($tname, $path);
アップロードされた一時的なファイルを image ディレクトリにコピーしています。
$path_t = "image/{$no}_t.jpg";
サムネイル用のファイル名です。
list($sw, $sh) = getimagesize($path);
getimagesize は PHP GD の関数で、画像の幅・高さを配列で返します。幅を $sw、高さを $sh に格納しています。
    $dw = 128;
    $dh = $dw * $sh / $sw;
サムネイルの幅は 128 ピクセル固定、サムネイルの高さは元画像の縦横比と同じにします。
$src = imagecreatefromjpeg($path);
画像を縮小コピーするために、元画像から画像イメージを作成し、イメージIDを取得します。
$dst = imagecreatetruecolor($dw, $dh);
サムネイルの幅と高さで新規画像を作成し、イメージIDを取得します。
imagecopyresized($dst, $src, 0, 0, 0, 0, $dw, $dh, $sw, $sh);
画像を拡大縮小してコピーする関数です。引数は順番に 転送先イメージID・転送元イメージID・転送先の左上X座標・Y座標・転送元の左上X座標・Y座標・転送先の幅・高さ・転送元の幅・高さ となります。
imagejpeg($dst, $path_t);
画像をファイルに出力します。
<form method="post" action="pgbbs3.php" enctype="multipart/form-data">
form タグの enctype 属性は、フォームデータの送信時のエンコード形式を定義します。ファイルをアップロードするときにはこの指定を行わなければなりません。
<input type="hidden" name="max_file_size" value="30000">
アップロードするファイルの最大バイト数をここで指定します。
画像:<input type="file" name="image"><br>
ファイル名入力フィールドです。
  $fn = "image/{$no}.jpg";
  $fn_t = "image/{$no}_t.jpg";
  if (file_exists($fn)) print "<br><br><a href='$fn'><img src='$fn_t' border='0'></a>";
記事番号と同じ名前のファイルが存在すれば(file_exists)、サムネイルを表示し、実際の画像にリンクを張ります。
前ページ PHPとPostgreSQLの連携入門 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:


シャネル サングラス
リーマン・ショックが過ぎ、米国株はどんどんと上昇してしまい、買い時を逃した人も多いはず。
100年に一度と言われたリーマン・ショックですから当然ビビって底値なんかでは買えないわけです。
指をくわえて押し目待ちに押し目なしの状態だった人も多いことでしょう。
しかし、ようやく2016年にチャンスがやって来ました。
2017/07/16 05:31

カルティエ 時計
私の言いたいことは、私がどれほどまでに私はこの腕時計が好きだったことに驚きました。
つまり、はい、それは比較的きれいなダイヤルを好きなことがたくさんありました、そして多くのビンテージの手がかりは、ドームを含む(と)サファイアクリスタルは、過去の高層のアクリル系結晶の感覚を与えます。
しかしそれはクロノグラフ、ですが、私は、率直にその合併症、ユーティリティの多くのために私の人生でありません。
など、デザインは私に似合いませんでした。
ブライトリングのトランスオーシャンクロノグラフが1915年の私のスタンスを再考させるでない間、それは私と一緒に時間を過ごす幸せだったものである。
2017/07/16 03:55


あかさたなは
2017/07/12 18:39


222fffた
2017/07/11 14:49


222あ
2017/07/11 01:56



2017/07/09 13:30

阿部心臓
雷がやばい
2017/07/08 18:18

いいいい
おおおおおおおおおお
2017/07/07 15:07

東洋の魔女
はふはふ
2017/07/07 07:57


日本語が文字化けしてしまいます
2017/07/05 11:49

残りを読む »