PHPのPDOでUPDATE(MySQLのデータを更新)する例

try
{
  $pdo->beginTransaction();
  $stmt = $pdo->prepare( 'UPDATE account SET password=:password WHERE id=:id' );
  $stmt->bindParam( ':id', $id, PDO::PARAM_INT );
  $stmt->bindParam( ':password', $password, PDO::PARAM_STR );
  $stmt->execute();
  $pdo->commit();
}
catch ( Exception $e )
{
  $pdo->rollback();
}

PDOのオブジェクト(上のコードでいう$pdo)はすでにどこかでつくられているとする。以下、上のようなコードの作り方をしめす。

STEP1(try-catch)

PDOを使ってデータを挿入、更新、削除するときはtry-catch構文で囲み、PDOオブジェクトのbeginTransactionとcommitをtryの中で、rollbackをcatchの中で呼ぶ。下のコードはPDOで挿入、更新、削除するときの基本的な構文になる。

try
{
  $pdo->beginTransaction();
  $pdo->commit();
}
catch ( Exception $e )
{
  $pdo->rollback();
}

beginTransactionは「これからデータを書きかえる」という合図をしめす関数で、commitは「実際にデータを書きかえる」関数である。commitすることでPDOは初めてデータを更新する。逆にいえば、commitしないかぎり、プログラムでなにをしようがデータベースはいっさい更新されない。

STEP2(prepareとexecute)

try
{
  $pdo->beginTransaction();
  $stmt = $pdo->prepare( 'UPDATE account SET password=:password WHERE id=:id' );
  $stmt->execute();
  $pdo->commit();
}
catch ( Exception $e )
{
  $pdo->rollback();
}

beginTransactionとcommitの間で、pdoのprepareを使ってstmtというオブジェクトをつくり、さらにexecuteメソッドを呼ぶ。executeはcommitの直前で呼ぶことが多い。

データベースをどのように変更するかは、prepareの中で決める。idが4のパスワードをaaaに変えたいときは

try
{
  $pdo->beginTransaction();
  $stmt = $pdo->prepare( 'UPDATE account SET password="aaa" WHERE id=4' );
  $stmt->execute();
  $pdo->commit();
}
catch ( Exception $e )
{
  $pdo->rollback();
}

とすればいいかもしれないが、PDOではSQL文に値を直接入れることは一般的にしない。値はテーブルのカラム名にコロン(:)を加えた文字列を一時的に代入する。つまりpasswordには:passwordを、idには:idを入れる。

try
{
  $pdo->beginTransaction();
  $stmt = $pdo->prepare( 'UPDATE account SET password=:password WHERE id=:id' );
  $stmt->execute();
  $pdo->commit();
}
catch ( Exception $e )
{
  $pdo->rollback();
}

STEP3(bindParam)

try
{
  $pdo->beginTransaction();
  $stmt = $pdo->prepare( 'UPDATE account SET password=:password WHERE id=:id' );
  $stmt->bindParam( ':id', $id, PDO::PARAM_INT );
  $stmt->bindParam( ':password', $password, PDO::PARAM_STR );
  $stmt->execute();
  $pdo->commit();
}
catch ( Exception $e )
{
  $pdo->rollback();
}

STEP2で一時的に入れたカラムの値を、bindParamで実際に入れたい値に書きかえる。上の例では$idと$passwordにすでに値が入っているとする。

bindParamはPDO::PARAM_INTといった変数の型を指定する。

広告