Hjälp mig och tjäna ihop en slant?

Permalänk
Medlem

Hjälp mig och tjäna ihop en slant?

Tja alla där ute.
Så här är det. Jag har hållit på och kodat ihop en liten sida där man ska kunna boka biljetter typ (All kod är inte min egen skall tilläggas). Detta är i utbildningssyfte dvs för att lära mig mer om PHP. Men nu har jag stött på problem som jag inte vet hur jag ska lösa.

Grejen är att om låt säga Kalle klickar på köp 1 biljett till Matrix och så kommer Lasse 2 sekunder efter och klickar också på köp biljett till Matrix men det endast finns 1 biljett kvar dvs Lasse skall inte kunna köpa biljetten då Kalle redan har klickat på Köp knappen.

Jag har förstått att eftersom man inte har någon transaktion kan användaren inte garanteras att två användare vid samma tidpunkt köper samma vara och balansen blir 0 biljetter. Emellertid exekveras scriptet och när den kontrollerar att biljett statusen ligger på +1 fortsätter den vidare

Jag har hållit på i flera dagar och laborerat med detta men inte kunnat få ihop fungerande kod. Därför tar jag hjälp av er experter på detta forum där jag lärt mig mycket.

JAG ÄR TILL OCH MED BEREDD ATT BETALA PENGAR TILL DEN SOM KAN LÖSA DETTA PROBLEM ÅT MIG.

Adressen till sidan: http://www.sanevo.se/cart/index.html

Adressen till koden: www.sanevo.se/kod.zip

Jag tror att problemet ligger i denna funktion.

function add_item_to_cart($id,$quantity) $sel_products = mysql_query("SELECT * FROM $mysql_tablename WHERE id=".$id.""); $item = mysql_fetch_array($sel_products); // returns the number of rows in a result, if 1 item exists if 0 item doesn't exists. $num_rows = mysql_num_rows($sel_products); // if item exists then add item to cart /* ..and verify if we have enough items to sell according to the quantity requested s*/ if ($num_rows >= 1 AND $quantity <= $item["stock"]) { $sessionID = $_SESSION['cartID'];

Permalänk

Lösningen är att i sql-satsen som minskar antalet tillgängliga biljetter det 1 också kolla att det går, sen kollar du på returvärdet om det lyckades.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sebastianj
Lösningen är att i sql-satsen som minskar antalet tillgängliga biljetter det 1 också kolla att det går, sen kollar du på returvärdet om det lyckades.

Har du nån kod exempel tack, som sagt funkar det ska du ha betalt, lovar

Permalänk

Följande kod borde fungera

BEGIN; SELECT biljettantal > 0 FROM biljetttabell WHERE id=biljettID; UPDATE biljetttabell SET biljettantal=biljettantal-1 WHERE id=biljettID AND biljettantal > 0; COMMIT;

Returnerar 1 om det fanns biljetter kvar, 0 annars.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sebastianj
Följande kod borde fungera

BEGIN; SELECT biljettantal > 0 FROM biljetttabell WHERE id=biljettID; UPDATE biljetttabell SET biljettantal=biljettantal-1 WHERE id=biljettID AND biljettantal > 0; COMMIT;

Returnerar 1 om det fanns biljetter kvar, 0 annars.

Tja ursäkta att jag är PAIN men ska jag bädda in det som du skrev som en SQL sats eller? Vart ska den ligga i funktionen vore mycket enkalre om du kunde bädda in den i funktionen för att visa hur det ska vara.. Tack så mycket.

Permalänk

Ja, den läggs i phpkoden som en sträng som skickas som sql. Har tyvär inte mysql installerat så kan inte prova nu, får se om jagorkar installera mysql senare.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sebastianj
Ja, den läggs i phpkoden som en sträng som skickas som sql. Har tyvär inte mysql installerat så kan inte prova nu, får se om jagorkar installera mysql senare.

Skulle vara fett schysst alltså, hoppas du orkar, jag kollar imorgon tråden igen, tack på förhand, skönt med schysst folk på forumet.

Permalänk
Medlem

Här får du lite kod som du kan prova med. Har inte testat den än men även om den inte fungerar får du kanske lite nya ideer. Sen låter det som du vill kolla närmare på "Transcations". Har för mig de behandlar problemet med att två användare inte ska kunna läsa från samma fält samtidigt. Här är en länk, sök på mysql +transcations på google för mera. http://www.databasejournal.com/features/mysql/article.php/338...

function add_item_to_cart($id, $quantity){ $sel_products = mysql_query("SELECT id, product, price, stock FROM phpcart_products WHERE id=".$id." LIMIT 1"); list($id, $product, $price, $stock) = mysql_fetch_row($sel_products); $num_rows = mysql_num_rows($sel_products); if($num_rows <= 0){ print "Ogiltig produkt"; return; } else if($quantity - $stock <= 0){ print "Inte tillräcklig med biljetter"; return; } else{ mysql_query("UPDATE phpcart_products SET stock = stock - $quantity WHERE id=".$id."); $sessionID = $_SESSION['cartID']; ... } }

Permalänk
Medlem

Nu har jag inte kollat närmare på detta men.. Vore inte det enklaste vara att reservera biljetten för han som först klickar på att köpa den (hans session) och sedan släppa reservationen efter en viss tid/när sessionen går ut?

Visa signatur

MVH Adam
Kulturstrategisk aggregator

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av kernel
Nu har jag inte kollat närmare på detta men.. Vore inte det enklaste vara att reservera biljetten för han som först klickar på att köpa den (hans session) och sedan släppa reservationen efter en viss tid/när sessionen går ut?

Det kanske är enkelt, men det är inte helt säkert.

Om man använder en SELECT-sats för att kolla om det finns biljetter kvar och sedan en UPDATE-sats för att uppdatera antal/reservera biljetter (så som exemplen i den här tråden föreslår) så kommer du att ha en race condition.

Antag att antal tillgängliga biljetter är 1. Det är då möjligt att följande situation inträffar om två användare försöker boka biljett samtidigt:

[list="1"][*]SELECT-satsen körs för användare 1. Antalet biljetter är > 0, så han får boka biljetter.
[*]SELECT-satsen körs för användare 2. Antalet biljetter är > 0, så han får också boka biljetter.
[*]UPDATE-satsen körs för användare 1. Antalet biljetter är nu 0.
[*]UPDATE-satsen körs för användare 2. Antalet biljetter sätts till 0 igen, men två biljetter har sålts så det verkliga antalet är -1.[/list=1]

Man måste använda sig av transaktioner eller post-/tabellåsning för att undvika detta scenario.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Inaktiv

En bra artikel på mysql.com om hur transactions fungerar

http://dev.mysql.com/books/mysqlpress/mysql-tutorial/ch10.htm...

En transaction kör alla frågor som en eller ingen.