MYSQL, если существует обновление, иначе вставить.Почти работает, кроме 1 штуки - PullRequest
3 голосов
/ 18 декабря 2011

Я работаю над проектом Flex / Php.Я написал этот php-скрипт, чтобы, если артиста еще не было в базе данных, я вставил его и установил значение like_score в 1. Если он уже существует, мы обновим like_score, добавив +1.Это то, что у меня есть:

// Variables
$php_artist = $_POST["rma_artist"];


/*
* A simple query to know if the artist exists in the DB by its name. We can't use id since we won't get that value.
* if $numrows > 0, we have a match. We calculate the number of likes and then, we update.
* else, we insert.
*/
$query = "SELECT like_score FROM rma_likelist WHERE like_artist = '$php_artist'";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
$numrows = mysql_num_rows($result);

// UPDATE if there is a row that matches, we update
if ($numrows > 0) {
$newLikeScore = $row["like_score"] + 1;
$query = "UPDATE rma_likelist SET like_score = '$newLikeScore' like_artist = $php_artist";

if ( !mysql_query($query, $mysql_connection) ){
    die('ERROR: '. mysql_error() );
}

// id, name, likes, operation
$response = $php_artist_id.":::".$php_artist.":::".$newLikeScore.":::MYSQL UPDATE SUCCESSFULL";
}
// INSERT if no rows match, we insert a new record
else {
$query = "INSERT INTO rma_likelist (like_artist, like_score) VALUES ('$php_artist', '1')";

$message = "INSERT SUCCESSFULL, 1 Record Added";

if ( !mysql_query($query, $mysql_connection) ){
    die('ERROR: '. mysql_error() );
}

$new_id = mysql_insert_id();

// id, name, likes, operation
$response = $new_id.":::".$php_artist.":::1:::MYSQL INSERT SUCCESSFULL";
}



echo $response;

?>

(или см. Pastebin: http://pastebin.com/HwHYXaGP)

Это почти работает: если артиста еще нет в базе данных, он вставит егои присваивает ему значение like_score, равное 1. Он также распознает, есть ли исполнитель в базе данных, потому что он не будет дублировать исполнителей, однако никогда не обновит like_score группы, которая уже находится в базе, он всегда остается равным 1Почему это происходит? Я искал долгое время = /

Ответы [ 3 ]

4 голосов
/ 18 декабря 2011

Ваш код, вероятно, не работает, потому что ваш оператор UPDATE неполон:

$query = "UPDATE rma_likelist SET like_score = '$newLikeScore' 
  /* missing WHERE keyword */ like_artist = $php_artist";

Заявление должно включать ... WHERE like_artist = ...

Я ожидал, что ваша ошибка вызовет синтаксическую ошибку, и я вижу, что вы проверяете ложный результат из mysql_query(), поэтому я не уверен, почему вы его не обнаружили.

Кроме того, если $php_artist - строка, вы не указали ее в операторе UPDATE.

Также следует быть осторожным при создании уязвимости SQL-инъекция .


Тем не менее, я предлагаю вам значительно упростить свой код, используя INSERT... ON DUPLICATE KEY UPDATE.

$query = "INSERT INTO rma_likelist (like_artist, like_score) VALUES (?, 1)
    ON DUPLICATE KEY UPDATE like_score = like_score + 1";

$stmt = $pdo->prepare($query);

$stmt->execute( array($php_artist) );

PS: я бы также использовал PDO с параметрами запроса, как показано выше, вместо устаревшего ext / mysql.

1 голос
/ 18 декабря 2011

я думаю, что like_score будет в $ row [0] ["like_score"]

вам не хватает WHERE в запросе на обновление $ query = "UPDATE rma_likelist SET like_score = '$ newLikeScore' где like_artist = $ php_artist";

Где, как и в этих случаях, хорошей практикой является сделать Like_artist уникальным и использовать при обновлении дубликата ключа особенность mysql.

0 голосов
/ 18 декабря 2011

Вы должны использовать MERGE для того, что вы хотите сделать:

MERGE into rma_likelist using (select pk_artist_id from rma_likelist where pk_artist_id = theid)
when not matched then insert into rma_likelist values (...)
when matched then update rma_likelist set like_score = like_score + 1 where ...

(запрос не завершен, есть некоторые части вашего сценария, которые я не понимаю)

Очевидным преимуществом здесь является то, что вам даже не нужен запрос для проверки существования художника в первую очередь - на один источник меньше ошибок;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...