今日はCRUDの「U(Update)」でハマったのでまとめる。
文末にいつものやつらをまとめる。
やりたかったこと
- 会員情報をアップデートする
- 更新成功したらその会員の情報を画面に表示したい
→SELECTはデータを返すが、UPDATE,INSERT,DELETEは当然返さない。
→それをうっかり。$stmt->fetch()してしまった。反省。
正しいやり方
$stmt = $dbh->prepare('UPDATE members SET name=? WHERE email=?');
$stmt->execute([$name, $email]);
if ($stmt->rowCount() > 0) {
$stmt2 = $dbh->prepare('SELECT name,email FROM members WHERE email=?');
$stmt2->execute([$email]);
$row = $stmt2->fetch(PDO::FETCH_ASSOC);
}
$row = $stmt2->fetch(PDO::FETCH_ASSOC);
- SELECT結果から1行取り出し
- カラム名をキーにした配列で受け取る
という意味。
$row = [
'name' => '山田',
'email' => 'aaa@example.com'
];
$row = [
'name' => '山田',
'email' => 'aaa@example.com'
];
つっこみどころ
よく見ていただくとばれるが、私はメールアドレスで抽出している。固有のIDを設けているが、使い方が思いつかなかったのである。
で、よく考えたのだが、セッションに持たせておくのがよいのでは!?と。AIさんに聞いたら、さも当たり前何をいまさらというような感じであった。
イメージ
①ログイン時にIDを取得する
$sql = 'SELECT id, name, password FROM members WHERE email = ?';
$stmt = $dbh->prepare($sql);
$stmt->execute([$email]);
$member = $stmt->fetch(PDO::FETCH_ASSOC);
②パスワード確認後にセッションへ保存
if ($member && password_verify($pass, $member['password'])) {
$_SESSION['member_id'] = $member['id'];
$_SESSION['member_name'] = $member['name'];
header('Location: mypage.php');
exit;
}
これでログイン中はずっと使える!!
ページごとに唸りながらコーディングをしていたので、
ページ遷移のことなんかすっかり忘れていたのである。
session_start();
if (!isset($_SESSION['member_id'])) {
header('Location: login.php');
exit;
}
$member_id = $_SESSION['member_id'];
IDがなければ、ログインページへ行くこともできる。
いけないこと
- hiddenで持ち回り→改ざんされる
- cokkieだけで管理→セキュリティ
大事な仲間たち
DB接続
$dsn = "mysql:ほにゃらら";
$user = "ほにゃらら";
$password = "ほにゃらら";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
POST受け取り
受け取ったデータを変数へ→パスワード暗号化
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$pass = $_POST['pass'] ?? '';
$email = $_POST['email'] ?? '';
if ($pass != '') {
$pass = password_hash($pass, PASSWORD_DEFAULT); 以下略
実行するやつ
$sql = 'SQLなんちゃら';
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
rowCount()で受け取り確認するやつ。変更行数
$count = $stmt->rowCount();
if ($count > 0) {
$_SESSION['flash'] = "修正しました";以下略