[PHP/mysql] hjälp med några rader kod *solved*

Permalänk
Medlem

[PHP/mysql] hjälp med några rader kod *solved*

Hej alla SWECare, har suttit i massor av timmar här och klinkat och klonkat, lyckats skrapa ihop hela 42 rader kod, nu har jag bara en liten bit kvar men jag vet inte hur jag ska göra.

Vad syftet med koden är:
"Säljtävling", så alltså du har en lista med ett gäng namn (säljare) och sedan ett fält du ska fylla i med hur mycket du har sålt.
Så låt oss säga att "Marcus" säljer för 100kr och sedan för 200kr då har han sålt för 300kr totalt. Och det är det som är poängen med hela koden.

Jag har lyckats att man väljer säljare och skriver vad man har sålt för, men jag har inte lyckats med den matematiska uträkningen, och jag vänder mig nu till er på SWEC.

Jag vill poängtera att jag kan nästan inget om php och mysql så det jag lyckats skrapa ihop är det jag har fått lära mig idag genom att googla mig fram.
Jag visste inte att man inte bör mixa språk när man skriver variabler, sorry =(

koden finns för nedladdning här: https://www.dropbox.com/s/hlbvl8c50xf64l8/sales.rar (lol)

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Medlem

<?php $cc = mysql_connect("localhost","",""); if (!$cc) { die('Could not connect: ' . mysql_error()); } mysql_select_db("sales", $cc); $query = mysql_query("SELECT summa FROM sales") or die(mysql_error()); if (mysql_num_rows($query)) { while ($text = mysql_fetch_assoc($query)) { echo $text['summa']; echo '<br>'; } } if (isset($_GET["insert"])) { $user = $_POST['user']; $summa = $_POST['summa']; $oldsumma = mysql_fetch_assoc(mysql_query("SELECT summa FROM sales WHERE user='$user'"))[0]; $newsumma = oldsumma + summa; $sql="UPDATE sales SET summa='$newsumma' WHERE user='$user'"; if(isset($_GET["insert"])) { header('location:index2.php'); } mysql_query($sql) or die(mysql_error()); }; ?> <html> <body> <form action="?insert" method="post"> <select name="user"> <option value="Marcus E">Marcus</option> <option value="Daniel J">Daniel</option> </select> <input type="text" name="summa"> <input type="submit"> </form> </body> </html>

Det bör fungera i teorin, har inte provat det.

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Medlem

Jo visst kan den över fungera men istället för att göra en extra databasförfrågan så kör denna kod istället.

$sql = "UPDATE sales SET summa = summa + $summa WHERE user = $user";

Nu kanske du inte kommer hålla på med mysql och php så mycket men jag vill ändå påpeka att mysql_* funktionerna kommer att försvinna inom en snar framtid så om du vill att denna sida ska fungera om några år också så skulle jag rekommendera att använda mysqli eller PDO.

Permalänk
Medlem
Skrivet av Haptic:

Det bör fungera i teorin, har inte provat det.

Tyvärr inte, samma som förut, det ersätter det gamla värdet bara.
Kanske man ska använda någon global variabel eller någon annan funktion ? :S

Skrivet av hamre:

Jo visst kan den över fungera men istället för att göra en extra databasförfrågan så kör denna kod istället.

$sql = "UPDATE sales SET summa = summa + $newsumma WHERE user = $user";

Nu kanske du inte kommer hålla på med mysql och php så mycket men jag vill ändå påpeka att mysql_* funktionerna kommer att försvinna inom en snar framtid så om du vill att denna sida ska fungera om några år också så skulle jag rekommendera att använda mysqli eller PDO.

Nu fungerar inte koden alls

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Hedersmedlem

Smidigare vore att lagra varje försäljning i databasen som en egen rad, i t ex tabellen `sales` med fält:

  • id — ett unikt ID för varje försäljning som har "auto increment" och är satt som "primary".

  • seller_id — lagrar t ex 1 för Marcus och 2 för Daniel — vilket nummer som gäller för respektive säljare definieras i tabellen som nämns alldeles strax .

  • amount — vad denna försäljningspost gått på.

  • time — sätt default som "current_timestamp" så sköter detta fält sig själv, och lagrar bara när transaktionen lagts in. Bra för felsökning och framtida funktionalitet.

Sedan har du en annan tabell som heter t ex `sellers` med fält:

  • id — "auto increment", "primary" — ett unikt autogenererat ID för varje person.

  • name — säljarens namn, t ex Marcus eller Daniel (troligen bäst definierat som "unique").

Varje gång en försäljning registreras så lägger du till en rad i `sales` med motsvarande försäljar-ID och summa. När du sedan vill ha ut vad t ex Markus med `id` 1 sålt för så kan du köra `SELECT sum(amount) FROM sales WHERE id=1`, så får du direkt summan. Du kan enkelt loopa över befintliga säljare, t ex för utskrift i din <select>-sats, genom att bara loopa genom `sellers`, och du kan dynamiskt lägga till fler genom att bara addera en rad i databasen. Du kanske vill lägga till olika försäljargrupper, vill ha kontaktinfo lagrad, etc., vilket också blir lätt.

Det var väldigt översiktligt, men det är en grund till att använda en relationsdatabas som en faktisk relationsdatabas. Så som du gör nu så skulle du lika gärna kunna använda en textfil, eller kanske ännu enklare: penna och papper. Ovanstående ser till en början kanske ut som mer jobb, men det kommer vara så pass mer strukturerat att du kommer tjäna på det varje gång du vill göra något det minsta utanför att bara se en summa. Att enbart spara en kumulativ summa som nu gör ju att det inte går att se t ex försäljningshistorik, eller oavsiktliga/avsiktliga "dubbeltryck", osv.

Visa signatur

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

Permalänk
Medlem

Håller med phz blir klart enklare.
Glöm inte datum i databasen så du kan köra månadstävlingar med.
Sen kan du göra enkla uträkningar från mysql eller i php

Permalänk
Medlem
Skrivet av phz:

Smidigare vore att lagra varje försäljning i databasen som en egen rad.

Ja du ser, när man kan är det ju enklare, det låter betydligt mycket bättre.

Tack för tipset! phz !

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Medlem

Frågan är bara, hur kopplar jag samman seller_id i sales och ID i sellers ?

EDIT: googlade http://stackoverflow.com/questions/2554903/how-to-create-a-re...

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Medlem

Sådär! Nu funkar det, ifall någon vill ha koden (lol) så lägger jag en länk i första inlägget.

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Medlem

Rekommenderar att du byter till PDO med prepared statements istället för mysql_(för att förhindra SQL-injections) och filtrerar all användarinput (för att förhindra XSS-attacker). Att basera SQL-frågor på användarinput, och att skriva ut ofiltrerad användarinput är aldrig bra.

http://www.acunetix.com/websitesecurity/sql-injection/
http://www.sitepoint.com/php-security-cross-site-scripting-at...

Permalänk
Medlem
Skrivet av Findah:

Rekommenderar att du byter till PDO med prepared statements istället för mysql_(för att förhindra SQL-injections) och filtrerar all användarinput (för att förhindra XSS-attacker). Att basera SQL-frågor på användarinput, och att skriva ut ofiltrerad användarinput är aldrig bra.

http://www.acunetix.com/websitesecurity/sql-injection/
http://www.sitepoint.com/php-security-cross-site-scripting-at...

Kan tillägga att mysql_* är deprecated (Vet inte det svenska ordet) från och med PHP 5.5.0 och kommer försvinna helt och hållet från PHP senare.
Ännu ett skäl till att byta upp sig till åtminstone MySQLi eller PDO som du rekommenderar.

Permalänk
Medlem
Skrivet av Findah:

Rekommenderar att du byter till PDO med prepared statements istället för mysql_(för att förhindra SQL-injections) och filtrerar all användarinput (för att förhindra XSS-attacker). Att basera SQL-frågor på användarinput, och att skriva ut ofiltrerad användarinput är aldrig bra.

http://www.acunetix.com/websitesecurity/sql-injection/
http://www.sitepoint.com/php-security-cross-site-scripting-at...

Skrivet av BuruZ:

Kan tillägga att mysql_* är deprecated (Vet inte det svenska ordet) från och med PHP 5.5.0 och kommer försvinna helt och hållet från PHP senare.
Ännu ett skäl till att byta upp sig till åtminstone MySQLi eller PDO som du rekommenderar.

Jo jag har fått höra att mysql är förlegat.. Jag programmerar inte dagligen, inte ens årligen med php/mysql så jag höll mig till det jag känner till. Detta skall för övrigt användas lokalt på jobbet. SQL injections är inget hot.
Tack för hjälpen iaf.

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!