phpとmysqlで画像アップロードのサイトを作っているのですが・・・
php,mysqlについて初心の者です。
タイトルにもある通り現在phpとmysqlを使って画像アップロードページを作成しているのですがうまくいきません。
直接mysqlにバイナリデータを登録するのはよろしくないということだったのでサーバー上にフォルダーを作りそこに画像を保存してそのパスをデータとして格納するということにしました。
現段階でDBにはパスを登録できている段階なのですがそれを次は写真アルバムみたいに一覧表示したいと考えてプログラムを書いたのですが表示されません。
ご教授の方よろしくお願いします!
<?php
function connect_db()
{
$dsn = 'mysql:localhost=xxxx;dbname=xxxx;charset=utf8';
$username = 'xxxx';
$password = 'xxxx';
$options =
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
];
return new PDO($dsn, $username, $password, $options);
}
function insert($sql, $arr = [])
{
$pdo = connect_db();
$stmt = $pdo->prepare($sql);
$stmt->execute($arr);
return $pdo->lastInsertId();
}
function select($sql, $arr = [])
{
$pdo = connect_db();
$stmt = $pdo->prepare($sql);
$stmt->execute($arr);
return $stmt->fetchAll();
}
function h($string)
{
return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}
<?php
require 'common.php';
try
{
$id = filter_input(INPUT_GET, 'id');
echo $id;
// データベースからレコードを取得
$sql = "SELECT id, title, img_path FROM images WHERE id = :id";
$arr = [];
$arr[':id'] = $id;
$rows = select($sql, $arr);
$row = reset($rows);
} catch (Exception $e)
{
$error = $e->getMessage();
}
?>
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.error {
color: red;
}
</style>
</head>
<body>
<div id="wrap">
<?php if (isset($error)) : ?>
<p class="error"><?= h($error); ?></p>
<?php endif; ?>
<p><?= h($row['title']); ?></p>
<p>
<img src="<?= h($row['img_path']); ?>" alt="<?= h($row['title']); ?>" />
</p>
</div>
</body>
</html>
<?php
require 'common.php';
function file_upload()
{
// POSTではないとき何もしない
if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST')
{
return;
}
// タイトル
$title = filter_input(INPUT_POST, 'title');
if ('' === $title) {
throw new Exception('タイトルは入力必須です。');
}
// アップロードファイル
$upfile = $_FILES['upfile'];
if ($upfile['error'] > 0) {
throw new Exception('ファイルアップロードに失敗しました。');
}
$tmp_name = $upfile['tmp_name'];
// ファイルタイプチェック
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $tmp_name);
// 許可するMIMETYPE
$allowed_types = [
'jpg' => 'image/jpeg'
, 'png' => 'image/png'
, 'gif' => 'image/gif'
];
if (!in_array($mimetype, $allowed_types)) {
throw new Exception('許可されていないファイルタイプです。');
}
// ファイル名(ハッシュ値でファイル名を決定するため、同一ファイルは同盟で上書きされる)
$filename = sha1_file($tmp_name);
// 拡張子
$ext = array_search($mimetype, $allowed_types);
// 保存作ファイルパス
$destination = sprintf('%s/%s.%s'
, 'upfiles'
, $filename
, $ext
);
echo $destination;
// アップロードディレクトリに移動
if (!move_uploaded_file($tmp_name, $destination))
{
throw new Exception('ファイルの保存に失敗しました。');
}
// データベースに登録
$sql = 'INSERT INTO `images` (`id`, `title`, `img_path`) VALUES (NULL, :title, :img_path) ';
$arr = [];
$arr[':title'] = $title;
$arr[':img_path'] = $destination;
echo $title ;
$lastInsertId = insert($sql, $arr);
// 成功時にページを移動する
header(sprintf('Location: image.php?id=%d', $lastInsertId));
}
try {
// ファイルアップロード
file_upload();
} catch (Exception $e) {
$error = $e->getMessage();
}
?>
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.error {
color: red;
}
</style>
</head>
<body>
<div id="wrap">
<?php if (isset($error)) : ?>
<p class="error"><?= h($error); ?></p>
<?php endif; ?>
<form action="" method="post" enctype="multipart/form-data">
<p>
<label for="title">タイトル</label>
<input type="text" name="title" id="title" />
</p>
<p>
<label for="upfile">画像ファイル</label>
<input type="file" name="upfile" id="upfile" />
</p>
<p>
<button type="submit">送信</button>
</p>
</form>
</div>
</body>
</html>