3

理由はわかりませんが、この準備されたクエリが機能しません: 次の php コードは正しい (警告や通知はありません) が、対応するデータは更新されません。同様の更新では、データベースは正しく更新されますが、このテーブルでは更新されません。

<?php

  error_reporting(E_ALL);
  ini_set('display_errors', 'On');
  $pdo = new PDO('mysql:dbname=test;host=localhost', 'root', ''); 
  $sql = 'UPDATE `ml_user` SET `username` = :username, `password` = :password, `email` = :email, `active` = :active, `last_login` = :last_login WHERE `id_user` = :id_user';
  $sth = $pdo->prepare($sql);
  var_dump($sth); // object(PDOStatement)#39 (1) { ["queryString"]=> string(165) "UPDATE `ml_user` SET `username` = :username, `password` = :password, `email` = :email, `active` = :active, `last_login` = :last_login WHERE `id_user` = :id_user" }
  $datas = array(
    ':id_user' => 1, ':username' => 'my username',
    ':password' => 'ae25ff724d069dcb1a7fff05616ad6abc1',
    ':email' => 'username@example.com',
    ':active' => 1, ':last_login' => 1382990654,
  );
  $res = $sth->execute($datas);
  var_dump($res); // bool(true) 

SQL テーブル

CREATE TABLE `ml_user` (
 `id_user` int(11) NOT NULL AUTO_INCREMENT,
 `active` tinyint(1) NOT NULL DEFAULT '0',
 `email` varchar(127) NOT NULL,
 `username` varchar(32) NOT NULL DEFAULT '',
 `password` char(50) NOT NULL,
 `logins` int(10) unsigned NOT NULL DEFAULT '0',
 `last_login` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id_user`),
  UNIQUE KEY `uniq_username` (`username`),
  UNIQUE KEY `uniq_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
4

2 に答える 2

3

がtrueexecute()を返した場合、それはステートメントが「成功した」ことを意味しますが、何も変更されたわけではありません。エラーがなかっただけです。

  • WHERE 句の条件により、0 行と一致した可能性があります。それは今でも「成功」と見なされています。同じ WHERE 句を使用してを試しSELECT、結果を取得して、行と一致することを確認できます。

  • 1 つ以上の行が一致した可能性がありますが、設定している値は既にそれらの行の値です。$sth->rowCount()実行後に呼び出して、UPDATEが影響した行数を確認できます (これは、一致した行数よりも少ない場合があります)。

  • このテーブルのコピーが複数ある場合は、読み込んでいるデータベースに変更が加えられていることを再確認する必要があります。時々、アプリケーション構成ファイルを変更するのを忘れてしまい、間違ったデータベースを更新していることに気付かないことがあります。


これが問題であることが判明しました-3番目のポイントのバリエーション:

  • 複数のサーバーで作業している場合は、正しい mysql サーバーで変更をチェックしていることも再確認してください。
于 2013-10-28T23:05:06.040 に答える