NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: vytváření košíku pro neregistrované uživatele

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
brickleberry
Člen
Avatar
brickleberry:31.1.2015 18:59

Ahoj. Zjistil jsem, že mi dělá neskutečný problém udělat script, který chci právě popsat... Obecně jedná se o to, že chci pomocí session která se vytvoří(nastartuje) na stránce kupted.php... a poté se zobrazí dané informace na kosiku zakaznika. Zatím je celá věc ve fázi, že když už dám objednat zobrazí se mi v košíku pouze názvy nikoliv proměnné.. např. název výrobku: a prázdné pole... Pomůže mi s tím někdo? Veškeré skripty a schema databaze dam k dispozici, ale bude nejlepší když to s někým pojedu od začátku, řekne si jaké informace potřebuje - já mu je poskytnu atp. (bylo by tu toho moc těch řádků... nejefektivnější by asi bylo to řešit přes skype ale nechci si vymrčovat.. najde se tu tedy někdo s dobrým srdcem a pomůže mi? Myslím si, že bude chyba už při ukládání session. Díky za odpovědi

 
Odpovědět
31.1.2015 18:59
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:31.1.2015 19:28

Tady na sítí je seriál kde se vytváří eshop v php od A do Z. To by ti mělo pomoct.

Nahoru Odpovědět
31.1.2015 19:28
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:31.1.2015 19:57

pošleš mi pls. odkaz? díky

 
Nahoru Odpovědět
31.1.2015 19:57
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:31.1.2015 20:14

aha, no, já jej nedělám v mvc a oop také ještě nepoužívám... mé řešení je již téměř hotové, už mi tam chybí jen ten košík pro neregistorvané (registrovaní jedou) a přidávání datum objednávek... spíš bych chtěl dodělat své řešení... :-(

 
Nahoru Odpovědět
31.1.2015 20:14
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:31.1.2015 20:34

Zkus sem dát kód který pracuje s neregistrovanými uživateli, jelikož takhle na slepo ti asi nikdo neporadí. Pokud se ti zobrazuje správně název tak chyba asi bude někde v nějaké blbůstce. :)

Nahoru Odpovědět
31.1.2015 20:34
Neaktivní uživatelský účet
Avatar

Člen
Avatar
Odpovídá na brickleberry
:31.1.2015 20:34

Jak děláš košík pro registrované?

 
Nahoru Odpovědět
31.1.2015 20:34
Avatar
brickleberry
Člen
Avatar
Odpovídá na
brickleberry:31.1.2015 20:37

ok dám sem kód... registrovaní podle id_uzvatele... což neregistrovaní nemají... mmnt napíši ty údaje

 
Nahoru Odpovědět
31.1.2015 20:37
Avatar
brickleberry
Člen
Avatar
brickleberry:31.1.2015 20:43

takže tabulka v DB vypadá takto:

id_objednavky_bez_registrace
id_produktu
nazev
jmeno
prijmeni
ulice
mesto
psc
email
telefon
cena
pocet
datum
cislo_objednavky

skript kupted takto

<?php
ob_start();
 session_start();
    session_name('kosik');
$_SESSION["kosik"][intval($_GET["id_objednavy_bez_registrace"])] = intval($_GET["pocet"]);
include ("./Connect/mysql_connect.php");
  include "funkce.php";
  if (isset($_GET["id_produktu"])) {
    $id_produktu = $_GET["id_produktu"];
    $pocet_ks_na_sklade = mysql_result(mysql_query("select * from e_produkty where id_produktu = $id_produktu"), 0, "pocet");
  }
?>
<!DOCTYPE HTML>
<html>
  <head>
    <title>Přidat objednávku</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
  <?php
    if(isset($_POST["objednavka_odeslat"])) {
      if (isset($_POST["id_produktu"])) {
        $id_produktu = $_POST["id_produktu"];
        $pocet_ks_na_sklade = mysql_result(mysql_query("select * from e_produkty where id_produktu = $id_produktu"), 0, "pocet");
      }

      $zprava="";

      if(strlen(trim($_POST["jmeno"]))>0) {
        $jmeno=htmlspecialchars($_POST['jmeno']);
        }
      else {
        $zprava .="Nevyplnil jste pole jméno <br />";
      }

      if(strlen(trim($_POST["prijmeni"]))>0) {
        $prijmeni=htmlspecialchars($_POST['prijmeni']);
      }
      else {
        $zprava .="Nevyplnil jste pole Příjmení <br />";
      }

      if(strlen(trim($_POST["ulice"]))>0) {
        $ulice=htmlspecialchars($_POST['ulice']);
      }
      else {
        $zprava .="Nevyplnil jste pole Ulice! <br />";
      }

      if(strlen(trim($_POST["mesto"]))>0) {
        $mesto=htmlspecialchars($_POST['mesto']);
      }
      else {
        $zprava .="Nevyplnil jste pole Město! <br />";
      }

      if(strlen(trim($_POST["psc"]))>0) {
        $psc=htmlspecialchars($_POST['psc']);
      }
      else {
        $zprava .="Nevyplnil jste pole PSČ! <br />";
      }

      if(strlen(trim($_POST["telefon"]))>0) {
        $telefon=htmlspecialchars($_POST['telefon']);
        }
      else {
        $zprava .="Nevyplnil jste pole Telefon! <br />";
      }

      if(strlen(trim($_POST["email"]))>0) {
        $email=htmlspecialchars($_POST['email']);
      }
      else {
        $zprava .="Nevyplnil jste pole E-mail! <br />";
      }

      if (strlen($zprava)>0) {
        echo $zprava;
      }
      else {
        $sql3 = "select * from e_produkty where id_produktu = $id_produktu";

        if ($vysledek3 = mysql_query($sql3)) {
          $nazev = mysql_result($vysledek3, 0, "nazev");
          $cena = mysql_result($vysledek3, 0, "cena");
          $jmeno = $_POST["jmeno"];
          $prijmeni = $_POST["prijmeni"];
          $ulice = $_POST["ulice"];
          $mesto = $_POST["mesto"];
          $psc = $_POST["psc"];
          $email = $_POST["email"];
          $telefon = $_POST["telefon"];
        }
        else {
          echo mysql_error();
        }

        $novy_pocet = $pocet_ks_na_sklade - 1;
        $sql = "update e_produkty set pocet = $novy_pocet where id_produktu = '".intval($_POST['id_produktu'])."'";

        if (mysql_query($sql)) {
          $sql="INSERT INTO e_objednavky_bez_registrace (nazev,pocet,cena,jmeno,prijmeni,ulice,mesto,psc,email,telefon,datum,id_produktu)VALUES('$nazev','1','$cena','$jmeno','$prijmeni','$ulice','$mesto','$psc','$email','$telefon',NOW(), '$id_produktu')";

          if (mysql_query($sql)) {
            echo "Vaše objednávka byla úspěšně odeslána!";
          }
          else {
            echo mysql_error();
          }
        }
        else {
          echo mysql_error();
        }
      }
    }
  //$message .="Vaše příjmení je: $nick <br />";
  //$message .="Váš e-mail je: $email <br />";
  //$message .="Vaše heslo je: $heslo";
  /*výpis produktů*/
  ?>
  <?php
    if ($pocet_ks_na_sklade > 0) {
      ?>
      <form action= "<?php echo $_SERVER['PHP_SELF'] ?>" method="post" name='insertForm' enctype="multipart/form-data">
        <table>
          <b>Přidání objednávky do databáze</b><br /><br />
          <?php
            /*zobrazení názvu produktu na stránce*/
            $sql2 = "SELECT id_produktu,nazev FROM e_produkty WHERE id_produktu=$id_produktu";

            if ($vysledek2 = mysql_query($sql2)) {
              while ($radek2 = mysql_fetch_array($vysledek2)) {
                echo "<br />Název Výrobku: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>$radek2[nazev]</strong></a><br />";
              }
            }
          ?>
          <br />
          Počet kusů &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>1 KS</b>
          <br /><center><i>Pozn.(Pro větší počet kusů je třeba se zaregistrovat!) <br /></center> </i> <br />
          <?php
            /*zobrazeníkategorie a ceny na stránce*/
            $sql3 = "SELECT id_produktu,nazev,pocet,cena,obrazek,popis,e_kategorie.nazev_kategorie FROM e_produkty JOIN e_kategorie ON e_produkty.id_kategorie = e_kategorie.id_kategorie WHERE id_produktu=$id_produktu";

            if ($vysledek3 = mysql_query($sql3)) {
              while ($radek3 = mysql_fetch_array($vysledek3)) {
                echo "Název kategorie: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>$radek3[nazev_kategorie]</strong></a><br /><br />";
                echo "Cena produktu: &nbsp;<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$radek3[cena]&nbsp;KČ</strong></a><br /><br />";
              }
            }
          ?>
          Jméno &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="jmeno"><br /><br />
          Příjmení &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="prijmeni"><br /><br />
          Ulice &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="ulice"><br /><br />
          Město &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="mesto"><br /><br />
          PSČ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="psc"><br /><br />
          Email &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="email"><br /><br />
          Telefon &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="telefon"><br /><br />
        </table>
        <br />
        <input type="hidden" name="id_produktu" value="<?php echo $_GET["id_produktu"] ?>">
        <input type="submit" name="objednavka_odeslat" value="Odeslat objednávku">
         <?php

  ?>
      </form>
      <?php
    }
    else {
      echo "Na skladě už nejsou žádné kusy požadovaného zboží.";
    }
  ?>
  <br /><br />
  <?php
    echo "<a href='index.php'>Zpět na hlavní stránku</a>";
  ?>
  </body>
</html>
<?php
ob_flush();
?>

skrip košíku takto

<?php
ob_start();
?>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<?php
session_start();

if(isset($_SESSION["kosik"])){
  setcookie("id_objednavky_bez_registrace_cookie", "", time()-50000,'/');
}
//session_destroy();  zakomentovano z duvodu, že pak budu chtít řešit aby po nějakém čas. intervalu se obj. z kosiku smazala
//header("Location: ../index.php");
//
         include ("./Connect/mysql_connect.php"); ;
         include "funkce.php";

            if ($_SESSION["kosik"]) {
    $result = mysql_query("SELECT * FROM e_objednavky_bez_registrace
      JOIN e_produkty ON e_objednavky_bez_registrace.id_produktu=e_produkty.id_produktu WHERE id_objednavky_bez_registrace IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
    //echo" $result";
    while ($row = mysql_fetch_assoc($result)) {
        echo htmlspecialchars($row["nazev"]) . " (" . $_SESSION["kosik"][$row["id_objednavky_bez_registrace"]] . ")<br />\n";
    }
    mysql_free_result($result);

     echo "<br /><center>





      <tr>
      <td>Výrobek:</td>
      <td><b>$row[nazev]</b></td> <br />
      </tr>
       <tr>
      <td>Datum Vaší objednávky:</td><br />
      <td><b>$row[datum_obj]</b></td> <br />
      </tr>

      <tr>
      <td>Cena objednávky:</td>
      <td><b>$row[cena_obj]&nbsp;Kč</b></td><br />
      </tr>
      <tr>
      <td>Počet objednaných kusů:</td>
      <td><b>$row[pocet_ks]</b></td><br />
      </tr></center><hr>
     ";

 }
?>
<?php
ob_flush();
?>

ve složce session mám uvedeno v souboru, který se vytvoří tyto údaje: kosik|a:1:{i:0­;i:0;}

Editováno 31.1.2015 20:44
 
Nahoru Odpovědět
31.1.2015 20:43
Avatar
brickleberry
Člen
Avatar
brickleberry:1.2.2015 13:17

nikdo mi teda nepomůže? :-(

 
Nahoru Odpovědět
1.2.2015 13:17
Avatar

Člen
Avatar
:1.2.2015 13:23

Když používáš takové zrůdné, ohromné konstrukce, zastaralé funkce a všechno cpeš do pár souborů, tak fakt nemůžeš čekat, že se tím někdo bude pročítat.

 
Nahoru Odpovědět
1.2.2015 13:23
Avatar
brickleberry
Člen
Avatar
Odpovídá na
brickleberry:1.2.2015 13:43

ano OOP ještě neumím. Nicméně i když jsem tu dal celý zdroják neznamená to, že se jím musíš celým pročítat.. soubor kosik.php má tak 5 řádků které ovlivňují konkrétní výsledek.. soubor kupted.php má těch řádků ještě méně. Takže pokud chceš aby ti to opticky lépe sedělo jsem ochoten ti to osekat. Nicméně když máš možnost celého kodu k nahlednuti najdeš chybu mnohem dříve (můj názor). Takže se ptám chceš mi pomoci nebo sis chtěl do mě jen rýpnout?

Editováno 1.2.2015 13:45
 
Nahoru Odpovědět
1.2.2015 13:43
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 14:23

Teoreticky vzato si uživatele hodíš jako GUID do COOKIE s nějakou dobou vypršení. Pak už se jen ptáš databáze na produkty, které má uživatel v košíku.

GUID = Globally unique identifier
Zkrátka unikátní klíč pro uživatele.

Nahoru Odpovědět
1.2.2015 14:23
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 14:42

díky, ale jak se to dělá? neudáš mi nějaký jednoduchý příklad?

 
Nahoru Odpovědět
1.2.2015 14:42
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 14:53

Mno, jestli to nebereš moc vážně, nemusíš vymýšlet nic složitého. Třeba si zahashuj čas a IP uživatele. To si zaregistruj jako COOKIE. Až si uživatel bude chtít přidat nějaký produkt do košíku, prostě ho přidej do tabulky jako odkaz na produkt a jako uživatele ulož právě tento unikátní klíč. Mělo by to být docela bezpečné, ale kdyžtak mě někdo okřikněte, kdybych plácal nesmysly. :)

Příklad:
Zahashovaný klíč:

beff6370efd08158600f8328520e93524e44ac56

Uživatel klikne na "Přidat do košíku". Vložíš do databáze něco jako:

`key` = "beff6370efd08158600f8328520e93524e44ac56"
`product_id` = 384

Při výpisu se zeptáš, jestli existuje produkt product_id, tedy produkt 384.

Editováno 1.2.2015 14:53
Nahoru Odpovědět
1.2.2015 14:53
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 15:05

řeknu to jedním slovem... nechápu.. zní to dobře ale vůbec se nechytám... 1 věc já předem nevím jaké bude mít uživatel key. Tímpádem jej nemohu přiřadit, když jej nevím. Pokud to nemyslíš tak, že se mám vybodnout na session a řešit to tak, že ve skriptu kupted zadám právě nějaký klíč co popisuješ a tímpádem ale bude mít tento klíč každý neregistrovaný uživatel, což zase vzniknou duplicity a košík se zobrazí všem neregistrovaným uživatelům stejný... Asi bude potřeba mi to vysvětlit od začátku jako retardovi, páč se nechytám.. :(

 
Nahoru Odpovědět
1.2.2015 15:05
Avatar
brickleberry
Člen
Avatar
brickleberry:1.2.2015 15:12

P.s. i když jse mto braz ze začátku vážně jsem už utahanej a chci to už konečně dokončit.. Nic víc. Už jen chci aby to nějak fungovalo poté se vrhnu na postupné odladění chyb a trochu bych chtěl i zlepšit kód... Takže mi nejjednodušší řešení nevadí... Poté mi chybí ještě generování čísel objednávek podle datumu objednávky, fakturace do pdf a jsem hotovej.. administrace, košík pro registrované a vše ostatní už mám... :-(

 
Nahoru Odpovědět
1.2.2015 15:12
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 15:16

Vytvoříš si prostě cookie do kterého vložíš zahashovanou IP adresu uživatelé, která bude mít podobu např.: beff6370efd08158600f83­28520e93524e44ac56

Pak už s tím pracuješ jako s registrovaným uživatelem.

$ip = $_SERVER['REMOTE_ADDR'] . time();
$value = hash('ripemd160', $ip);
setcookie("GUID", $value, time()+3600); // Nastaví cookie s názvem GUID na 1 měsíc

**GUID ** je už něco jako unikátní ID uživatelé.

Tak nějak, možná ti někdo poradí líp.

Editováno 1.2.2015 15:19
Nahoru Odpovědět
1.2.2015 15:16
Neaktivní uživatelský účet
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 15:16

Klíč má každý neregistrovaný uživatel jiný. Proto je unikátní. Vygoogluj si nějaké hashovací funkce. Tento klíč je unikátní, protože vezmeš uživatelovu IP adresu (uložená je pod $_SERVER["REMO­TE_ADDR"]) a aktuální čas (funkce time()) a obě hodnoty využiješ jako parametr právě pro tu hashovací funkci, kterou si najdeš.

Pokud použiješ například SHA1, může to vypadat takto:

$guid = hash("sha1", $_SERVER["REMOTE_ADDR"] . time() );

Kdybys stále něco nechápal, neboj se a ptej se. :) Jsme tu od toho.

Nahoru Odpovědět
1.2.2015 15:16
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 15:26

Takže jestli to chápu dobře je potřeba udělat jednu věc jako první a to že v tabulce objednavky bez registrace přidat sloupec s IP adresou? tímpádem když zákazník odešle objednávku, uloží se jeho IP + datum spojenou s IP v cookies vyvolám v košíku? pomocí

$guid = hash("sha1", $_SERVER["REMOTE_ADDR"] . time() ); ?

nebo

$ip = $_SERVER['REMOTE_ADDR'] . time();
$value = hash('ripemd160', $ip);
setcookie("GUID", $value, time()+3600); // Nastaví cookie s názvem GUID na 1 měsíc
 
Nahoru Odpovědět
1.2.2015 15:26
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 15:29

Ano, teorieticky vzato by to mělo fungovat.

Nahoru Odpovědět
1.2.2015 15:29
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 15:35

Takže potom ještě jedna věc.. IP bude v databázi normální, až pak php přemění IP na hash... Takže vlastně při odesílání objednávky stačí doppast do sql dotazu, at uloží i IP... a to je vše v té objednávce? Potom ještě opravdu poslední otázka co se stane když bude mít někdo stejnou IP (neveřejnou)..

 
Nahoru Odpovědět
1.2.2015 15:35
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 15:40

Jestli v databázi tu IP nepotřebuješ, tak ji tam neměj. Prostě tu objednávku ukládej i s klíčem:

`key` = "beff6370efd08158600f8328520e93524e44ac56"
`product_id` = 384

Dotaz:

SELECT * FROM `kosik`
WHERE
`key` = "beff6370efd08158600f8328520e93524e44ac56"

To by ti mělo vrátit ID všech produktů, co má uživatel v košíku.


Když bude mít někdo stejnou IP adresu, unikátní klíč bude jiný právě kvůli funkci time(). Aby ten klíč byl stejný, musel by být na stejné adrese a zaregistrovat COOKIE přesně ve stejný čas, což se mi zdá věru nepravděpodobné. ;)

Nahoru Odpovědět
1.2.2015 15:40
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 15:53

Ok děkuji za vysvětlení... možná jsem už fakt na to všechno hloupej, ale když si tedy nechci hrát s ip adresou a zvolil bych přístup z Vašeho posledního příspěvku, tak tedy jak začít... předpokládám že beff6370efd08158600f83­28520e93524e44ac56 je hash například, takže v kodu to teda bude vypadat jak? resp. jinak když mám

if (isset($_GET["id_produktu"])) {
    $id_produktu = $_GET["id_produktu"];
}

a mám to teda zapsat nějak takto?

if (isset($_GET["id_produktu"])) {
    $id_produktu = $_GET["id_produktu"];
}
$guid = hash("sha1" . time()+3600 ); ?

Dále nechápu

SELECT * FROM `kosik`
WHERE
`key` = "beff6370efd08158600f8328520e93524e44ac56"

Cookie může být spojeno s sql dotazem? Pokud ano tak jak mu řeknu kterej key má vzít?

 
Nahoru Odpovědět
1.2.2015 15:53
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 16:03

Vykat mi nemusíš. :)

Kód

if (isset($_GET["id_produktu"])) {
     $id_produktu = $_GET["id_produktu"];
 }

se mi jeví zbytečný. Prostě až bude chtít uživatel přidat něco do košíku, zkontroluješ si, jestli už nějaký COOKIE nemá:

if( isset( $_COOKIE["guid"] ) ) {
      // Kód
} else {
      setcookie("guid", hash("sha1", $_SERVER["REMOTE_ADDR"] . time() ) );
}

Pokud ne, nastavíš mu jej. Pokud ano, vložíš do databáze odkaz na produkt, který má být v košíku.

Např. tabulka kosik

INSERT INTO `kosik`
(`guid`, `product_id`)
VALUES
($_COOKIE["guid"], $_GET["product_id"])

Samozřejmě musíš ošetřit mysql_real_es­cape_string (do budoucna ti ale doporučím spíše PDO nebo podobnou hračičku. :), zda-li produkt existuje, atp.

Nahoru Odpovědět
1.2.2015 16:03
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 16:11

Začínám z toho být špatnej jak jsi mi těmi příklady zamotal hlavu... :-( Když se teda podívám na poslední kod co jsi napsal vyplývá mi z toho věc, že tedy musím založit tabulku košík (páč ji doteď nemám) původní řešení s reg. uživateli spočívalo v session id_uživatele a spojení tabulek produktu s kategoriemi a vypsání daného produktu s dalšími údaji do tabulky objednávek. Měl jsem za to, že když už mám z 50% košík hotovej (pro registrovaný) tak to bude hračka, ale ono to je fakt zákeřný (alespoň pro mě). Takže zpět k problemitice. Vytvořím tabulku košík, kde budou sloupce: guid a id_produktu?

Editováno 1.2.2015 16:12
 
Nahoru Odpovědět
1.2.2015 16:11
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 16:17

Bylo to řešení, které jsem vymyslel já a je dost možné, že se budeme lišit. Zkus mi napsat tvé řešení neregistrovaných uživatelů, jak si myslíš, že by to mohlo fungovat, a společně to nějak zprovozníme. :)

Nahoru Odpovědět
1.2.2015 16:17
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
brickleberry:1.2.2015 16:31

ok... takže bych měl začít od začátku... mám vybrané zboží -> kliknu na objednad. jsem na druhe strance objednad.php , kde se podmínkou a session rozhodne, zdali je zákazník přihlášen... pokud je zobrazí se mi kolik si chce objednat počet kusů zboží.. a přejde na objednavka.php. když je neregistrovaný nemá session a tímpádem zjistí skript že není přihláše a nabídne mu odkaz koupit zboží bez přihlášení.. tím se zavolá kupted.php kde vepisuje veškeré své údaje... Takže odvozuju, že budu upravovat právě kupted.php skript.. takže skript co jsem dodělal v kupted.php vypada takto

<?php
ob_start();
 session_start(); //tohle
    session_name('kosik');  //tohle
$_SESSION["kosik"][intval($_GET["id_objednavy_bez_registrace"])] = intval($_GET["pocet"]); //tohle
include ("./Connect/mysql_connect.php");
  include "funkce.php";
  if (isset($_GET["id_produktu"])) {
    $id_produktu = $_GET["id_produktu"];
    $pocet_ks_na_sklade = mysql_result(mysql_query("select * from e_produkty where id_produktu = $id_produktu"), 0, "pocet");
  }
?>

potom v kosik.php

<?php
session_start();

if(isset($_SESSION["kosik"])){
  setcookie("id_objednavky_bez_registracee_cookie", "", time()-50000,'/');
}
//session_destroy();  zakomentovano z duvodu, že pak budu chtít řešit aby po nějakém čas. inte
//header("Location: ../index.php");
//
         include ("./Connect/mysql_connect.php"); ;
         include "funkce.php";

            if ($_SESSION["kosik"]) {
    $result = mysql_query("SELECT * FROM e_objednavky_bez_registrace
      JOIN e_produkty ON e_objednavky_bez_registrace.id_produktu=e_produkty.id_produktu WHERE id_objednavky_bez_registrace IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
    //echo" $result";
    while ($row = mysql_fetch_assoc($result)) {
        echo htmlspecialchars($row["nazev"]) . " (" . $_SESSION["kosik"][$row["id_objednavky_bez_registrace"]] . ")<br />\n";
    }
    mysql_free_result($result);

     echo "<br /><center>





      <tr>
      <td>Výrobek:</td>
      <td><b>$row[nazev]</b></td> <br />
      </tr>
       <tr>
      <td>Datum Vaší objednávky:</td><br />
      <td><b>$row[datum_obj]</b></td> <br />
      </tr>

      <tr>
      <td>Cena objednávky:</td>
      <td><b>$row[cena_obj]&nbsp;Kč</b></td><br />
      </tr>
      <tr>
      <td>Počet objednaných kusů:</td>
      <td><b>$row[pocet_ks]</b></td><br />
      </tr></center><hr>
     ";

 }
?>
 
Nahoru Odpovědět
1.2.2015 16:31
Avatar
brickleberry
Člen
Avatar
brickleberry:1.2.2015 16:35

V současné době je to ve stádiu, že když dám jako neregistrovaný uživatel koupit zboží tak se mi potom v košíku neobjevují hodnoty ale jen text... a když otevřu jiný prohlížeč = jiné cookies tak mám prázdnou stránku, což je vpořádku.. skript jsem vzal a upravil odsud : http://php.vrana.cz/…ni-kosik.php

Editováno 1.2.2015 16:36
 
Nahoru Odpovědět
1.2.2015 16:35
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 16:42

Víš co? Myslím, že jestli ti v projektu zbývá už jen tato část, měl bys to utknout a začít s OOP. Děláš si špatné návyky a skoro se to nedá číst. Nedokážu si správně odvodit, co kód vlastně dělá, když v tom máš takový binec.

Jestli je to pro studijní účely, pak si můžeš říct, že jsi to dokončil. Začni se učit OOP, MVC a PDO. Tyto tři zkratky ti náramně zlepší život. :)

Pokud to děláš pro klienta - mno, asi nebude moc spokojený. Neměl by ses hrnout do tak složitých projektů s takovými znalostmi. Jestli se tím ale učíš, pak je to v pořádku. Nejvíce se toho naučíš právě na věcech, které přesahují tvé znalosti. Tyto znalosti si totiž osvojíš.

Promiň, že ti nedokážu pomoct, ale je to vážně guláš... :)

