Avatar billede TiHs Nybegynder
06. maj 2007 - 21:21 Der er 15 kommentarer og
1 løsning

sql query før action hvordan ?

Hej Eksperter

Har følgende tabel:

CREATE TABLE `toej2` (
  `id` int(6) unsigned NOT NULL auto_increment,
  `del` varchar(100) NOT NULL default '',
  `pic` text NOT NULL,
  `maerke` varchar(100) NOT NULL default '',
  `model` text NOT NULL,
  `beskr` text NOT NULL,
  `str` text NOT NULL,
  `pris` decimal(18,2) NOT NULL default '0.00',
  `antal` decimal(10,0) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;


Jeg vil før nedenstående action 'add' gerne tjekke
min tabel og kun udføre add HVIS jeg kan tjekke
antal i min tabel ud fra det id jeg kommer med til
siden. Antal skal så være > 0.

Her er min side med action:

<?php
// Include MySQL class
require_once('inc/mysql.class.php');
// Include database connection
require_once('inc/global.inc.php');
// Include functions
require_once('inc/functions.inc.php');
// Start the session
session_start();
// Process actions
$cart = $_SESSION['cart'];
$action = $_GET['action'];
switch ($action) {

/* vil kun udføre case 'add' hvis query større end nul */

    case 'add':
        if ($cart) {
            $cart .= ','.$_GET['id'];
        } else {
            $cart = $_GET['id'];
        }
        break;

/* så koden skal vel ind i ovenstående et sted ? */

    case 'delete':
        if ($cart) {
            $items = explode(',',$cart);
            $newcart = '';
            foreach ($items as $item) {
                if ($_GET['id'] != $item) {
                    if ($newcart != '') {
                        $newcart .= ','.$item;
                    } else {
                        $newcart = $item;
                    }
                }
            }
            $cart = $newcart;
        }
        break;
    case 'update':
    if ($cart) {
        $newcart = '';
        foreach ($_POST as $key=>$value) {
            if (stristr($key,'qty')) {
                $id = str_replace('qty','',$key);
                $items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart);
                $newcart = '';
                foreach ($items as $item) {
                    if ($id != $item) {
                        if ($newcart != '') {
                            $newcart .= ','.$item;
                        } else {
                            $newcart = $item;
                        }
                    }
                }
                for ($i=1;$i<=$value;$i++) {
                    if ($newcart != '') {
                        $newcart .= ','.$id;
                    } else {
                        $newcart = $id;
                    }
                }
            }
        }
    }
    $cart = $newcart;
    break;
}
$_SESSION['cart'] = $cart;
header("location:" . $_SERVER['HTTP_REFERER']);
?>

hvordan skriver jeg min sql query så ?
Avatar billede jakobdo Ekspert
06. maj 2007 - 21:40 #1
Det må vel være noget i denne stil:

case 'add':
    if(is_numeric($_GET['id'])) //Er ID et nummer?
    {
        $id = intval($_GET['id']);
        $query = mysql_query("SELECT id FROM toej2 WHERE antal > 0 WHERE id = $id LIMIT 1");
        if(mysql_num_rows($query)==1) //Fandt vi varen og er der nogle på lager?
        {
            if ($cart) {
                $cart .= ','.$_GET['id'];
            } else {
                $cart = $_GET['id'];
            }
        }
    }
    break;
Avatar billede TiHs Nybegynder
06. maj 2007 - 22:35 #2
ID vælger jeg selv at sætte ind ja som varenummer.
Den side jeg kommer fra har allerede valgt et bestemt id. Dette id
refererer så til den linie i tabellen hvor jeg vil tjekke at
denne linies antal er > 0 ... så hvis det du skrev er det den gør, så
vil jeg da lige prøve det ....syntes bare du validerer på id samtidig ?
Avatar billede jakobdo Ekspert
07. maj 2007 - 07:56 #3
Ja, jeg tjekker om ID er et nummer inden jeg smider i det ind i databasen.
Ellers kunne din sql udsættes for SQL INJECTIONS.
http://en.wikipedia.org/wiki/SQL_injection
Avatar billede TiHs Nybegynder
08. maj 2007 - 22:49 #4
Får følgende fejl:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /customers/timhs.dk/timhs.dk/httpd.www/cart/cart.php on line 19

Warning: Cannot modify header information - headers already sent by (output started at /customers/timhs.dk/timhs.dk/httpd.www/cart/cart.php:19) in /customers/timhs.dk/timhs.dk/httpd.www/cart/cart.php on line 76
Avatar billede TiHs Nybegynder
08. maj 2007 - 22:51 #5
Måske det ville være nemmere at gøre i selve forretningen hvor jeg henter de forskellige varer. Så skal den jo ikke tjekke i case add men bare tjekke
i funktionen:

