1

PDO (php データ オブジェクト) を使用して、次のように .php ファイルでクエリを実行しようとしています。

global $db, $table;
$sth = $db->prepare('INSERT INTO $table(user, timerun, magexp, crimsons, blues, golds, greens) VALUES (:user,:timerun,:magexp,:crimsons,:blues,:golds,:greens) ON DUPLICATE KEY UPDATE timerun=timerun+:timerun, magexp=magexp+:magexp, crimsons=crimsons+:crimsons, blues=blues+:blues, golds=golds+:golds, greens=greens+green');
$sth->execute(array(':user' => $user, ':timerun' => $timerun, ':magexp' => $magexp, ':crimsons' => $cr, ':blues' => $bl, ':golds' => $go, ':greens' => $gr));
echo "success";

ただし、実際にはテーブルを更新しません。エラーなどは出ません。

何か間違っているのでしょうか、それとも PDO はサポートされていませんか? PDO ドキュメントには、「注意: 一部の MySQL テーブル タイプ (ストレージ エンジン) はトランザクションをサポートしていません。トランザクションをサポートしていないテーブル タイプを使用してトランザクション データベース コードを記述する場合、MySQL はトランザクションが正常に開始されたふりをします。さらに、任意の DDL発行されたクエリは、保留中のトランザクションを暗黙的にコミットします。」

通常の「mysql_query」が機能するため、MySQL テーブルがトランザクションをサポートしていることは確かです。

ありがとう。

4

1 に答える 1

1

あなたのコードについてはよくわかりません。一重引用符で囲まれた文字列内に変数がありますが、機能しません。次のように二重引用符を使用する必要があります。

global $db, $table; 

$sth = $db->prepare("INSERT INTO $table(user, timerun, magexp, crimsons, blues, golds,  greens) VALUES (:user,:timerun,:magexp,:crimsons,:blues,:golds,:greens) ON DUPLICATE KEY   UPDATE timerun=timerun+:timerun, magexp=magexp+:magexp, crimsons=crimsons+:crimsons, blues=blues+:blues, golds=golds+:golds, greens=greens+green:"); 

$sth->execute(array(':user' => $user, ':timerun' => $timerun, ':magexp' => $magexp, ':crimsons' => $cr, ':blues' => $bl, ':golds' => $go, ':greens' => $gr)); echo "success";

セキュリティの場合:

まず、プロジェクトのすべての可能なテーブルをキーとして連想配列を作成し、if(isset($validTables[$table])) を使用して変数のテーブルが配列インデックスとして存在するかどうかを確認し、クエリを続行します。例えば

<?php
  $validTables = array('foo' => true, 'bar' => true, 'other' => true);
  if(isset($validTables[$table])) 
  {
    // query logic here
  }
  else throw new Exception(sprintf('Security error %s table not exists', $table));

phpで解析せずに書いたのでこのコードをチェック

于 2012-08-14T17:04:04.597 に答える