1

私は単純なタイムシート スクリプトをいじっているだけです。データベースに単純な挿入を行えば、すべて問題ありません。エントリも問題なく更新できます。私の問題は、情報を更新して保持したいということです(使用していた CONCAT で正常に機能していました)が、ON DUPLICATE KEY UPDATE を使用するとすぐに壊れます。

$sql="INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')";
//ON DUPLICATE KEY UPDATE
//location=VALUES(location),
//description=VALUES(description),
//timein=VALUES(timein),
//timeout=VALUES(timeout),
//timespent=VALUES(timespent)
//WHERE employee=$employee";
echo $sql;echo "<br>";
mysql_query($sql)or die(mysql_error());

重複キーのコメントを外すと、「SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、9 行目の 'WHERE employee='Eric'' 付近で使用する正しい構文を確認してください」というエラーが表示されます。私が考えることができる唯一のことは、完全に空のテーブルでこれを行っていることですが、INSERT がそれを修正したと考えました。私のすべての $variables はきれいです (PDO はありません、それも学ばなければなりません) ただ real_escape_string

$sql="INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')
ON DUPLICATE KEY UPDATE
location=VALUES(location),
description=VALUES(description),
timein=VALUES(timein),
timeout=VALUES(timeout),
timespent=VALUES(timespent)
WHERE employee='$employee'";
echo $sql;echo "<br>";
mysql_query($sql)or die(mysql_error());
4

4 に答える 4

1

INSERT ... ON DUPLICATE KEY UPDATEのドキュメントによると、クエリの最後に WHERE ステートメントがあってはなりません。

$sql="INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')
ON DUPLICATE KEY UPDATE
location=VALUES(location),
description=VALUES(description),
timein=VALUES(timein),
timeout=VALUES(timeout),
timespent=VALUES(timespent)";



ノート:

推奨される API mysqli または PDO_MySQL 拡張機能を使用することをお勧めします。新しい開発に古い mysql 拡張機能を使用することはお勧めしません。これは PHP 5.5.0 で廃止され、将来削除される予定です。詳細な機能比較表を以下に示します。3 つの拡張機能すべての全体的なパフォーマンスは、ほぼ同じであると見なされます。ただし、拡張機能のパフォーマンスは、PHP Web 要求の合計実行時間のほんの一部にすぎません。多くの場合、影響はわずか 0.1% です。

  • まだ行っていない場合は、クエリで使用する前にテキスト変数を適切にエスケープする必要があります。

    $employee = mysql_real_escape_string($employee);
    // and so on with the other variables
    

この SQL インジェクションはどのように機能するのかをお読みください。PHPでmysql_* 関数を使用してはいけないのはなぜですか? これらのトピックの詳細については、こちらをご覧ください。

于 2013-04-10T17:44:52.500 に答える
0

WHEREで句を使用しないでくださいON DUPLICATE KEY UPDATE。これWHEREは重複キーによって暗示されます。

于 2013-04-10T17:43:45.120 に答える
0

例えば:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

最初の列、つまりここの従業員が一意であり、内部でwhere句と見なされる場合

WHERE 従業員 ='$従業員'

一意でない場合は、workdate を探します...

INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')
ON DUPLICATE KEY UPDATE
[
//columns to be update
location=VALUES(location),
description=VALUES(description),
timein=VALUES(timein),
timeout=VALUES(timeout),
timespent=VALUES(timespent)
]
于 2013-04-10T18:07:30.230 に答える
-1

従業員をチック状態にします。文字列の場合は、引用符で囲む必要があります。また、変数を中括弧で囲みます。

于 2013-04-10T17:34:14.123 に答える