Domanda

Come posso trasformare le seguenti 2 query in 1 query

$sql    = "SELECT level FROM skills WHERE id = $id LIMIT 1;";
$result = $db->sql_query($sql);
$level  = (int) $db->sql_fetchfield('level');
$db->sql_freeresult($result);

++$level;

$sql    = "UPDATE skills SET level = $level WHERE id = $id;";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);

Lo sto usando in un mod phpBB ma l'essenza è che prendo il livello, ne aggiungo uno e poi lo aggiorno, sembra che sarebbe molto più semplice e veloce se potessi farlo come una query.

Modificare: $id è già stato forzato a essere un numero intero, quindi questa volta non è necessario alcun escape.

È stato utile?

Soluzione

Sono stato declassato per questo?

$sql = "UPDATE skills SET level = level+1 WHERE id = $id";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);

Nel caso specifico di Teifion, il DDL phpBB elenca quel particolare campo come NOT NULL, quindi non c'è pericolo di incrementare NULL.

Nel caso generale, non dovresti usare NULL per rappresentare zero.Incremento NULL Dovrebbe dare una risposta NULL.Se sei il tipo di sviluppatore fuorviato che pensa NULL=0, allontanati dalla tastiera e trova un altro passatempo, stai solo rendendo la vita difficile al resto di noi.Naturalmente questa è l'industria informatica e chi siamo noi per dire che hai torto?Se non sbagli, usa

$sql = "UPDATE skills SET level = COALESCE(level,0)+1 WHERE id = $id";

...ma diciamocelo:hai torto.Se tutti iniziano al livello 0, il tuo DDL dovrebbe includere

level INT DEFAULT '0' NOT NULL

nel caso in cui i programmatori dimentichino di impostarlo quando creano un record.Se non tutti iniziano dal livello 0, salta il DEFAULT e forza il programmatore a fornire un valore al momento della creazione.Se alcune persone sono oltre i livelli, per le quali avere un livello non ha senso, allora aggiungerne uno al loro livello non ha significato.In tal caso, eliminare NOT NULL dal DDL.

Altri suggerimenti

Da questa parte:

UPDATE skills
SET level = level + 1
WHERE id = $id

Con PDO e query preparata:

$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();

$sql = "AGGIORNA SET competenze livello = livello + 1 DOVE id = $id";

Spero solo che tu stia disinfettando adeguatamente $id altrove nel tuo codice!

prova questo

UPDATE skills SET level = level + 1 WHERE id = $id

Che ne dite di:

UPDATE skills SET level = level + 1 WHERE id = $id;

Stuoia:Questo è ciò che è emerso dalla domanda.Non è stato modificato, quindi lo attribuisco a un bug in Markdown.Ma, stranamente, l'ho notato.

Anche:SÌ, mysql_escape_string()!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top