$sql = 'SELECT * FROM toej2 WHERE del = "Jeans" ORDER BY id';
$result = $db->query($sql);
while ($row = $result->fetch()) {

/* men igen ... hvordan ? .. for at indsætte WHERE antal > 0 ORDER BY id vil den ikke bare tage ....
Avatar billede jakobdo Ekspert
09. maj 2007 - 08:11 #6
Det er nu en god ide at gøre det når en bruger tilføjer varen.
Avatar billede michael_stim Ekspert
09. maj 2007 - 08:18 #7
I Jakobs sql er der lige en smutter:
$query = mysql_query("SELECT id FROM toej2 WHERE antal > 0 WHERE id = $id LIMIT 1");
Skal väre:
$query = mysql_query("SELECT id FROM toej2 WHERE antal > 0 AND id = ". $id ." LIMIT 1");
Avatar billede TiHs Nybegynder
09. maj 2007 - 11:47 #8
Jeps ... nu smider den ikke varen i kurven hvis ikke der er antal
større end nul... :o))

takker til jer begge.

Vender nok tilbage for jeg skal sidde og leget lidt med hvordan jeg gør det
når man vil tjekke ud og accepterer bestillingen så jeg nedskriver antal
i tabellen ud for de valgte varer ....
Avatar billede michael_stim Ekspert
09. maj 2007 - 11:52 #9
Når han acceptere laver du bare en sql der minusser.

UPDATE tabel SET antal=antal-".$denVariabelDuHar." WHERE id=".$id."
Avatar billede jakobdo Ekspert
09. maj 2007 - 12:47 #10
Så bliver tjekket lidt overflødigt!

Lad os forestille følgende scenario.
Vare1 - antal = 1.
Kunde1 - tilføj Vare1 (er der en vare på lager? Ja, tilføj kurv)
Kunde2 - tilføj Vare1 (er der en vare på lager? Ja, tilføj kurv)

De begge kan tilføje produktet, men kun 1 for så lov at acceptere.
Avatar billede TiHs Nybegynder
09. maj 2007 - 13:45 #11
jabobdo ... vil det ikke kun ske i lige det øjeblik hvor man er så
uheldig at der er to kunder der handler på helt præcist samme tid ?
Avatar billede TiHs Nybegynder
11. maj 2007 - 14:48 #12
Hey ... er i her ?

Min cart.php tjekker nu fint med lager osv ... og jeg har sat
den til at sige "-1" hvis man tilføjer ...
Hvis jeg så deleter en var, hvordan sætter jeg den så til det ?
.. ja altså hvor i case delete sætter jeg linien ind ??

switch ($action) {
    case 'add':
    if(is_numeric($_GET['id'])) //Er ID et nummer?
    {
        $id = intval($_GET['id']);
        $query = mysql_query("SELECT id FROM toej2 WHERE lager > 0 AND id = ".$id." LIMIT 1");
        if(mysql_num_rows($query)==0) //Fandt vi varen og der er ingen på lager?
        {
    header( "location: ../minusvare.php" );
exit;
}else{
            if ($cart) {
                $cart .= ','.$_GET['id'];
            } else {
                $cart = $_GET['id'];
            }
        }
    }
$query = mysql_query("UPDATE toej2 SET lager = lager-1 WHERE id = ".$id."");

        break;
    case 'delete':
        if ($cart) {
            $items = explode(',',$cart);
            $newcart = '';
            foreach ($items as $item) {
                if ($_GET['id'] != $item) {
                    if ($newcart != '') {
                        $newcart .= ','.$item;
                    } else {
                        $newcart = $item;
                    }
                }
            }
            $cart = $newcart;
        }
        break;


Og kan jeg på en eller anden måde på siderne der kører denne sæsion sige
at hvis man bryder sæssionen så skal den også smide "+1" tilbage
i lager igen på de id'er man har i sin kurv ?
Avatar billede jakobdo Ekspert
13. maj 2007 - 19:01 #13
Du skal lave din sql update inde i FOREACH()
Avatar billede TiHs Nybegynder
06. oktober 2008 - 16:51 #14
send svar så jeg kan lukke denne :o))
Avatar billede jakobdo Ekspert
06. oktober 2008 - 17:15 #15
Svar!
Avatar billede jakobdo Ekspert
08. oktober 2008 - 06:15 #16
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester