1
$query="update attendance 
SET 
    `day1`='$day1', `day2`='$day2',  `day3`='$day3', `day4`='$day4', 
    `day5`='$day5', `day6`='$day6', `day7`='$day7', `day8`='$day8', 
    `day9`='$day9', `day10`='$day10', `day11`='$day11', `day12`='$day12', 
    `day13`='$day13', `day14`='$day14', `day15`='$day15', `day16`='$day16', 
    `day17`='$day17', `day18`='$day18', `day19`='$day19', `day20`='$day20', 
    `day21`='$day21', `day22`='$day22', `day23`='$day23', `day24`='$day24', 
    `day25`='$day25', `day26`='$day26', `day27`='$day27', `day28`='$day28', 
    `day29`='$day29', `day30`='$day30', `day31`='$day31', `accident`='$a1', 
    `disiplinary`='$d1', `family_death`='$fd1', `family_illness`='$fi1', 
    `holiday`='$h1', `illness`='$i1', `jury_duty`='$j1', `leave`='$l1', 
    `layoff`='$lo1', `personal`='$p1', `tardy`='$t1', `vacation`='$v1' 
WHERE `month`='January'";

$result=mysql_query($query);

ここでは、day1値が更新され(値は1)、次に値を更新するday2と1になり、その時点でday2値は更新されます(1)が、day1値はゼロに変更されます。

私がやること?

4

1 に答える 1

2

クエリを表現した方法では、すべての変数$day1を PHP 内で設定する必要があります。そうでない場合は、空の文字列がリクエストに貼り付けられ、MySQL サーバーによってゼロに変換されます。

したがって、 のみを変更したい場合はday2、次のようにします。

UPDATE attendance SET day2 = ? WHERE month = 'January'

とはいえ、現在のアプローチを改善する方法はたくさんあります。

  • deprecatedであるため、使用mysql_queryしないでください。
  • クエリに変数を直接含めないでください。これにより、バグと SQL インジェクションの脆弱性の両方への扉が開かれます。?代わりにプレースホルダーのようなものを使用し、このクエリを実行するときに実際の値を提供してください。
  • 毎日 1 つの列を持つことは、かなり悪いデータベース スキーマのように見えます。代わりに、1 日ごとに 1 つの行を含む 1 つのテーブルを作成します。それから月ごとの概要を計算して出力することができますが、一般に、そのような要求は DB レベルで処理する方がはるかに簡単です。毎月いくつかの列が必要な場合は、それらを追加のテーブルに含めることができます。
  • DATE今説明した行に沿って、タイプを使用して毎日を説明する必要があります。1 か月に 1 行のテーブルが本当に必要な場合でもDATE、月全体を識別するために月の最初の日を使用して、それを記述するために a を使用できます。これにより、その列で日付と時刻の関数を簡単に使用できます。年と月の列を別々にしたい場合は、名前ではなく番号で月を識別していると思います。
于 2012-10-04T10:46:39.493 に答える