phpにおけるSQLでのデータの受け渡し

phpで学んだことを自分なりにまとめてみました。忘備録です。間違ってたらごめんなさい。その際は教えてください

# パターン１すべてのデータの取得

手始めにすべてのデータを取得してみましょう。
まず初めにSQLとの接続です。NEW POD～で接続を行ってます。

形から察しがつきそうですが、この際、インスタンスを生成してます。

    $pdo = new PDO('mysql:host=localhost; dbname=mydb; charset=utf8','root','');

そしてほしいテーブルを記述して(中身はid, name, score ..とする)

    $sql = 'SELECT  * FROM players ;

プリペアドステートメントを使用してSQL文を取得します。プリペアドステートメントは

    $statement = $pdo->prepare('sql文');

で取得できます。なので、上記でSQL文を 　$sql　で示したので

    $statement = $pdo->prepare($sql);
これでいいですね。

後は' $statement->execute()'で、実行するだけです。これはお決まりです。
    
    $statement->execute();
    


さて実行したので　$statement　にデータが格納されてます。こ奴を取り出します。
都合上リストに格納した方ら予後が良いので一旦リストを作ります

    $results = []

そしてこうします。

    while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
            $results[] = $row;
        }

はい。（わから）ないです。ね。説明します。
まず。PDOStatement::fetch...より、データベースから 1行ずつ (＄statement)を連想配列として$rowに格納します。 これだけだと、１行だけしか取得できず、悲しいのでwhile を使用してすべて取得を行います。そして取得した奴を先ほど作製したlistに格納します。

最後に
データベースの結果セットを 明示的に解放し、

        $statement = null;

接続したSQLを閉じます。開けたら閉めるのは世の常識ですね。

        $pdo = null;



さて、ここで書いたのを  require_once で別ファイルに接続しましょう。 

    require_once 'views/all_data.php';

ここからは --------------------views/all_data.php--------------------

データを格納した＄resultsからどうやってのとお思いでしょうが、
$resultsは

        $results = [
        ["id" => 1, "name" => "鈴木", "score" => 114],
        ["id" => 2, "name" => "田所", "score" => 530],
        ["id" => 3, "name" => "三浦", "score" => 567]
    ];

といったデータの構造をしています。なのでfor文で取り出します。


    <table>
        <?php foreach ($results as $jobs) { ?>
            <tr>
                <td><?= $jobs['id'] ?></td>
                <td><?= $jobs['name'] ?></td>
                <td><?= $jobs['score'] ?></td>
            </tr>
        <?php 
        } ?>
    </table> -->

はい簡単ですね。これで取りだせます。


以下にこれまでのコードを記述します。

----------------------------------------------------------------------------------------
    <?php
        $pdo = new PDO('mysql:host=localhost; dbname=mydb; charset=utf8','root','');
        
        $sql = 'SELECT * FROM players;
        
        $statement = $pdo->prepare($sql);
        
        $statement->execute();
        
        $results = [];
        
        while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
            $results[] = $row;
        }
    
        $statement = null;
        $pdo = null;
    
           require_once 'views/all_data.php';

--------------------以下'views/all_data.php'----------------------------------------

    <table>
        <?php foreach ($results as $jobs) { ?>
            <tr>
                <td><?= $jobs['id'] ?></td>
                <td><?= $jobs['name'] ?></td>
                <td><?= $jobs['score'] ?></td>
            </tr>
        <?php 
        } ?>
    </table> 


# パターン２特定のデータを取得

次に特定のデータを取得する方法を確認します。
はい。先ほどと同様にpodを用いてmySQLとの接続を行います。

    $pdo = new PDO('mysql:host=localhost; dbname=mydb; charset=utf8','root','');

特定のデータを取得する為に変数を指定します。
考えとしte,
メソッドで受けとり、それを反映させたいので,$idに代入させます。
    
    if (isset($_GET["id"])){
            $id = $_GET["id"];
    }