Nahoru Odpovědět
1.2.2015 16:42
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
brickleberry:1.2.2015 16:57

a kdybychom udělali ten tvůj způsob? nemusíme to udělat jak to mám nyní... ale můžem to udělat pomocí té IP a hashe...

 
Nahoru Odpovědět
1.2.2015 16:57
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 17:06

Jenom bys přimíchával olej do ohně. Navíc se nezdá, že té teorii moc rozumíš. Radím ti dobře.

Edit: kdyžtak používej tlačítko "odpovědět", ať mi přijde událost :)

Editováno 1.2.2015 17:07
Nahoru Odpovědět
1.2.2015 17:06
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:1.2.2015 17:11

Vím, že jsem s tím možná už otravnej ale nechci se jen tak vzdát... chci to dokončit, olej do ohně mi nevadí.. i když je ten kod chaotickej myslím, že 3 - 5 řádků do něj ještě vtěsnám...

 
Nahoru Odpovědět
1.2.2015 17:11
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:1.2.2015 17:52

Ono nechci ti to kazit, ale mysl_query se už docela dávno nepoužívá, jelikož je nebezpečné.
A na eshop bych ho nepoužíval určitě, SQL Injekce atd..

Takže ti doporučují to useknout i když se učíš.
A začni se učit OOP :)

