[MYSQL/PHP]Öka/minska värde i en databas via en knapp?

Permalänk

[MYSQL/PHP]Öka/minska värde i en databas via en knapp?

Hej,

Hade tråkigt en dag när jag spelade Path of Exile och ville på ett enklare sätt hålla koll på vilka gems jag har samt hur många.
Att bara visa datan i sig verkade enkelt, så jag tryckte upp en kod lite hastigt. Första gången jag gjort något liknande, koden syns här nedan.

$result = mysql_query("SELECT * FROM str") or die(mysql_error()); echo "<table border='1'>"; echo "<tr> <th>Name</th> <th>Gem</th> <th>GemQ</th> </tr>"; while($row = mysql_fetch_array( $result )) { echo "<tr><td>"; echo $row['name']; echo "</td><td>"; echo $row['gem']; echo "</td><td>"; echo $row['gemq']; echo "</td></tr>"; } echo "</table>"; ?>

I och med att tanken var att enkelt kunna öka och minska värden i databasen också så sökte jag ett sätt att helt enkelt lägga till en + och - knapp som då ökar eller minskar värdet i databasen med 1. Har sökt runt men inte hittar något vettigt sätt att göra detta på.

I all hast så kommer jag fram till att detta kanske inte ens är bästa sättet att lösa uppgiften på, och att jag troligtvis lär behöva skriva om större delen av koden vilket kanske inte var tanken i sig men sett till hur mycket jag arbetat med MYSQL och PHP(2 dagar) så är det troligtvis lite overkill.

Visa signatur

He who holds the land, can conquer heaven.

Permalänk
Medlem

Ligger problemet i att du inte vet hur du skall utforma SQL-satsen eller hur man gör för att få en knapp att fungera? eller båda?

Permalänk
Medlem

Något sånt här?

<?php $query = "UPDATE table SET value = value + 1 WHERE id = :id LIMIT 1"; $stmt = $pdo->prepare($query); $stmt->bindParam(':value', $value); $stmt->bindParam(':id', $id); $stmt->execute(); ?>

Om du nu vill ha något med knappen, peka bara knappen till en URL som vid antingen POST eller GET kör din update statement.

Visa signatur
Permalänk
Skrivet av Thareh:

Ligger problemet i att du inte vet hur du skall utforma SQL-satsen eller hur man gör för att få en knapp att fungera? eller båda?

Skulle troligtvis säga en del av båda.
Jag vet hur man skriver för att lägga till information i databasen, dock inte hur formandet skulle se ut om man hade en knapp.
Du får gärna påpeka om det nu skulle bli för mycket.

Den tanke som uppstod när jag väl höll på skriva första inlägget var att det troligtvis är enkelt att lägga till en knapp men vad händer om man behöver 20st, 50st etc. Nu är detta dock inget som behöver tas upp utan problemet är i första hand knappen i fråga.

Visa signatur

He who holds the land, can conquer heaven.

Permalänk
Inaktiv
Skrivet av Drager:

Något sånt här?

<?php $query = "UPDATE table SET value = value + 1 WHERE id = :id LIMIT 1"; $stmt = $pdo->prepare($query); $stmt->bindParam(':value', $value); $stmt->bindParam(':id', $id); $stmt->execute(); ?>

Om du nu vill ha något med knappen, peka bara knappen till en URL som vid antingen POST eller GET kör din update statement.

bindparam för :value är väl bara förvirrande i detta sammanhang?

Permalänk
Medlem
Skrivet av anon214934:

bindparam för :value är väl bara förvirrande i detta sammanhang?

Ehm, ser faktiskt inte varför det är de.

Visa signatur
Permalänk
Inaktiv
Skrivet av Drager:

Ehm, ser faktiskt inte varför det är de.

För nybörjade då alltså. Tänkte eftersom den inte används i queryn.

Permalänk
Medlem
Skrivet av anon214934:

För nybörjade då alltså. Tänkte eftersom den inte används i queryn.

Jaha, du menar så. Ja det är iofs sant.

Visa signatur
Permalänk
Hedersmedlem

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 .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.