

php,mysqlについて初心の者です。  
タイトルにもある通り現在phpとmysqlを使って画像アップロードページを作成しているのですがうまくいきません。  
直接mysqlにバイナリデータを登録するのはよろしくないということだったのでサーバー上にフォルダーを作りそこに画像を保存してそのパスをデータとして格納するということにしました。  
現段階でDBにはパスを登録できている段階なのですがそれを次は写真アルバムみたいに一覧表示したいと考えてプログラムを書いたのですが表示されません。  
ご教授の方よろしくお願いします！

[code]

    <?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');
    }
    
[/code]

[code]

    <?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>
    
[/code]

[code]

    <?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>
    
[/code]


CC BY-SA 3.0
2018-02-07T13:18:46.797
41546
2018-11-29T11:02:05.380
2018-02-08T12:15:19.583
3060
27322
question
php mysql phpmyadmin
phpとmysqlで画像アップロードのサイトを作っているのですが・・・


複数の結果を取り出すなら以下の様なスクリプトになります。(ぐるぐる回さないと)

[code]

    try {
        $pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8','root','root', array(PDO::ATTR_EMULATE_PREPARES => false));
    
        foreach ( $pdo->query ( 'select * from test' ) as $row ) {
            echo $row['imgname'].'<br>';
        }
    //    fetchで回すなら
    //    $stmt = $pdo->query("SELECT * FROM test");
    //    while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
    //        echo $row['imgname'].'<br>';
    //    }
    
    //プリペアドステートメントの例
        $stmt = $pdo->prepare("SELECT * FROM test where test = ?");
        if ($stmt->execute(array('test1'))) {
            while ($row = $stmt->fetch()) {
                echo '<img src="'.$row['img_path'].'" alt="'.$row['title'].'" />';
            }
        }
    
    } catch (PDOException $e) {
        exit('error!'.$e->getMessage());
    }
    
    $pdo = null;// 切断
    
[/code]


CC BY-SA 3.0
2018-02-07T17:54:29.210
41550
2018-02-08T11:16:21.873
2018-02-08T11:16:21.873
22793
22793
41546
answer