Editováno 1.2.2015 17:52
Nahoru Odpovědět
1.2.2015 17:52
Neaktivní uživatelský účet
Avatar
Richard
Člen
Avatar
Odpovídá na Neaktivní uživatel
Richard:1.2.2015 19:16

Uniká mi nějaká zásadní díra v mysql_query, nebo programátoři jsou už tak rozmazlený že ani nevědí jak ošetřit data?

Ale ano, mysql_query je deprecated, nemělo by se používat, zvlášť když se člověk učí, ale že by to nějak extra vadilo, to ne.

Rady ať ten kód zahodí jsou pěkně na hovno, vzpomeňte si na svoje začátky, na svůj první projekt, jaký asi je když někdo přijde a řekne vám před koncem že je to celé blbě a ať to zahodíte. A ať zahodíte všechno co jste se naučili, protože je to k ničemu. Asi nic moc že?

Jen ať se učí na tomhle kódu, aspoň bude vědět jak to celé pracuje, amatérů co bez deseti frameworků nenapíšou ani form je tu dost.

Editováno 1.2.2015 19:17
Nahoru Odpovědět
1.2.2015 19:16
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Odpovídá na Richard
Uživatel sítě :1.2.2015 19:36

I v pdo se dá udělat sql injekce. Kvůli tomu také bylo pozdvižení kolem drupalu, který tuto chybu měl.

