Incremento de valor en la consulta de actualización de mysql


138

He creado este código para dar +1 punto, pero no funciona correctamente.

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

la variable $ puntos son los puntos del usuario en este momento ... quiero que sea más uno ... así que, por ejemplo, si tuviera 5 puntos, debería ser 5 + 1 = 6 ... pero no lo hace, simplemente cambia a 1

¿Qué he hecho mal? gracias


2
Tuve un problema similar y luego me di cuenta de que el tipo predeterminado del campo era 'NULL', lo cambié a 0 y todo estaba bien.
Azmeer 01 de

Respuestas:


322

También podrías hacer esto:

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

59
@Steve su comentario puede sonar inteligente para alguien que sabe lo que es PDO, pero para mí, que solo está sumergiéndose en PHP / MySQL, realmente no arroja mucha luz sobre el asunto. ¿PDO hace ese código más pequeño o más elegante? Si es así, edite la respuesta o publique una propia donde muestre cómo es mejor con PDO. Gracias.
Camilo Martin el

55
@CamiloMartin Yo también tenía curiosidad. Encontré esto útil net.tutsplus.com/tutorials/php/…
PJ Brunet

11
@CamiloMartin, la página de manuales de php.net para mysql_query tiene la siguiente nota: esta extensión está en desuso a partir de PHP 5.5.0 y se eliminará en el futuro. En cambio, se debe usar la extensión MySQLi o PDO_MySQL . Consulte también MySQL: elegir una guía API y preguntas frecuentes relacionadas para obtener más información.
aland

9
Concatenar los datos del usuario como se demuestra en una consulta SQL es un riesgo importante de inyección SQL.
trognanders

1
@bigp: Lo intenté UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)y no funcionó. Lo que hizo el trabajo fue: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie

23

Puede hacerlo sin tener que consultar la cantidad real de puntos, por lo que le ahorrará tiempo y recursos durante la ejecución del script.

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

De lo contrario, lo que estaba haciendo mal es que pasó la cantidad anterior de puntos como una cadena ( points='5'+1), y no puede agregar un número a una cadena. ;)


10

Espero no ir fuera del tema en mi primera publicación, pero me gustaría ampliar un poco el reparto de enteros para encadenar, ya que algunos encuestados parecen equivocarse.

Debido a que la expresión en esta consulta usa un operador aritmético (el símbolo más +), MySQL convertirá cualquier cadena en la expresión a números.

Para demostrar, lo siguiente producirá el resultado 6:

SELECT ' 05.05 '+'.95';

La concatenación de cadenas en MySQL requiere la función CONCAT (), por lo que no hay ambigüedad aquí y MySQL convierte las cadenas en flotantes y las agrega.

De hecho, creo que la razón por la que la consulta inicial no estaba funcionando es muy probable porque la variable $ points no estaba establecida en los puntos actuales del usuario. Se estableció en cero o no se configuró: MySQL lanzará una cadena vacía a cero. Por ejemplo, lo siguiente devolverá 0:

SELECT ABS('');

Como dije, espero no estar demasiado fuera de tema. Estoy de acuerdo en que Daan y Tomas tienen las mejores soluciones para este problema en particular.


+1 compton muy buenos puntos, tienes razón sobre el elenco trabajando, ya sea citas o no. Bienvenido a SO!
Pekka

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

1
¿Qué pasa si usé variable en lugar de valor = 1? ¿debería hacerlo de esta manera "puntos = puntos + $ variable"? o "puntos = puntos + '$ variable'"
Ivo San

7

Además, para "incrementar" la cadena, cuando se actualiza, use CONCAT

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

3

¿Quién necesita actualizar cadenas y números? SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

Debe usar PDO para evitar el riesgo de inyección SQL.

Puede conectarse a DB de esta manera:

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');
}

No es necesario consultar DB para obtener el número de puntos. Puede incrementar directamente en la consulta de actualización ( points = points + 1).

(nota: Además, no es una buena idea incrementar el valor con PHP porque necesita seleccionar primero los datos y el valor puede cambiar si otros usuarios lo actualizan).

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

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

1

Retire el 'alrededor de point:

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

Está "emitiendo" un valor entero para encadenar en su consulta original ...


-2

¿Por qué no dejas que PHP haga el trabajo?

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

77
Buen punto, pero tenga cuidado en un entorno concurrente ya que el valor de DB podría haber cambiado mientras tanto.
Vincent Nikkelen

1
Gracias @VincentNikkelen, has dado en el clavo. Concurrencia!
Jimmy Ilenloa

1
Si usa este método, primero debe SELECCIONAR los datos, lo que significa un acceso adicional a la fila. Este no es el camino a seguir si solo necesita actualizar el valor.
Andres SK
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.