0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】UPDATE後にfetchできず爆死&rowCountの正しい理解

0
Last updated at Posted at 2026-03-03

今日は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'] = "修正しました";以下略
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?