Na mysql je asi nejzásadnější to, že od verze 5.5.0 nebude součástí PHP. Avšak dle mého názoru, ty základy na tom projít není na škodu, když většina tutoriálů na netu ještě obsahují tento ovladač.

Jinak ohledně toho jestli jsou programátoři rozmazlení: Spíže neopatrní nebo nepoučení, zkrátka ještě neznají vše.. :/

Nahoru Odpovědět
1.2.2015 19:36
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Richard
Neaktivní uživatel:1.2.2015 19:48

Nikdo mu neřekl aby se vykašlal, ale jen doporučil, protože pak jak většina začátečníku(které znám) zjistí že to co se naučili je "na ho*no" a vykašlali se na to protože se to učili poctivě.

Lepší je začít s tím co je v dané době aktuální a ne to co bylo, s tím snad souhlasí každý.

Když už tak jsi mu mohl poradit s jeho otázkou, protože já se v tom opravdu nevyznám, i když jsem se snažil. :)

Editováno 1.2.2015 19:50
Nahoru Odpovědět
1.2.2015 19:48
Neaktivní uživatelský účet
Avatar
Odpovídá na Uživatel sítě
Neaktivní uživatel:1.2.2015 19:53

Sorry překlikl jsem se -_- chtěl jsem dát + za to php 5.5 :)

