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

Karem
fuente
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."'
");
Tomás Markauskas
fuente
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. ;)

Daan
fuente
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.

usuario272563
fuente
+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."'"
Mark Byers
fuente
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
bushkonst
fuente
3

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

Rodolfo Souza
fuente
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
));
Sébastien Gicquel
fuente
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 ...

Amirshk
fuente
-2

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

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"
Petr Peller
fuente
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