ちなみに送信元は

    <form actiuon='送信先のタグこの場合、上記の受取先'  method="GET">
        <input type="text" name="id">
        <input type="submit" value="送信">
    </form>

もしくはGETメソッドはURLに反映されるため、URL欄に?id =XXX(任意の数字)とします。それで反映されます。

さて、id を決める事が出来ましたので、SQLからデータを取り出すときにそのIDを使用すればいいでね。
sql文でデータを取り出すには以下の通りでしたね

    SELECT * FROM テーブル名　WHERE　（条件） ;
つまり、例えばplayers という名のテーブルから、ID が１に該当するものを取り出したいとき、

    SELECT * FROM players WHERE = 1;
    
となるわけですね。

このsql文をPHP文に格納します。文は

    $sql = ` sql　`　

でしたね。

注意してもらいたいのはSQL文を囲うのは 
{            '      }アポストロフィーではなく
{            `      }クレイブアクセントです。お間違え泣く。

さて、クレイブアクセントで囲う事を知ったうえで＄ID と　 WHERE 　を紐づけましょう。文は以下の通りです

    $sql = 'SELECT　* FROM players WHERE id  = :id ';

なるほど、＄ID は　:id'　と書くのかと...実は違って、プレースホルダー（パラメータ）と呼ばれる概念です。プレースホルダというのは、SQL文の中で動的に変わる値の位置を示すマーカーを指し示すもので、取り出したい値（id）は動的に変化しましから「:id」と指定したわけですね。
なので、現段階では直接 $id を指しているわけではありません。あとで指定しますので一旦、SQL文を取得します。

        $statement = $pdo->prepare($sql);

さて、上記の動的に変化する部分を　$id　と紐づけましょう。紐づけるには、bindValueを使用します。　構文は以下の通りです。

    $statement->bindValue(':id', $id,　PDO::PARAM_INT);

おっと、未知事象が出てきました。「　PDO::PARAM_INT　」　は　:id', ＄id,　の両者はINT型である事を型付けるものです。この一文で:id'　は　$id,であり、かつ整数型である事が明示されましたね。
ここで実行してみましょう。

    $statement->execute();

id でデータを取得したのでwhileでぶん回す必要もないです。なので直接配列でデータを返したいので、

    $player = $statement->fetch(PDO::FETCH_ASSOC);
    
とします。さて、開けたら？？？そう。閉めるッッ。なので
    
    $statement = null;
    $pdo = null;
    
とし、これらを反映させたいので

    require_once 'views/index.part.php';

と加えましょう

--------------------以下'views/index.part.php'----------------------------------------

    
    <ul>
        <li>-<?= $player['id']?></li>
        <li>-<?= $player['name']?></li>
        <li>-<?= $player['score']?></li>
    </ul>
    
以上のコードから、

    <偏移元のURL>?= 1

にアクセスすると $player の一つ目のリストにアクセスできるはずです。 

以下にこれまでのコードを記述します。

    <?php
        $pdo = new PDO('mysql:host=localhost; dbname=mydb; charset=utf8','root','');
        
        if (isset($_REQUEST["id"])){
                $id = $_REQUEST["id"];
        }
    
        $sql = 'SELECT players.id, name, level, job_name 
                FROM players LEFT JOIN jobs ON jobs.id = players.job_id
                        WHERE players.id  = :id ';
    
        $statement = $pdo->prepare($sql);
        $statement->bindValue(':id', $id,  PDO::PARAM_INT);
    
        $statement->execute();
    
        $player = $statement->fetch(PDO::FETCH_ASSOC);
    
        $statement = null;
        $pdo = null;
        $message = 'hello world';
            require_once 'views/index.part.php';
        ?>

--------------------以下'views/index.part.php'----------------------------------------
views/index.part.php?='欲しいID';

    <ul>
        <li>-<?= $player['id']?></li>
        <li>-<?= $player['job_name']?></li>
        <li>-<?= $player['vitality']?></li>
        <li>-<?= $player['strength']?></li>
    </ul>


以上です