2

私は3つのテーブルを持つデータベースに取り組んでおり、一部には情報が重複しています。各テーブルのいくつかの列は、私が作成しているWebアプリを介してユーザーが更新できます。しかし...問題があります。それが何であるかはわかりませんが、私の更新は行われていません。クエリに何か問題があるのではないかと思います。(実際には、デバッグ後、確かにあります)。

    if (empty($errors)) {   
    $query1 = "UPDATE owner SET
            name = '{$name}'
        WHERE ownerId= '{$ownerId}'";
    $query1_result = mysql_query($query1);
    if (mysql_affected_rows()==1) { 
        $query2 = "UPDATE queue_acl SET
                    date_expires = '{$date_expires}' 
                WHERE user_id='{$ownerId}'";
        $query2_result = mysql_query($query2);
        if (mysql_affected_rows()==2) {
            $query3 = "UPDATE ownerOrganization SET
                    orgId = {$orgId}
                WHERE ownerId = '{$ownerId}'";
            $query3_result = mysql_query($query3);
            if (mysql_affected_rows()==3) {
                    $_SESSION['name'] = $name;
                    $_SESSION['updates_occurred'] = true;
            }
        }
    }

些細なことならごめんなさい。私はこれまで複数のテーブルで作業したことがありません。

4

2 に答える 2

1

テーブルを自分のやり方で更新するのは良い習慣ではありません。更新が何らかの形で関連している場合は、トランザクションの作成を検討することをお勧めします。トランザクションは、すべての更新が実行されることを確認します(実行されない場合は、ロールバックが実行されます(つまり、更新は実行されません))。

// disable autocommit 
mysqli_autocommit($dblink, FALSE);

// queries
$query1 = mysqli_query($dblink, "UPDATE owner SET name = '{$name}' WHERE ownerId= {$ownerId}'");
$query2 = mysqli_query($dblink, "UPDATE queue_acl SET date_expires = '{$date_expires}' WHERE user_id='{$ownerId}'");
$query3 = mysqli_query($dblink, "UPDATE ownerOrganization SET orgId = {$orgId} WHERE ownerId = '{$ownerId}'");

if($query1 && $query2 && $query3)
{
   mysqli_commit($dblink);
   $_SESSION['name'] = $name;
   $_SESSION['updates_occurred'] = true;
}
else
   mysqli_rollback($dblink);

私はそれをテストしていませんが、それはうまくいくはずだと思います。また、mysql_は非推奨であるため、mysqliまたはプリペアドステートメントを確認する必要があります。

于 2012-06-04T20:59:24.137 に答える
0

最初の問題はスコープに関連している可能性があります。あなたのif条件が間違っていますか?

If (result ==1)
{
  if(result == 2)
  { 
   ...
  }
}

したがって、最初の結果が1より大きい場合、すべての内部条件がスキップされます。

私が理解している場合、それは次のようになります。

if(result ==1)
{
}
elseif(result ==2)
{
}
...(other conditions)...
else
{ 
}

予想よりも多くの結果が得られた場合は、ベースケースをキャッチすることをお勧めします。

2番目の問題は、orgId ={$orgId}を除くすべてのデータを引用することである可能性があります。idがランダムな文字列の場合、これはおそらくorgId ='{$ orgId}'である必要があり、引用符で囲まないと問題が発生します。

最後の懸念事項は、ownerIdを確認することです。なんらかの理由でそれが空白の場合、id = 0(自動インクリメントがオンになっていると仮定)がtrueになることはないため、クエリは失敗します。if(!empty(ownerId)を条件付きにします。

于 2012-06-04T21:25:15.493 に答える