1

これを使用して、データベースに何かを追加または更新しました。

$update = mysql_query
("
    INSERT INTO details (id, name, team, cost) 
    VALUES ('$id', '$name', '$team', '$cost') 
    ON DUPLICATE KEY UPDATE cost = '$cost' 
") 
or die (mysql_error());

基本的にやりたい…。

変更された場合$costは、古い値と新しい値を画面にエコーします。それ以外の場合は何もしません。

どうすればそのようなことをすることができますか?

4

4 に答える 4

2

まず、IDに対応するコストを一時変数に保持する必要があります

$query        = "SELECT cost FROM details WHERE id = $id";
$resource     = mysql_query($query);
$temp_array   = mysql_fetch_assoc($resource);
$old_cost     = $temp_array['cost'];

今すぐ操作を実行します

mysql_affected_rowsは、DUPLICATE KEYUPDATEOPERATIONで2を返します

$update = mysql_query("
INSERT INTO details (id, name, team, cost) 
VALUES ('$id', '$name', '$team', '$cost') 
ON DUPLICATE KEY UPDATE cost = '$cost' ") 
  or die (mysql_error());
  if(mysql_affected_rows() == 2)
  {
      echo "old cost = $old_cost";
      echo "New Cost : $cost";
   }

この希望が役立つことを試してください

于 2013-03-08T04:39:08.603 に答える
1

mysql_affected_rows()このコマンドを使用できます。mysql_affected_rowsを参照してください。

基本的に、更新された行数がわかります。完全な例:

$update = mysql_query
("
    INSERT INTO details (id, name, team, cost) 
    VALUES ('$id', '$name', '$team', '$cost') 
    ON DUPLICATE KEY UPDATE cost = '$cost' 
") 
or die (mysql_error());
if(mysql_affected_rows($update) != 0)
     echo $cost;

この場合、古いコストを$ costで定義する必要があります(この行は、実際には、必要に応じて解釈するためのものです)。これを行うには、事前にSELECTを使用する必要があります。おそらく、非常にエレガントなものを使用する代わりに、重複するキーをチェックすることができますON DUPLICATE KEY...

于 2013-03-08T04:14:03.650 に答える
1

mysql_ *関数の代わりにPHPのPDOを使用することをお勧めします。これらは公式に非推奨であり、PHPのPDOより安全でオブジェクト指向のアプローチです。

→ PHPのPDOの詳細については、 http ://php.net/manual/en/book.pdo.phpを参照してください。

そうは言っても、INSERTステートメントは、INSERTステートメントが正常に完了したか失敗したかに応じて、TRUEまたはFALSEのみを返します。

→また、mysql_affected_rows()またはmysql_num_rows()、挿入/更新された行の数のみを返し、探している古いコストは返しません。

したがって、これは2つの部分で行う必要があります。

A)

SELECT `cost` 
FROM `details`
WHERE `id` = '$id'

上記のクエリの行が見つかった場合は、IDが重複していることがわかり、cost返された$costと新しい$costを比較できます。

次に、利用可能な新旧のコストで質問に対する答えが得られ、次のことができます。

B)

INSERT INTO details (id, name, team, cost) 
VALUES ('$id', '$name', '$team', '$cost') 
ON DUPLICATE KEY UPDATE cost = '$cost' 

→使用している変数を必ずサニタイズしてください。mysql_real_escape_string

→または、PHPのPDOを使用して、変数をクエリにバインドするときに変数をサニタイズします。

于 2013-03-08T04:24:59.293 に答える
0

AFAIKには、クエリの実行後に古いコストを取得する方法はありません。これは2つのステップで行う必要があります。最初に選択し、次に挿入/更新します。

于 2013-03-08T04:15:12.920 に答える