Jinak, myslím že na naučení se základu stačí projít zdejší seriály a kde se používá pdo wrapper, jeho tvorba se vysvětluje myslím že někde dál aby člověka nezamotalo PDO hned na začátku.

A myslím že je tu vše podstatné co má člověk vědět aby mohl něco napsat a popř. se jít dál učit OOP :)

Editováno 1.2.2015 19:53
Nahoru Odpovědět
1.2.2015 19:53
Neaktivní uživatelský účet
Avatar
Michal Šmahel:1.2.2015 20:01

Jen ho nechte, ať si to dopíše ve strukturovaném programování. OOP ať zkusí poté, co pochopí základy PHP a dokáže si podobnou aplikaci napsat sám. Není dobré se hned učit OOP, člověk musí nejprve pochopit základy, až poté přejít na (pokročilejší) OOP. Nevím, proč tu někteří píší, ať s tím "sekne". Místo co byste ho podporovali, aby to lépe pochopil a něčemu se přiučil, radíte mu, aby skončil. Víte jak mu musí být?? Píše jednu ze svých prvních aplikací a něco mu nejde, čeká pomoc od zkušenějších a vy ho takto odpálkujete, protože s ním nemáte dostatečné strpení. Toto je stejné jako programování, u začátečníků musíte být velice trpěliví a nesmí vás odradit to, že není jako vy, kdyby tomu tak bylo, nepotřeboval by vaši pomoc. Pokud jste takto netrpěliví i co se týče programování, nechtěl bych vás vidět při práci. Ti, kterých se to týká si určitě dají mínus, to znám :).

