忍者ブログ

からすまる日誌 mySQL

授業ノートのまとめ

基本(4) fetch

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

基本(4) fetch

fetchします
 
fetchすると配列化してくれる。
 
・インデックスとしての配列か
・連想配列としての配列か
設定しないと二重にデータをとってくるという性質がある
 
カラム名をキーにみたてた分と
列番号をキーとみたてた分
 
   <?php
   $row = $rs->fetch();
   var_dump($row);
   ?>

 
赤いのと青いので二重に出力された
 
array(4) { ["s_id"]=> string(1) "1" [0]=> string(1) "1" ["s_name"]=> string(4) "hoge" [1]=> string(4) "hoge" }
 

エラーが出たので横道にちょっとそれます
 
中かっこ{}の意味:
オブジェクトの定義と
グループ化
この2つきり
 
グループ化をするときは{}という範囲を使う
if文のも大きく言えばこの仲間
 
 $dsn ="mysql:host={$host};dbname={$dbname};charset=utf8";
 
↑これをミススペルして{}を()にしていた。
するとエラーが出た。
 
関数とメソッドのときだけ()を使う。
 

$pdo = new PDO($dsn,$user,$pass);
 
これも、最初のは変数なんで$hogeでもいい。newのあとは「クラス名」
 
$hoge = new PDO($dsn,$user,$pass); 
でもいい。つまり、
最初のpdoは小文字、クラス名は大文字で書く必要がある
 

閑話休題、
二重をやめるにはこう記述する
 
   $row = $rs->fetch(PDO::FETCH_ASSOC);
 
array(2) { ["s_id"]=> string(1) "1" ["s_name"]=> string(4) "hoge" }
 

さらに修正して
 <?php
   $row = $rs->fetch(PDO::FETCH_ASSOC);
   //var_dump($row);
   echo "<tr><td>{$row["s_id"]}</td>
    <td>{$row["s_name"]}</td></tr>";
   ?>
 

 
 
出力はされたがいったい何のことだろう。
ここまで
 
--->students_list.php
 
<?php
 //---------------------
 //接続設定
 //---------------------
 $user="root";//だれ(開発環境では常にroot/本番は別の名前)
 $pass="";//パスワードは(開発環境ではから/本番は必ず決める)
 $host="localhost";//本番でも7割はlocalhostになるらしい(webサーバとローカルサーバが同じマシンならそうなる/違えばIPアドレスとかhost名)
 $dbname ="school";
 //---------------------
 //---------------------
 //データベース設定
 //---------------------
 $dsn ="mysql:host={$host};dbname={$dbname};charset=utf8";
 
 //---------------------
 //PDO設定
 //---------------------
 $pdo = new PDO($dsn,$user,$pass);
 $sql = "SELECT * FROM students";//外から受け取った値を操作はしないのでどくはまざりっこなし
 /*
 //事前コンパイル
 $stmt = $pdo->prepare($sql);
 $stmt->execute();
 */
 $rs = $pdo->query($sql);//たちどころに実行される
?>
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="utf-8">
 <title>生徒一覧</title>
 <link rel="stylesheet" href="css/style.css">
 <script src="../jquery-3.4.1.min.js"></script>
</head>
<body>
 <h1>登録済み生徒一覧</h1>
 <div id="container">
  <table>
   <tr>
    <th>ID</th><th>生徒氏名</th>
   </tr>
   <?php
   $row = $rs->fetch(PDO::FETCH_ASSOC);
   //var_dump($row);
   echo "<tr><td>{$row["s_id"]}</td>
    <td>{$row["s_name"]}</td></tr>";
   ?>
  </table>
 </div>
 
 <script src="js/list.js"></script>
</body>
</html>
 

$row = $rs->fetch(PDO::FETCH_ASSOC);
>PDO::FETCH_ASSOC: は、結果セットに 返された際の
カラム名で添字を付けた配列を返します。
 
 
らしい。
これをつけたので
1 hoge
をとってきた。
 

fetch:
>[1] データを取得するためのSQL文作成する。
$sql = "select * from user where user_email = :user_email limit 1";
[2] 1で作成したSQLを実行オブジェクトにセットする。
$stmt = $pdo->prepare($sql);
[3] SQLを実行する(SQL文中で「:」で始まる代替文字列を使用した場合は実際の値も渡す)
$stmt->execute(array(":user_email" => $user_email));
[4] 実行結果のデータを取り出す。
$user = $stmt->fetch();
つまり、「$user = $stmt->fetch();」という文は、
SQLを実行した「結果データ」を取得する処理となります。
この例では、取得した結果データは$userという変数に入ります。
そのため、$user['カラム名']という指定で、
データベースから取得した実際のデータが取り出せるわけです。
例:$user['id']など
なお、「$stmt->fetch();」というのは、SQLの実行結果が「1件」の場合の取り出し方です。
上記のSQLでは、末尾に「limit 1」を指定して、結果データを1件のみ取得しているため
fetch()で取り出しています。
1件ではなく、結果データが複数件ある場合にはfetch()の代わりに
fetchAll()を使います。
 
 
 

1件じゃなくて全部ほしいときは?
 
<?php
   while($row = $rs->fetch(PDO::FETCH_ASSOC)){//存在するかしないかの判定。$rowの中身がなにかしらあればtrue,なにもなければfalse。falseが返った瞬間にwhileが終わる。つまりデータの最終行がおわれば。
   //var_dump($row);
   echo "<tr><td>{$row["s_id"]}</td>
    <td>{$row["s_name"]}</td></tr>";
   }
   ?>
 
フェッチというのはデータを一行もってくるみたいな操作。
実はデータベースにはカーソルというかポインタというか、
作業位置を持っているく目印があるらしい。

フェッチをするとそのポインタが一行ずつ下にいくらしい。
最後までカーソルがいくとそれ以上フェッチできないのでおわる。
次に新しいクエリメソッドがおこなわれると、ポインタは初期化する
 

 
 
出てはきたけど全然わからないし意味がわからないな。
 
なおこのポインタは、ページが遷移するか別の処理になるか
別の変数でうんぬんするかするまでは保持されるらしいので、
同じページ、おなじ変数で同じフェッチをおこなって、
3件目までやっていたら、
次に行うと4件目をとってくる
 

ちなみにfetchAllというのもあります
全部多次元でもってきます
不用意に使うとサーバがビジーになるらしい。
おすすめじゃないらしい
 

プリペアードステートメントと
while文による書き出し。
この2つがPHPのデータ操作の根幹らしい
この2つができるようにしましょう
 

自分で練習フォルダをきって自分でやってみてください
重要なのはSQL文らしい。
これを変えるだけで複雑化するらしい。
 
リクエストを出して条件を絞り込むとか。

じゃ、insert_s.phpのリダイレクト先をこのlist表示のにしますよ。
 
PR

コメント

ただいまコメントを受けつけておりません。

プロフィール

HN:
karasumaru
性別:
非公開

P R