【php基礎】DBの操作!データベースの値を取得して表示する方法

phpでDBを操作出来たら、やれる事が大幅に広がります。

phpでDB操作する基本をここで押さえておきます。

現在は下記の状態になっているものとします。

  1. DBやテーブルやカラムを作成している
  2. PDOにてDBに接続出来ている
  3. PDOのインスタンスを$dbという変数に格納しているものとする

自分のパソコンをDBにしています。上記3つのコードは下記になります。

<?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION;
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD,
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功';
 } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>

まだDBに接続していない方、DBに接続する方法がわからない方は、下記の「DBにアクセスする時の構文を理解する」を参考にしてください。

目次

phpでDBの操作するには

script

まずはSQLの構文を変数に格納します。構文は下記です。

$変数 = $PDOインスタンスを格納した変数->メソッド("SQL文");

格納する変数を決めます。よく「$stmt」とします。今回もstmt(ステートメント)にします。

「$PDOインスタンスを格納した変数」は$dbとしています。

メソッドは2種類あります。

  1. prepare
  2. query

①prepareは条件とする値が変動する場合に使用します。

prepareメソッドを使用する場合の、流れは下記です。

  1. SQLの構文を変数に格納する
  2. 値をバインドする
  3. 実行する
  4. 取り出し方を決めて取り出し、配列に格納する
  5. 配列から取り出し、表示する

query は条件とする値が変動しない場合に使用します。

queryメソッドを使用する場合の、流れは下記です。

  1. SQLの構文を変数に格納する
  2. 値をバインドする
  3. 実行する
  4. 取り出し方を決めて取り出し、配列に格納する
  5. 配列から取り出し、表示する

②と③の工程はなくなります。queryは値が変更しない場合なので②の値をバインドする必要がありません。

更に「query」メソッドだけで実行もしてくれる為、③の工程もありません。

①prepareで条件が変動する構文で、DBから値抽出

スクリプト

今回はSQLインジェクションのセキュリティ対策にもなりますので、「prepare」を使用します。

$stmt = $db->prepare("SQL文");

あとはSQL文だけです。SQLのメソッドは複数ありますが、よく使用されるメソッドは下記の4つです。

  • DBの値を取得するselect
  • DBの値を変更するupdate
  • DBの値を追記するinsert
  • DBの値を消すdelete

このSQLの文によってDBから値を取得したり、DBを変更したりできます。

DBの値を変更するupdate

DBの値を追記するinsert

DBの値を消すdelete

DBから値を抽出するselect

ここでは値を取得する「select」を使用します。

SQLのselect構文の詳しい記事は、select文でDBの値を取得する!の記事を参照してください。

mydatabaseに接続しています。そのDBの中に「users」テーブルを作成しています。詳細は下記です。

id name score
1user_147
2user_224
mydatabaseのusersテーブル

nameの値が変数で、scoreの値を取得するとします。するとSQL文は下記になります。

select score from users where name=?;

条件が変更する箇所を「?」としています。「?」ではなく好きな名前を使用する事も可能です。

詳しくは下記の「PDOのprepareとqueryでSQL文を変数に格納する」の記事を参考にしてください。

SQL文も完成しましたので、先程のphpと合わせます。最終的にコードは下記になります。

$stmt = $db->prepare("select score from users where name=?");

これでSQLの構文を変数に格納できました。

値をバインドする

  1. SQLの構文を変数に格納する
  2. 値をバインドする次はこの工程
  3. 実行する
  4. 取り出し方を決めて取り出し、配列に格納する
  5. 配列から取り出し、表示する

先程のSQLの「?」の部分の値を決めます。構文は下記です。

$stmt->bindValue(id,'値',定数);

再程の変数$stmtから->bindValueメソッドを呼び出しています。()の中身は下記です。

  • id:パラメータIDを指定します・・・「?」が複数ある場合の番号、1つしかなければ1確定
  • 値:実際に入る値を指定します・・・「?」に入る値
  • オプション:データの型を指定可能です・・・下記

定数はデータ型を指定できます。種類は下記です。

  • PDO::PARAM_STR ・・・デフォルトで文字列型
  • PDO::PARAM_INT ・・・数値型
  • PDO::PARAM_BOOL ・・・BOOLERN型
  • PDO::PARAM_NULL ・・・NULL型
  • ・・・・などなど

文字列型と数値型が、ほとんどだと思います。

prepareやbindに関して、もっと詳しく知りたい方は、「PDOのprepareとqueryでSQL文を変数に格納する」の記事を参照してください。

以上を踏まえて、今回のコードは下記になりました。

$stmt->bindValue(1,'user_1',PDO::PARAM_STR);

「?」が一つしかないので、idは1

今回はカラム「name」が「user_1」の値の取得

「user_1」なので文字列型を指定して、バインドしようと思います。つまりPDO::PARAM_STRを指定します。

