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表示のにしますよ。