2009-04-16 13 views
0

私は以下の条件付きコードを持っています。これは適切なユーザー名を持つレコードが存在しない場合は新しいレコードを挿入し、存在する場合はレコードを更新します。これは正常に動作します。sql - 既存の情報をオーバーライドしないで更新する

しかし、現時点では、新しいレコードを挿入してfirstnameとlastnameだけを挿入し、電話の情報が空白のまま残っている場合には詳細情報を入力しても問題ありません。電話記録だけでレコードを更新したい場合、名前と住所情報は何も置き換えられません。

私が知りたいのは、情報を更新するためのPHPのhtmlフォームに簡単に埋め込む方法があるのでしょうか?更新するフィールドの内容は? Iは次いでバック以下のPHPコードに渡されたJavaScript関数に渡されるユーザ入力を得るために

<input type="text" name="uniquename" /> 

を使用しています。これが可能でない場合、空ではないユーザ入力に対応するフィールドのみを更新するために、いくつかのSQL/PHPマジックを操作する簡単な方法はありますか?

$usernameQuery = "select username from USERS where username = '" . $con->escape_string($username) . "'"; 

$xblah = $con->query($usernameQuery); 
    while ($row = mysqli_fetch_assoc($xblah)) 
    { 
    $checkUsername = $row['username']; 
    } 

if ($checkUsername == null) { 

$userQuery = "INSERT INTO USERS VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 
if ($userInfo = $con->prepare($userQuery)) { 
    $userInfo->bind_param("ssssssssssssssssssss", $username, $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $comments); 
    $userInfo->execute(); 
    $userInfo->close(); 
    echo "true"; 
} else { 
echo "false"; 
} 
print_r($con->error); 
} 

else if ($checkUsername == $username) { 

$userQuery = "UPDATE USERS SET firstname = ?, lastname = ?, flaggedauctions = ?, lastauction = ?, street1 = ?, city1 = ?, postcode1 = ?, street2 = ?, city2 = ?, postcode2 = ?, phone = ?, mobilephone = ?, fax = ?, email = ?, website = ?, bank = ?, banknumber = ?, accoutnumber = ? WHERE username = ?"; 
if ($userInfo = $con->prepare($userQuery)) { 
    $userInfo->bind_param("sssssssssssssssssss", $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $username); 
    $userInfo->execute(); 
    $userInfo->close(); 
    echo "true"; 
} else { 
echo "false"; 
} 
print_r($con->error); 
} 

答えて

1

更新文とバインドパラメータを動的に作成するだけで済みます。例:

$userQuery = "UPDATE "; 

if (!empty($firstname)) { 
    $userQuery += "firstname = ?,"; 
} 

...  

if (!empty($firstname)) { 
    $bindArgs[] = $firstname; 
} 
... 

このように変更されない列は更新されません。より一般的に

+0

うーん、ありがとう。 bindArgsでは何が起こっていますか? –

+0

私のPHPスキルは少し錆びますが、$ bindArgsをbind_param関数に渡すことができると思います。 私はあなたがPHPで可変数引数の関数に配列を渡すことができると信じています。 – oscarkuo

+0

だから、彼らは2つの別々の解決策ですか?私は各変数にbindARgsを使用するだけですか? –

0

、次の点に注意してください

  • それはINSERTであなたのカラム名を指定することが賢明です... VALUES誰かが列を追加しそうならば、あなたがイライラすることとしますので、誰かが列を並べ替える場合」混乱するでしょう。

  • あなたの選択とあなたの更新の間で競合状態があります...別のプロセスが、あなたはまだどちらか考えてみて失敗するあなたの挿入/更新を引き起こして、考えている間、行を削除/挿入することができます:

    • INSERT ... DUPLICATE KEY UPDATE ON ...
    • INTOをREPLACE ...
+0

どのように重複して挿入するか、競合状態を修正するか? –

関連する問題