2008-08-08 23 views
18

Jak włączyć następujące 2 pytania w kwerendzie 1dodać 1 do pola

$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); 

używam go w mod phpBB ale sedno jest to, że łapię poziom, dodasz do niego potem aktualizacja, wydaje się, że byłoby znacznie łatwiej i szybciej, gdybym mógł to zrobić jako jedno zapytanie.

Edycja: $id została już zmuszona do bycia liczbą całkowitą, więc tym razem nie jest konieczne uciekanie.

Odpowiedz

29

Dostaję z tego powodu?

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

W konkretnym przypadku Teifion, tym phpBB DDL wymienia zwłaszcza że pole jako NOT NULL, więc nie ma niebezpieczeństwa zwiększając NULL.

W ogólnym przypadku nie należy używać wartości NULL do reprezentowania zera. Inkrementacja NULL powinna być równa dać odpowiedź NULL. Jeśli jesteś zagubionym programistą, który myśli, że NULL = 0, odejdź od klawiatury i znajdź inną rozrywkę, po prostu utrudniasz życie dla nas. Oczywiście, to jest przemysł komputerowy i kogo mamy powiedzieć, że się mylisz? Jeśli się nie mylisz, użyj

... ale spójrzmy prawdzie w oczy: jesteś w błędzie. Jeżeli każdy zaczyna się na poziomie 0, wówczas DDL powinna zawierać

level INT DEFAULT '0' NOT NULL 

w przypadku programiści zapomnij ustawić go podczas tworzenia rekordu. Jeśli nie wszyscy zaczną na poziomie 0, pomińcie DEFAULT i zmuś programistę do podania wartości w trakcie tworzenia. Jeśli niektórzy ludzie są poza poziomami, dla których posiadanie poziomu jest rzeczą bez znaczenia, to dodanie jednego do ich poziomu również nie ma znaczenia. W takim przypadku upuść NOT NULL z DDL.

+1

Mam problem gdzie jeśli „poziom” jest nieważna, nie będzie przyrostu. – MaurerPower

2

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

Mam tylko nadzieję, że prawidłowo odkażasz $ id gdzie indziej w swoim kodzie!

+0

zwłaszcza bez cytatów, ktoś nawet nie musi uciec od ostatniego cytatu z SQL Injection $ id = "'null' OR DELETE FROM skills;"; ha ha –

1

spróbować tej

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

ten sposób:

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

Jak o:

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

Mat: To co wklejony z pytaniem. Nie został on edytowany, więc przypisuję to do błędu w Markdown. Ale, o dziwo, zauważyłem.

Także: tak, mysql_escape_string()!

5

z PDO i przygotowane zapytanie:

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