SQL för att öka `gemq` med 1 i tabellen `str` för ett visst `$name`:
UPDATE str SET gemq=gemq+1 WHERE name=$name;
där `$name` kommer från t ex ett formulär. Du bör se till att den formulärdata du får inte innehåller "dumheter" genom t ex `mysql_real_escape_string()`, eller än hellre genom att använda "prepared statements" via t ex `mysqli`/`pdo` istf `mysql`-biblioteket som du använder nu. Se den stora varningen på t ex `mysql_real_escape_string()`-sidan som behandlar detta.
Du behöver alltså funktioner för att skicka dessa variabler (fältnamn som ska uppdateras; om det ska ökas eller minskas). Då det är aktioner som förändrar tillståndet i din databas (till skillnad från ren datahämtning) så bör detta bör ske genom POST-data från ett formulär, som du sedan behandlar i din PHP-kod. Föreslår att helt enkelt lägga till en extra tabellkolumn i din utskrift där du genererar ±-knappar för respektive föremål. Alternativt använda `<input type="number">` som är nytt i HTML5, men det är inte alla webbläsare (*host* Firefox *host*) som hanterar det väl än. Det finns Javascriptlösningar för att kompensera detta, men då börjar det kanske bli lite väl komplext.
Vad gäller koden du redan har så kan jag visa några enkla tekniker för att göra den mer läsbar (man läser kod fler gånger än den skrivs, så det är värdefullt att den är överskådlig):
<?php
// Någonstans hög(s)t upp i filen.
function h($s) {return htmlspecialchars($s);}
// …tillsammans med andra funktionsdeklarationer, databaskopplingar,
// formulärhantering etc., innan HTML-koden börjar.
?>
<!DOCTYPE html>
<meta charset="utf-8">
<title>Min fina sida</title>
<!-- …och resten av HTML-koden ner till tabellen… -->
<table border>
<tr>
<th>Name
<th>Gem
<th>GemQ
<?php
$result = mysql_query('SELECT * FROM str') or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
?>
<tr>
<td><?=h($row['name'])?>
<td><?=h($row['gem'])?>
<td><?=h($row['gemq'])?>
<?php
}
?>
</table>
där `htmlspecialchars()` används på all output från databasen för att undvika problem med oväntade tecken (bör alltid göras som reflex; eventuellt undantag om man på annat sätt är säker på att det handlar om ett heltal el dyl). Dock märker man att `htmlspecialchars()` inte det smidigaste funktionsnamnet ur läsbarhetssynpunkt, så ett vanligt "trick" är att definiera kortare alias för outputfunktioner som används ofta; i detta fall `h()`. Ytterligare exempel för SQL-variabler om man använder det gamla `mysql`-biblioteket:
function m($s) {return "'".mysql_real_escape_string($s)."'"; }
`$name` skulle då alltså ersättas av `m($name)` i mitt SQL-exempel tidigare, men som sagt — använd hellre de nya databasbiblioteken så som PHP-varningen sa.
Jag använde `mysql_fetch_assoc()` istf `mysql_fetch_array()` då du ändå inte använder numeriska index. Minimal skillnad, men att veta vad man använder och varför har ofta ett egenväde i sig.
`<?=h($row['name'])?>` betyder `<?php echo h($row['name']); ?>`. Tidigare var denna syntax inte rekommenderad då den krävde `short_open_tag = On` i PHP:s konfiguration, vilket medförde andra saker, men sedan PHP 5.4 är detta en fundamental del av språket oavsett inställningar. Eftersom konstruktionen förbättrar läsbarheten och tydligt markerar användandet av PHP som just ett "templatespråk" skulle jag säga att den numera borde föredras där den är applicerbar. Det senare argumentet är också en anledning till att det är bättre att "hoppa" mellan HTML- och PHP-läge istf att mata `echo()`-rader.
Vissa gillar att låta PHP- och HTML-styckenas indentering sammanfalla, så att man skriver t ex:
<table border>
<tr>
<th>Name
<?php
$result = mysql_query('SELECT * FROM str') or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
?>
<tr>
<td><?=h($row['name'])?>
<?php
}
?>
</table>
men jag tycker ofta det blir rörigare (åtminstone om man använder en "riktig" editor med färguppmärkning), och jag uppskattar ofta att indenteringen är konsekvent i den HTML-kod som skickas till klienten för felsöknings skull.
Jag har medvetet snålat med sluttaggar i HTML-koden, men det är helt OK (om det handlar om just HTML; jag skrev om det på forumet här). Jag tycker även det har fördelar, men stör det för mycket så kan de läggas till .