Valor de incremento na consulta de atualização do mysql


138

Eu criei esse código para dar um ponto +1, mas ele não funciona corretamente.

mysql_query("
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."'
");

a variável $ points é o ponto do usuário no momento .. quero acrescentar um a ele .. por exemplo, se ele tivesse 5 pontos, deveria ser 5 + 1 = 6 .. mas não muda, apenas muda para 1

O que eu fiz errado? obrigado


2
Eu tive um problema semelhante e percebi que o tipo padrão do campo era 'NULL', alterei para 0 e estava tudo bem.
Azmeer

Respostas:


322

Você também pode fazer isso:

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");

59
@Steve, seu comentário pode parecer inteligente para alguém que sabe o que é DOP, mas para mim, que está apenas mergulhando no PHP / MySQL, isso realmente não lança muita luz sobre o assunto. O DOP torna esse código menor ou mais elegante? Em caso afirmativo, edite a resposta ou poste uma onde você mostre como é melhor com a DOP. Obrigado.
Camilo Martin

5
@CamiloMartin Também fiquei curioso. Eu encontrei este net.tutsplus.com/tutorials/php/…
PJ Brunet

11
O @CamiloMart na página de manuais do php.net para mysql_query tem a seguinte nota: Esta extensão está obsoleta no PHP 5.5.0 e será removida no futuro. Em vez disso, a extensão MySQLi ou PDO_MySQL deve ser usada. Veja também MySQL: escolhendo um guia de API e perguntas frequentes relacionadas para obter mais informações.
Aland

9
Concatenar dados do usuário, conforme demonstrado em uma consulta SQL, é um grande risco de injeção de SQL.
Trognanders

1
@ bigp: Eu tentei UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)e não funcionou. O que fez o trabalho foi: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie

23

Você pode fazer isso sem precisar consultar a quantidade real de pontos, para economizar tempo e recursos durante a execução do script.

mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'");

Senão, o que você estava fazendo de errado é que passou a quantidade antiga de pontos como uma string ( points='5'+1) e não pode adicionar um número a uma string. ;)


10

Espero não estar saindo offtopic no meu primeiro post, mas gostaria de expandir um pouco a conversão de inteiro para string, pois alguns entrevistados parecem estar errados.

Como a expressão nesta consulta usa um operador aritmético (o símbolo de mais +), o MySQL converterá quaisquer strings da expressão em números.

Para demonstrar, o seguinte produzirá o resultado 6:

SELECT ' 05.05 '+'.95';

A concatenação de strings no MySQL requer a função CONCAT (), portanto não há ambiguidade aqui e o MySQL converte as strings em floats e as adiciona.

Na verdade, acho que o motivo pelo qual a consulta inicial não estava funcionando é mais provável, porque a variável $ points não foi de fato definida para os pontos atuais do usuário. Ele foi definido como zero ou não foi definido: o MySQL converterá uma string vazia em zero. Para ilustração, o seguinte retornará 0:

SELECT ABS('');

Como eu disse, espero não estar sendo muito fora de tópico. Concordo que Daan e Tomas tenham as melhores soluções para esse problema em particular.


+1 pontos muito bons, você está certo sobre o funcionamento do elenco, seja por aspas ou não. Bem-vindo ao SO!
Pekka

7
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"

1
e se eu usasse variável em vez de value = 1? devo fazer dessa maneira "points = points + $ variable"? ou "points = points + '$ variable'"
Ivo San

7

Além disso, para "incrementar" a string, ao atualizar, use CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1

3

Quem precisa atualizar string e números SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

Você deve usar o PDO para evitar o risco de injeção de SQL.

Você pode se conectar ao DB assim:

try {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=xxxx;dbname=xxxx', 'user', 'password', $pdo_options);
    $bdd->query('SET NAMES "utf8"');
} catch (PDOException $e) {
    exit('Error');
}

Não é necessário consultar o banco de dados para obter o número de pontos. Você pode incrementar diretamente na consulta de atualização ( points = points + 1).

(observação: Além disso, não é uma boa ideia incrementar o valor com o PHP, pois é necessário selecionar primeiro os dados e o valor poderá ser alterado se outros usuários o atualizarem.)

$req = $bdd->prepare('UPDATE member_profile SET 
            points = points + 1
            WHERE user_id = :user_id');

$req->execute(array(
    'user_id' => $userid
));

1

Remova o em 'torno de point:

mysql_query("UPDATE member_profile SET points=".$points."+1 WHERE user_id = '".$userid."'");

Você está "convertendo" um valor inteiro para a string na sua consulta original ...


-2

Por que você não deixa o PHP fazer o trabalho?

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"

7
Bom ponto, mas tenha cuidado em um ambiente simultâneo, pois o valor do banco de dados pode ter sido alterado nesse meio tempo.
Vincent Nikkelen

1
Obrigado @VincentNikkelen, você acertou a cabeça. Concorrência!
Jimmy Ilenloa

1
Se você usar esse método, primeiro SELECIONE os dados, o que significa um acesso adicional à linha. Este não é o caminho a seguir, se você apenas precisar atualizar o valor.
Andres SK
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.