1

テーブルからすべてのレコードを選択し、numtimespaid 列が 0 に等しいレコードに到達するまで、それらすべてのレコードをループしたいと考えています。その列を見つけたら、そのレコードの 2 に更新してから終了します。これが私が持っているもので、正しく機能していません:

$query1 = "SELECT * FROM ".$line." ORDER BY datestamp, timestamp";
$result1 = mysql_query($query1) or die(mysql_error());
while($row = mysql_fetch_array($result1)){
    if ($row[numtimespaid] == 0) {
        $queryupdate="UPDATE ".$line." SET numtimespaid=1";
        $resultu=mysql_query($queryupdate);
        break;
        }
    }

私が間違っていること、および/またはこれを行う正しい方法についてのアイデアはありますか?

4

2 に答える 2

5

SELECTステートメントから行セットをループする必要はまったくありません。その値で最初の行を更新するだけです。このクエリは、一致するレコードを 1 つだけ更新しますnumtimespaid = 0。その基準に一致するすべての行を更新する場合は、LIMIT 1.

$result = mysql_query("UPDATE $line SET numtimespaid=1 WHERE numtimespaid = 0 ORDER BY datestamp, timestamp LIMIT 1");

ところで、 の内容が何であるかはわかりません$lineが、ユーザー入力からのものである場合は、その値を適切にフィルター処理したことを願っています。ユーザー入力によるものである場合は、可能なテーブル名のホワイトリストに対してその値を確認することをお勧めします。

// $line can be one of table1,table2,table3
if (!in_array($line, array('table1','table2','table3')) {
  // FAIL, don't execute the query
}
于 2012-04-07T00:43:42.300 に答える
0
if ($row[numtimespaid] == 0) {

通常、numtimespaid は未定義の定数であると解釈されます。次のように引用符で囲みます。

if ($row['numtimespaid'] == 0) {

次に、マイケルの答えが全体的に優れていることに気付きます。

于 2012-04-07T00:57:47.857 に答える