Editováno 1.2.2015 20:04
Nahoru Odpovědět
1.2.2015 20:01
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na brickleberry
Michal Žůrek - misaz:1.2.2015 20:23

tak to obejdi, zaregistruj ho s nějakým identifikátorem a po dokončení nákupu ho smaž.

 
Nahoru Odpovědět
1.2.2015 20:23
Avatar
Odpovídá na Michal Šmahel
Neaktivní uživatel:1.2.2015 20:36

Průhledně narážíš na nás dva který jsme se tu snažili mu pomoct, tak zkus to vysvětlit ty, možná ti to půjde líp :) A nemám důvod dávat mínus za to cos napsal.

Mám rád ty co začnou psát takové věci aniž by danému člověku poradili.

brickleberry napiš konkretně co nechápeš.

Jinak ti to zkusím znova vysvětlit jak bych to udělal:

Uživatel přijde do eshopu, ty si zjistíš IP a zaheshujes ho a dáš do cookies.

$ip = $_SERVER['REMOTE_ADDR'] . time();
$value = hash('ripemd160', $ip);
setcookie("GUID", $value);

Takže v daném případě GUID je uživatelův unikatní kód nebo nevím jak to nazvat.
Prostě je to to samé jako $_SESSION['id'] nebo nevím co používáš. :)

