Incrementa il valore nella query di aggiornamento mysql


139

Ho creato questo codice per distribuire +1 punto, ma non funziona correttamente.

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

la variabile $ points è il punto dell'utente in questo momento .. Voglio che ne aggiunga uno ad esso .. quindi ad esempio se avesse 5 punti, dovrebbe essere 5 + 1 = 6 .. ma non lo fa, cambia solo a 1

Cosa ho fatto di sbagliato? grazie


2
Ho avuto un problema simile, quindi ho capito che il tipo predefinito del campo era "NULL", l'ho cambiato in 0 e tutto andava bene.
Azmeer,

Risposte:


323

Potresti anche solo fare questo:

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

59
@Steve il tuo commento potrebbe sembrare intelligente per qualcuno che sa cos'è il DOP, ma per me che si sta semplicemente tuffando in PHP / MySQL, non fa davvero molta luce sulla questione. Il DOP rende quel codice più piccolo o più elegante? In tal caso, modifica la risposta o pubblicane una tua dove mostri come è meglio con DOP. Grazie.
Camilo Martin,

5
@CamiloMartin Anche io ero curioso. Ho trovato utile questo net.tutsplus.com/tutorials/php/…
PJ Brunet il

11
@CamiloMartin la pagina dei manuali di php.net per mysql_query ha la seguente nota: questa estensione è obsoleta a partire da PHP 5.5.0 e verrà rimossa in futuro. Invece, è necessario utilizzare l'estensione MySQLi o PDO_MySQL . Vedi anche MySQL: scelta di una guida API e relative FAQ per ulteriori informazioni.
aland

9
Concatenare i dati utente come dimostrato in una query SQL è un grave rischio di iniezione SQL.
Trognandro

1
@bigp: ho provato UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)e non ha funzionato. Che cosa ha fatto il lavoro era: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie,

23

Puoi farlo senza dover interrogare la quantità effettiva di punti, in modo da risparmiare tempo e risorse durante l'esecuzione dello script.

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

Altrimenti, ciò che stavi facendo è che hai passato la vecchia quantità di punti come stringa ( points='5'+1) e non puoi aggiungere un numero a una stringa. ;)


10

Spero di non andare fuori tema sul mio primo post, ma mi piacerebbe espandere un po 'il casting del numero intero su stringa poiché alcuni intervistati sembrano sbagliare.

Poiché l'espressione in questa query utilizza un operatore aritmetico (il simbolo più +), MySQL convertirà le stringhe nell'espressione in numeri.

Per dimostrare, quanto segue produrrà il risultato 6:

SELECT ' 05.05 '+'.95';

La concatenazione di stringhe in MySQL richiede la funzione CONCAT (), quindi non c'è alcuna ambiguità qui e MySQL converte le stringhe in float e le somma insieme.

In realtà penso che il motivo per cui la query iniziale non funzionava sia molto probabile perché la variabile $ points non era in realtà impostata sui punti correnti dell'utente. O era impostato su zero o non era impostato: MySQL lancerà una stringa vuota a zero. Ad esempio, quanto segue restituirà 0:

SELECT ABS('');

Come ho detto, spero di non essere troppo fuori tema. Sono d'accordo che Daan e Tomas hanno le migliori soluzioni per questo particolare problema.


+1 compton punti molto buoni, hai ragione sul funzionamento del cast, che ci siano virgolette o meno. Benvenuti in SO!
Pekka,

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

1
e se usassi la variabile invece di value = 1? dovrei farlo in questo modo "punti = punti + $ variabile"? o "punti = punti + '$ variabile'"
Ivo San

7

Inoltre, per "incrementare" la stringa, durante l'aggiornamento, utilizzare CONCAT

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

3

Chi deve aggiornare stringa e numeri SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

È necessario utilizzare DOP per prevenire il rischio di iniezione SQL.

È possibile connettersi a DB in questo modo:

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

Non è necessario interrogare DB per ottenere il numero di punti. È possibile incrementare direttamente nella query di aggiornamento ( points = points + 1).

(nota: inoltre, non è una buona idea incrementare il valore con PHP perché è necessario selezionare prima i dati e il valore può essere modificato se altri utenti lo aggiornano.)

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

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

1

Rimuovere il 'intorno al point:

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

"Trasmetti" un valore intero per la stringa nella query originale ...


-2

Perché non lasci che PHP faccia il lavoro?

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

7
Buon punto, ma fai attenzione in un ambiente concorrente poiché il valore del DB potrebbe essere cambiato nel frattempo.
Vincent Nikkelen,

1
Grazie @VincentNikkelen, hai colpito l'unghia sulla testa. Concorrenza!
Jimmy Ilenloa,

1
Se si utilizza questo metodo, è innanzitutto necessario SELEZIONARE i dati, il che significa un ulteriore accesso alla riga. Questa non è la strada da percorrere se devi solo aggiornare il valore.
Andres SK,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.