2011-07-27 12 views
0

私の質問が投票を拒否しないほど明確で完璧なものになることを望みます。私のテーブルを更新するときの問題

私は、単純なHTMLフォームがあります:私はuser_id = 1ためtagを更新したい、だから私はこのコードを書く

 

id 
user_id 
tag 
.... 
 


注:私は1つだけ持って

<form ..> 
    <input type="hidden" name="user_id" value="1" /> 

    <input type="text" name="tag[]" value="css" /> 
    <input type="text" name="tag[]" value="php" /> 
    <input type="text" name="tag[]" value="sql" /> 

    ... 

    <input type="text" name="email" value="[email protected]" /> 

</form> 

MySQLのスキーマをテーブル内のユーザー。

 


$user_id = $_POST['user_id']; 
$tag  = mysql_escape_string($_POST['tag']); // $tag is an array - print $tag 
$email = $_POST['email']; 

foreach($tag as $value) { 
    $DB = "UPDATE table SET tag = '$value' AND email = '$email' 
      WHERE user_id = '$user_id'"; 
    .... // run the query 
} 


 

私が取得:

 

id user_id tag 
1 1   sql 
2 1   sql 
3 1   sql 
 

の代わりに:

 

id user_id tag 
1 1   css 
2 1   php 
3 1   sql 
 

私はPHPコードで何かを逃した場合、私が尋ねますか?

答えて

1

最初の更新クエリでは、user_idが1(すべて3つ)のすべてのレコードを "css" php "、そして最後には" sql "です。 foreachループが終了した後、それらはすべて「SQL」ですあなたはこの試みることができる

$i = 1; 
foreach($tag as $value) { 
    $DB = "UPDATE table SET tag = '$value' WHERE user_id = '$user_id' AND id=$i"; 
    .... // run the query 
    $i++; 
} 
+0

ありがとうございます。今私は理由を理解する。 – Cheerio

+0

Np、喜んで助けてください –

0

問題は、user_idが特定の値であるすべてのレコードを更新していることです。したがって、foreachループの各段階でスクリプトを中断すると、3つのcssタグが表示され、次に3つのphpタグが表示され、3つのsqlタグが表示されます。

この種のことについては、簡単なルートに進む傾向があります。トランザクションを開始し、古いタグを削除し、新しいタグを削除してコミットし、完了します。それ以外の場合は、どのタグが新しく、古くなっているのかを判断し、適切な挿入/削除コマンドを実行して同期させる必要があります。

だから基本的に、あなたはこのような何かをしたい:

もちろん
mysql_query("start transaction;") or die(mysql_error()); 
mysql_query("Delete from yourtable WHERE user_id=$user_id") or die(mysql_error()); 

$newtags = array(); 
foreach ($_POST['tag'] as $tag) { 
    $escaped = "($user_id, " . mysql_real_escape_string($tag) . ")"; 
} 
if (count($escaped) > 0) { 
    $values = implode(',', $escaped); 
    $sql = "INSERT INTO yourtable (user_id, tag) VALUES $values"; 
    mysql_query($sql) or die(mysql_error()); 
} 
mysql_query("commit;") or die(mysql_error()); 

が、これは使用されているテーブルは、タグ情報のみを保持していることを前提としています。もしそうでないなら、それは...まあ...やってはいけない。

+0

問題は、私は他のフィールド 'email' +' full_name'を持っているということです... – Cheerio

+0

テーブルをより正規化するためには、テーブルを再設計する必要があります。ユーザーごとに同じデータの複数のコピーを保管しているため、スペースが浪費され、データの矛盾が発生する可能性があります。 –

+0

はい私はそれを行う必要があります - 私はそれに感謝あなたの素晴らしい助けをもう一度ありがとう – Cheerio

0

いいえ、あなたはSQLで何かを逃しました。あなたの条件はuser_idのみをフィルタリングするので、UPDATEはuser_id = 1のすべてのレコードを変更します。

+0

私の悪い。だから私はそれぞれの 'タグ'で各 'id 'を送り、それからそれらを更新する必要がありますか? – Cheerio

0

をあなたはそれを持っている方法は、構造化され、アレイ内の各タグタイプの列を追加する必要があり、あなたは、2つのセレクタ

が必要になるだろ

例:

$DB = "UPDATE table SET tag = '$value' WHERE user_id = '$user_id' AND tag_type='1'"; 

タグタイプは、配列の項目に応じて、異なる値を持つことになり

0

あなたのテーブルが適切にインデックスされると仮定すると、あなたは、これらのクエリを行うことができます。

INSERT IGNORE INTO `table` (user_id, tag) 
VALUES (1, 'css'), (1, 'php') 

を...そして、:それは明らかに本物ではありませんので、

DELETE FROM `table` 
WHERE user_id=1 
AND tag NOT IN ('css', 'php') 

私はあなたのコードにコメントはありませんが、適切に入力されたデータをエスケープすることを忘れないでください。

関連する問題