18868
home.phpのタブ１に表示されている画像群から１つクリックし、  
***a.php、***b.phpと進んで行き、最終的に、  
はじめに選択した画像URLにパラメータが付加されたURL（$p_url = "http://*******"）が完成します。

そのURLをデータベースに格納してゆき、home.phpのタブ２に一覧で取得・表示したいのですが、  
phpMyAdminで見ても、レコードが追加されている様子がありません。  
以下のようにして、データを取り出せているとして、どうやって表示すればいいかわかりません......。

データベースを使わず、生成したURLをphp上にストックしていく方法など、無いですよね？  
もしありましたら、そちらでも構いません。  
foreachで、生成したURLが存在するだけ 繰り返し吐き出したいのですが。。

よろしくお願い致します。

[PHPとMySQLを使って、初めてのDB接続](http://liginc.co.jp/designer/archives/119)
こちらを参考にしました。

＜***b.php＞

```

    //DBへ接続
    $db = mysql_connect("mysql999.db.sakura.ne.jp","ID","password");
    if(!$db){
        die("DBに接続できませんでした");
    }
    //DBの選択
    $conn = mysql_select_db("db_name",$db);
    if(!$conn){
        die("DBに接続できませんでした");
    }
    //SQL文を変数に格納
    $sql = "INSERT INTO 'db_name'.'p***URLs'('url') VALUES({$p_url});";
    //SQL文の実行
    mysql_query($sql);
    
```

＜home.php タブ２＞

```

    //DBからデータを取得して格納
    $get_sql = "SELECT * FROM 'p***URLs' WHERE 'url' = $get_id";
    $res = mysql_query($get_sql);
    $row = mysql_fetch_array($res,MYSQL_ASSOC);
    
```

※p***URLsはテーブル名、urlはフィールド名。  
※データベースはさくらインターネットのものを使用しています。  
※home.phpのタブはjavascriptで作成しています。
CC BY-SA 3.0
2015-11-15T14:42:20.493
18852
2015-11-16T03:41:28.293
2015-11-15T14:50:14.693
12973
12973
question
php html mysql database
生成したURLをデータベースに格納したい。
参考にしているサイトが古いのと誤解を招く書き方をしてるので、いろいろまずいコードになってます。

PHP+MySQLの解説をしてるサイトのほとんどは古いか間違っているかその両方なので、なかなかここを参考にしたら間違いが無い、というのを知りません。

とりあえずサンプルを書いてみました。(SQLに突っ込むパラメータがどういう由来かわからないので唐突に登場させていますので、このままでは動きません)

```

    <?php
    try{
        $hostname = 'hostname';
        $dbname   = 'dbname';
        $username = 'username';
        $password = 'password';
    
        //DBへの接続 文字コードの指定を必ずする
        $dbh = new PDO("mysql:host=$hostname;dbname=$dbname;charset=utf8", $username, $password);
    
        //お約束
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
        //INSERTを準備して･･･
        $stmt = $dbh->prepare("INSERT INTO p***URLs (url) values (:url)");
        if(!$stmt)
        {
            $error_info = $dbh->errorInfo();
            die($error_info[2]);
        }
    
        //値を割り当てて･･･
        $stmt->bindValue(":url", $p_url, PDO::PARAM_STR);
    
        //実行
        $stmt->execute();
    
        //SELECT
        $stmt = $dbh->prepare("SELECT * FROM p***URLs WHERE url = :url");
        if(!$stmt)
        {
            $error_info = $dbh->errorInfo();
            die($error_info[2]);
        }
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
    
        $stmt->bindValue(":url", $get_id, PDO::PARAM_STR);
        $stmt->execute();
    
        while ($row = $stmt->fetch()) {
            echo $row["url"];
        }
    } catch(PDOException $e){
        echo $e->getMessage();
    }
    ?>
    
```

参考にしてはいけないサイトを見分けるポイントを載せておきます。

  * mysql_connectなどmysql_*系の関数は古いものなので使ってはいけません。これが載っていると言うことは情報が古いので参考になりません。mysqli_*か上記のPDOならよいです。
  * 文字コードを指定している部分(上記のサンプルであれば、`new PDO`のパラメータで指定しています)があるかどうか。無ければダメです。
  * PDOの場合、`setAttribute(PDO::ATTR_EMULATE_PREPARES, false)`が無い
  * SQLを組み立てるのに、`"SELECT * FROM test WHERE name = '" . $var . "'"` `"SELECT * FROM name = ${var}"`などのように変数を連結している。
  * バインド機構について説明がない

バインド機構というのは、

```

    $stmt = $dbh->prepare("SELECT * FROM p***URLs WHERE url = :url");
    $stmt->bindValue(":url", $get_id, PDO::PARAM_STR);
    
```

こんな風に、SQL中には「プレースホルダ」という目印を置いて、後でそれに値を割り当てる(bindする)方法のことです。プレースホルダは`:url`のような名前の場合と`?`記号を使うときがあります。

なぜこういう注意が必要かについては、IPAが公開している[「安全なウェブサイトの作り方」と「安全なSQLの呼び出し方」](https://www.ipa.go.jp/security/vuln/websecurity.html)、書籍ですが「体系的に学ぶ
安全なWebアプリケーションの作り方」(ISBN: 978-4-7973-6119-3)を読んでみてください。
CC BY-SA 3.0
2015-11-16T02:49:31.537
18868
2015-11-16T03:41:28.293
2015-11-16T03:41:28.293
5793
5793
18852
answer