Olup olmadığını kontrol edin, eğer öyleyse eklemek değilse, 1 + + ile güncellemek

4 Cevap php

Hey guys quick question, I currently have an insert statement $query= "INSERT into new_mail VALUES ('$to1', '0')"; where fields are username, and message_number Currently what I would do to check if the entry exists, is do a select query then check the number of rows with mysql_num_rows (php). If rows==1 then I get the current message_number and set it equal to

$row['message_number']+1. 

Sonra başka bir sorgu ile bu girdiyi güncelleyin.

Sadece tek bir sorgu ile sadece mysql tüm bunu yapmak için daha kolay bir yolu (eğer varsa eklemek değilse yani 1 ile message_number, artış güncellemek durumunda, çek) var mı?

4 Cevap

Masa yapılandırılmış nasıl bağlı, kullanmak mümkün olabilir ON DUPLICATE KEY UPDATE (link to the MySQL manual) feature of INSERT:

INSERT into new_mail VALUES ('$to1', '0') ON DUPLICATE KEY UPDATE message_number=message_number+1

Biraz sizin soru ve tablo yapıları tarafından karıştı ama ben böyle bir şey istediğini düşünüyorum var.

INSERT INTO new_mail (username, message_number)
VALUES ($username, $message_number) 
ON DUPLICATE KEY UPDATE message_number=message_number + 1;

Bu username birincil anahtar (adınız gibi daha büyük olasılıkla bir şey) küstah edilir. Umarım bu yardımcı olur.

EDIT: ON YİNELENEN KEY GÜNCELLEME cevaplar daha iyi, ama could (seçme sorgusu eludes) bunu:

Eğer mysqli extenson kullanıyorsanız varsayarak:

$db = //Some construction of mysqli object;
$sql = 'UPDATE tablename SET RowValue = RowValue + 1 WHERE message_number = ?';
$updateStatement = $db->prepare($sql);
$updateStatement->bind_param('i', $message_number);
$message_number = //Set message number;
$updateStatement->execute();
if ($updateStatement->affectedRows == 0) {
    $sql = 'INSERT INTO tablename (RowValue,  message_number) VALUES (?, ?)';
    $insertStatement = $db->prepare($sql);
    $insertStatement->bind_param('ii', $rowValue, $messageNumber);
    $rowValue = something;
    $messageNumber = something;
    $insertStatement->execute();
}