2010-02-13 15 views
98

Ho creato questo codice per dare +1 punto, ma non funziona correttamente.Valore di incremento nella query di aggiornamento mysql

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

il $ punti variabile è i punti d'Istruzioni in questo momento .. Io voglio che più uno ad esso .. quindi ad esempio se avesse avuto come 5 punti, dovrebbe essere 5 + 1 = 6 .. ma non funziona, cambia solo in 1

Cosa ho fatto di sbagliato? grazie

+1

Ho avuto un un problema simile ha poi realizzato che il tipo predefinito del campo era "NULL", lo ha cambiato in 0 e tutto andava bene. – Azmeer

risposta

222

Si potrebbe anche solo fare questo:

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

@Steve il tuo commento potrebbe sembrare intelligente per qualcuno che sa cosa sia PDO, ma per me che mi sto semplicemente immergendo in PHP/MySQL, in realtà non è molto illuminante. PDO rende questo codice più piccolo o più elegante? In tal caso, modifica la risposta o pubblica uno dei tuoi, in cui mostri come è migliore con PDO. Grazie. –

+5

@CamiloMartin Anch'io ero curioso. Ho trovato questo utile http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/ –

+8

@CamiloMartin i [manuali php.net] (http://php.net /manual/en/function.mysql-query.php) la pagina per mysql_query ha la seguente nota: Questa estensione è obsoleta dal PHP 5.5.0 e verrà rimossa in futuro. Invece, il [MySQLi] (http://www.php.net/manual/en/book.mysqli.php) o [PDO_MySQL] (http://www.php.net/manual/en/ref.pdo- mysql.php) dovrebbe essere usato. Vedi anche [MySQL: scelta di una API] (http://www.php.net/manual/en/mysqlinfo.api.choosing.php) guida e [FAQ correlate] (http://www.php.net/manual /en/faq.databases.php#faq.databases.mysql.deprecated) per ulteriori informazioni. – aland

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

cosa succede se ho usato variabile anziché value = 1? dovrei farlo in questo modo "punti = punti + $ variabile"? o "punti = punti + '$ variabile'" –

1

Rimuovere il ' intorno al point:

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

Stai "casting" un valore intero a stringa nella vostra domanda originale ...

0

Perché non si lascia PHP fa il lavoro?

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

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

+1

Grazie a @VincentNikkelen, hai colpito il chiodo sulla testa. Concorrenza! –

+1

Se si utilizza questo metodo, è necessario innanzitutto SELEZIONARE i dati, il che significa un ulteriore accesso alla riga. Questa non è la strada da percorrere se hai solo bisogno di aggiornare il valore. – andufo

16

È possibile eseguire questa operazione 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, quello che stavi facendo sbagliato è che avete passato il vecchio quantità di punti come una stringa (points='5'+1), e non è possibile aggiungere un numero in una stringa. ;)

10

Speranza non ho intenzione offtopic sul mio primo post, ma mi piacerebbe espandere un po 'sul casting di integer a stringa come alcuni gli intervistati sembrano sbagliarsi.

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

Per dimostrare il seguente produrrà il risultato 6:

SELECT ' 05.05 '+'.95'; 

concatenazione di stringhe in MySQL richiede la funzione CONCAT() quindi non c'è ambiguità e MySQL converte le stringhe di galleggiante e li somma insieme.

Penso che il motivo per cui la query iniziale non funzionava molto probabilmente perché la variabile $ points non è stata effettivamente impostata sui punti correnti dell'utente. Era impostato a zero, o non era impostato: MySQL lancia una stringa vuota a zero. Per l'illustrazione, il seguente restituirà 0:

SELECT ABS(''); 

Come ho detto, spero che non sono troppo off-topic. Sono d'accordo che Daan e Tomas hanno le migliori soluzioni per questo particolare problema.

+0

+1 punti di compton molto buoni, hai ragione sul cast di lavoro, essere lì citazioni o meno. Benvenuto in SO! –

7

Inoltre, per "incremento" stringa, quando aggiornamento, utilizzare CONCAT

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

Chi ha bisogno di aggiornare corda e numeri SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:[email protected]+1);

0

Si dovrebbe usare PDO 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 c'è bisogno di interrogare DB per ottenere il numero di punti. È possibile incrementare direttamente nella query di aggiornamento (points = points + 1).

(nota: Inoltre, non è una buona idea per incrementare il valore con PHP, perché è necessario selezionare prima i dati e il valore può cambiare se altri utenti vengono aggiornati di esso.)

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

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