2009-06-13 10 views
2

更新コマンドを使用して、データベース内の特定のエントリのを変更しますが、同じtype_idを持つすべてのエントリのを変更しています。更新コマンドが同じIDを持つすべてのフィールドを更新するのはなぜですか?

個々のエントリのtype_nameのみを変更し、type_idのすべてのエントリに関連付けられているを変更する必要はありません。

私は更新クエリを持っている:

$sql = 'UPDATE photos 
     LEFT JOIN types 
     ON photos.type_id = types.type_id 
     SET photos.photo_title = $_POST['photo_title'], 
      types.type_name = $_POST['type_name'] 
     WHERE photos.photo_id = 3'; 

はここで私が使用しているフォームの:

<form name="form1" method="post" action=""> 
    <input name="photo_title" type="text" value=""/> 
    <textarea name="type_name"></textarea> 
    <input type="submit" name="update" value="Update entry" /> 
</form> 

は、ここに私のデータベース構造です:

TABLE写真

  • photo_id PRIMARY KEY

  • photo_title

    • はPRIMARY KEY

    • TYPE_NAME

    • をTYPE_ID FOREIGN KEY

    TABLEタイプをTYPE_IDサイドノートでは

+3

をしたい場合は、どのようにタイプのテーブルの「個々のエントリ」を識別うだから、テーブルのリレーションシップを指定する必要がありますか?あなたのSQLは、指定されたtype_idの型のすべての行を更新する必要があると言います - 更新する必要があるものを特定する方法と、そうでないものを区別する方法は何ですか? –

+0

あなたのコードは、私が数えることができる方法よりもひどいです。更新には主キーを使用します。あなたのSQLにはPOST変数を含めないでください!今まで! SQLインジェクションが意味することと、パラメータの使い方を学ぶ。 – SpliFF

+0

ええ、私はスプライフを知っています。私はちょうど私が何をしようとしているのか理解しやすくするためにここに行った。私は実際に準備されたステートメントを使用して、変数をバインドしていますが、準備されたステートメントを理解していない人にはもっと混乱させたくありませんでした。 – zeckdude

答えて

2

あなたの参加が間違ったデータセットを生成しているということが起こっています。あなたはtype_idの写真とタイプに参加しています。

ここで説明しているように、型の列には同じtype___idの複数の行が含まれている可能性があります。これは何を意味するのでしょうか?つまり、各写真に複数のペアの(photos,types)が作成されます(具体的には、写真ごとにn行が生成され、nは写真と同じtype_idを持つタイプの行の数です)。

これを修正する方法については、データベース設計を見てください。それぞれの写真のタイプには一意の行があるようです。この関係はどのように表現されていますか?これにより、あなたの参加のために適切なON句を得ることができます。

UPDATE

テーブル構造を見ていたら、あなたのデータベースが若干異なるものを表現しているようです。それは同じタイプの複数の写真を持つことができます(つまり、写真のテーブルのtypeidは同じです)。したがって、そのような写真の1つだけの型名を変更することは、少し意味がありません。特定のタイプのタイプ名を更新しているだけです。名前は更新していた写真のタイプです。

ここでは正確に何を達成しようとしていますか?

  • 特定の写真を分類する場合は、タイプテーブルに新しいエントリを作成し、その写真をその新しいレコードにポイントするか、名前が一致する既存の写真を見つけてそのレコードに写真を向けます。 (私は既にあなたの写真挿入ロジックにこのようなコードがあると考えています。これは似ているはずです)
  • 写真のタイプ説明とそのタイプの他のすべての写真を更新しようとすると、 。
+0

Yuliy、私のデータベース構造を追加しました。それは事を明確にするのに役立つのでしょうか? – zeckdude

+0

はい、あります。私はそれに基づいて答えにもう少し追加しました。 – Yuliy

+0

"代わりに、タイプテーブルに新しいエントリを作成してその写真をその新しいレコードにポイントしたい" これをどのように達成するかのコード例を教えてもらえますか? type_name列にすでに入力されているtype_nameがすでに存在するかどうかを確認するifステートメントを作成したい場合は、その特定のtype_idに変更し、type_nameが存在しない場合は新しいレコードを挿入します。 どうすればそれをプログラミングすることができますか? – zeckdude

-1
$sql = 'UPDATE photos 
     LEFT JOIN types 
     ON photos.type_id = types.type_id 
     SET photos.photo_title = $_POST['photo_title'], types.type_name = $_POST['type_name'] 
     WHERE photos.photo_id = 3 LIMIT 1'; 

、あなたは

$photo_title = escape_function($_POST['photo_title']) 
$type_name = escape_function($_POST['type_name']) 

をやっているshouleとクエリ文字列に '' でvarialble名前を包みます。

+3

これはただ1つの行を変更しますが、なぜその行は自動的に「正しい」ものになりますか? –

0

私は同じTYPE_IDで すべてのエントリに関連付けられている 個々のエントリのタイプ名、およびない TYPE_NAMEことを変更するだけにそれを必要とします。

これはあなたの根本的な問題です。 typeidごとにタイプデータベースに1つのレコードしか存在しないので、それを変更すると、それはtypeidを参照するすべての写真に対して効果的に変更されます。

写真ごとに別のを保存する必要がある場合は、photosテーブルに列を作成してそこに保管してください。おそらくいくつかの他の写真もtypeid(場合にあなたが安全に更新することができないことを使用しているかどうかを確認すること -

これを行うための他の方法はtypes表にtype_nameが編集されるたびに新しいレコードを作成することです既存のレコード)。しかし、あなた自身でこれを行うコードを実装する必要があります。

1

MySQLがこれを可能にしているのに驚いていますが、タイプテーブルの名前を更新しているようです。あなたは、おそらく、写真のテーブルの1つの行のtype_idを更新しようとしています。

あなたはこのようなことを行うことができ

UPDATE photos 
SET photos.photo_title = $_POST['photo_title'], 
    photos.type_id = (
     select type_id 
     from types 
     where type_name = $_POST['type_name'] 
    ) 
WHERE photos.photo_id = 3 

または代わり:

UPDATE photos 
LEFT JOIN types ON types.type_id = $_POST['type_name'] 
SET photos.photo_title = $_POST['photo_title'], 
    photos.type_id = types.type_id 
WHERE photos.photo_id = 3 

このクエリを実行する前に、あなたはtype_nameが存在することを確認できます。

REPLACE INTO types (type_name) VALUES ($_POST['type_name']) 
+0

あなたは正しい方向にいると思いますが、 idを '0'に戻して、タイプ名が現れなかった。何か案は? – zeckdude

+0

IDを0に戻す場合、新しい名前はおそらく型テーブルに存在していない可能性があります。 UPPLATEクエリの前にREPLACE INTOクエリを実行しようとしましたか? REPLACE INTOクエリは、新しい型を型テーブルに追加します。 – Andomar

0

の場合複数の行が更新されている場合は、一意キーを使用して表を更新していません。テーブルの関係を理解することは難しいですが、1:M関係のようですが、1つのタイプを複数の写真に追加することはできますか?

WHERE句のtype_idを使用して写真テーブルを更新すると、明らかに複数のテーブルが更新されます。特定の行を更新する場合は、更新に固有の主キーのみを使用します。

あなたはまともな解決策:)

関連する問題