実行します

  1. SQLの構文を変数に格納する
  2. 値をバインドする
  3. 実行する次はこの工程
  4. 取り出し方を決めて取り出し、配列に格納する
  5. 配列から取り出し、表示する

実行する為の、基礎構文は下記です。

$stmt->execute();

これで実行できました。

取り出し方を決めて取り出し、配列に格納する

  1. SQLの構文を変数に格納する
  2. 値をバインドする
  3. 実行する
  4. 取り出し方を決めて取り出し、配列に格納する次はこの工程
  5. 配列から取り出し、表示する

実行したものから、値を取得しましょう。

構文は下記です。

$配列 = $変数->メソッド(オプション);
  • $配列:抽出した値は配列に入ります。
  • $変数:先程の変数
  • メソッド:(fetch | fetchAll)
  • オプション:下記に示す

オプションは下記があります。

  • PDO::FETCH_BOTH ・・・デフォルト
  • PDO::FETCH_ASSOC
  • PDO::FETCH_NUM
  • PDO::FETCH_KEY_PAIR
  • PDO::FETCH_COLUMN

取り出し方を決めて取り出し、配列に格納するについて詳しく知りたい方は「PDOのfetchやfetchAllで値を抽出する」の記事を参照してください。

今回は下記コードにします。

$username = $stmt->fetch(PDO::FETCH_BOTH);
  • usernameという配列に格納します。
  • fetchで適応する最初の1つを取り出します
  • 定数でPDO::FETCH_BOTHを指定します。 

SQLでDBの値を表示する。

PC

最後の工程です。

  1. SQLの構文を変数に格納する
  2. 値をバインドする
  3. 実行する
  4. 取り出し方を決めて取り出し、配列に格納する
  5. 配列から取り出し、表示する次はこの工程

④で配列に格納した値を見てみます。

print_r($username);を追記して、ページにアクセスしてみます。

<?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功</br>';
 $stmt = $db->prepare("select name from users where score=?");
 $stmt->bindValue(1,44,PDO::PARAM_INT);
 $stmt->execute();
 $username = $stmt->fetch(PDO::FETCH_BOTH);
print_r($username);
  } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>
DB接続成功
Array ( [name] => user_3 [0] => user_3 )
  • 配列にKeyがname、値がuser_3が入っています
  • 配列の0番目にuser_3の値が入っています

fetch(PDO::FETCH_BOTH)だとこのような配列を取得するのでした。

では配列から値を表示してみます。下記を追記して、ページにアクセスします。

echo $username["name"] ."と" . $username[0];
  1. 変数からKeyがnameの値を取り出しています
  2. 間に「と」をくっつける為に「.”と”.」を入力しています
  3. 変数から0番目の値を取り出しています
<?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功</br>';
 $stmt = $db->prepare("select name from users where score=?");
 $stmt->bindValue(1,44,PDO::PARAM_INT);
 $stmt->execute();
 $username = $stmt->fetch(PDO::FETCH_BOTH);
echo $username["name"] ."と" . $username[0];
  } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>

結果は下記になりました。

DB接続成功
user_3とuser_3

②queryで条件が固定の構文で、DBから値抽出

PC

queryの工程は下記でした。

  1. SQLの構文を変数に格納する
  2. 値をバインドする
  3. 実行する
  4. 取り出し方を決めて取り出し、配列に格納する
  5. 配列から取り出し、表示する

②queryは条件の値が同じ場合に使用します。値が変動しないので②値をバインドする必要がありません

③query自体実行してくれますので実行をする必要がありません。

SQL文はそのままSQL文を文字列で記入します。

コードは下記になります。

<?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功</br>';
 $stmt = $db->query("select name from users where score=44");
 $username = $stmt->fetch(PDO::FETCH_BOTH);
echo $username["name"] ."と" . $username[0];
  } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>
  • prepareをqueryに変更しています
  • ②③の工程がないので、bindとexecuteの行が無くなっています

これでページにアクセスしてみます。

DB接続成功
user_3とuser_3

先程と同じ結果になりました。

DBの操作!データベースの値を取得して表示する方法のまとめ

PC

DBの値を取得するにはprepareとqueryを使用する。

prepareの特徴
  • 条件が変動するので、使いまわし可能
  • SQLと変動する値が別々の構文なので、SQLインジェクション対策になる
  • 値のbindと実行が必要で手間がかかる
query の特徴
  • 条件が変動しないので、使いまわしできない
  • 1文で実行まで行うので、手間がかからない
  • 1文のSQLなので、SQLインジェクションに注意が必要

fetchでDBの取得した値を配列に入れる。

配列から値を表示して完了。

難しいですが、頑張って学習していきましょう。

スキルアップするにはプログラミングスクールもオススメです。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
目次
閉じる