PS: to ripemd160 je jen typ hashování.

Editováno 1.2.2015 20:37
Nahoru Odpovědět
1.2.2015 20:36
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Uživatel sítě :1.2.2015 20:52

Né každý narazí na tyto stránky a zdejší tutoriály, pozor.

Nahoru Odpovědět
1.2.2015 20:52
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Neaktivní uživatel
Michal Šmahel:1.2.2015 21:14

Děkuji, že jsi mi nedal mínus. Na tebe ani tak nenarážím a omlouvám se, že jsem to psal v 2. osobě množného čísla, myslel jsem hlavně Neaktivní uživatel. Neudržel jsem se a musel jsem to napsat, abych "obhájil" zakladatele diskuze. Pokud jde o tebe, radíš mu dobře a máš i dobrý přístup.

Nahoru Odpovědět
1.2.2015 21:14
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na brickleberry
Michal Šmahel:1.2.2015 21:22

Hlavně měj výdrž a neboj se zeptat, když něco nechápeš. Neaktivní uživatel ti to rád vysvětlí a pomůže ti. Lidí, kteří tě odrazují si nevšímej. Nevzdávej to, já neměl také nejlepší začátky. Když to pochopíš, jde to samo a naprogramuješ, co budeš chtít. Co se týče OOP, neskákej na něj, jdi pomalu podle zdejších tutoriálů.

Nahoru Odpovědět
1.2.2015 21:22
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na Michal Šmahel
Neaktivní uživatel:1.2.2015 21:41

Zkoušel jsem mu radit asi nejdéle ze všech. Pokud ale nechápe teorii problematiky, nedokáže ani praxy. Je dobře, že se učí na reálných projektech, ale musí k tomu mít i teoretické základy. Souhlasím i s tím, že než začne s OOP, měl by si vyzkoušet i sttrukturované programování. Zároveň si ale myslím, že má dostatečné znalosti na to, aby se naučil alespoň základy slušného kódu. Myslím alespoň funkce, když už ne OOP.

Nahoru Odpovědět
1.2.2015 21:41
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Šmahel:1.2.2015 21:46

Nojo, to nechme na něm. Musíme mu pomoci s tím, co mu nejde. Jeho teoretickou zásobu bych raději nekomentoval... Někdo hold nerad čte :D.

Nahoru Odpovědět
1.2.2015 21:46
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
brickleberry
Člen
Avatar
brickleberry:4.2.2015 18:40

Popravdě díky za ohlasy je jich tu spousty. Jsem rád, že se tu najdou lidi, co se mnou mají pochopení a ochotu mi něco vysvětlit. Teď jsem konkrétně košík pro nereg. uložil k ledu a nechám jej nakonec. Co se týče struktury kódu není nejlepší, ale po dokončení mám v plánu celý kód doladit a udělat v něm několik úprav včetně ošetření chyb a zbavení již zastaralých funkcí. Kdysi mi jeden programátor řekl, že pokud se na něčem člověk zasekne delší dobu, měl by od toho upustit a dělat další kroky ve vývoji dané aplikace a poté se k danému problému s čistou hlavou vrátit. Proto jsem se dnes když mám zase trochu čas začal zabývat jinou věcí, která by měla být alespoň doufám snazší. Proto založím nové téma a k tomuto se vrátím jakmile dokončím stávající problém. Jsem moc rád za ohlasy a ochotu - vážím si jí a určitě jí ještě v tomto konkrétním tématu využiji. Nyní řeším čísla objednávek, a proto pro přehlednost založím nové téma.

 
Nahoru Odpovědět
4.2.2015 18:40
Avatar
brickleberry
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
brickleberry:4.2.2015 21:10

Takže čísla objednávek jsou vyřešena vracím se zpět tu.
to Michal Žůrek (misaz)prosím napiš mi konkrétně co jsi myslel tím "tak to obejdi, zaregistruj ho s nějakým identifikátorem a po dokončení nákupu ho smaž." Myslíš to tak, že bych měl udělat zvlášť tabulku, kde by se to ukládalo a pak hned smazalo?

to Bogdan Dovgopol ano používám $_SESSION['id'] . U mě je si nejspíš myslím problém v tom, že nikde nevidím vlastně celé(resp. komplexní) řešení této věci.. tímpádem i když mi napíšeš

$ip = $_SERVER['REMOTE_ADDR'] . time();
$value = hash('ripemd160', $ip);
setcookie("GUID", $value);

usuzuji, že tohle by mělo být v upravené formě na úvodní stránce košíku, kde se již jen porovnávají hodnoty. Nicméně jedná se o to, že hlavně nevím jakým způsobem ověřit, že se mi údaje uložily správně do cookies. (V databázi to vidím hned ale Cookies nikoliv). Proto logicky když nevím tuto skutečnost nemohu vědět, zda-li se vše uloží správně, potom to jde s tím, že když se to neuloží správně a já nevím jak to zjistit pak mi další fáze skriptu nebude fungovat protože nebude mít správné hodnoty či je nebude mít vůbec. Abych to nějak osvětlil COOKIES zatím znám spíše teoreticky (když nepočítam session, která s nimi taky pracuje). Kdysi jsem dělal v cookies skript na zapamatování si údajů o přihlášení, dalo by se to někak využít i v tomto případě?

 
Nahoru Odpovědět
4.2.2015 21:10
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:4.2.2015 21:17

Jop, je to vlastně skoro totéž.

Tám si do cookies uložíš email(nebo co chceš), tady zase uložíš info o položce kterou si vybral(nebo jen název - to už je na tobě)

Do cookies se ukládá takto:

$name = 'Nazev produktu'; // Název produktu
$price = 100; //Cena produktu
setcookie("ITEM_N", $name);
setcookie("ITEM_P", $price); //ITEM_N, ITEM_P jsou vlastně názvy těch cookie, takže s nimi vlastně pak pracuješ

PS: Nevím jestli to je potřeba hashovát, jelikož se podle mě nejedná o citlivá data, i když si nejsem jistý :D

Editováno 4.2.2015 21:19
Nahoru Odpovědět
4.2.2015 21:17
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:4.2.2015 21:30

Ok, takže to co jsem psal předtím je uložení a toto je tedy zobrazení, chápu to dobře? A je nějaký způsob jak zjistit dané hodnoty jestli se právně uložili ze souboru? Na serveru ma složku sessions, kde se mi ukládají soubory pod nějakým názvem.. třeba sess_59aface45750016b9­564b143037de180 uvnitř jsou určité hodnoty . Je tohle také cookie nebo je to session + cookie?

 
Nahoru Odpovědět
4.2.2015 21:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 56.