Autor Zpráva
lamič
Profil
Ahoj, řeším teď vcelku pro mě náročnou věc. Vytvořil jsem jednoduchý e-shop kde není problém u registrovaných uživatelů vložit požadované zboží do košíku (dělal jsem pomocí session a id uživatele) nyní ovšem když chci aby si mohl zboží koupit i neregistrovaný uživatel jsem narazil na problém, že již session nemohu použít, protože nebudu znát id a vlastně nic o co bych se mohl opřít. Logicky mě napadá, že by to mělo jít pomocí cookies jenže nevím moc jak s tím začít. Jde mi o to, aby se zboží zobrazilo v košíku toho, který si jej objednal a třeba po zavření prohlížeče nebo po uplynutí časového intervalu se zboží třeba vyprázdní. Vkládání do databáze a ostatní věci v administraci mi fungují, jedná se pouze o to zobrazení dat v košíku [Strukrura tabulky: 1tab. pro reg. 2 pro nereg. uživatele]. Helfne mi někdo? Stačí mi zatím návrh postupu jak bych jej znal a něco nefungovalo v jeho realizaci hodil bych zde i kod a mohlo by se pokračovat dále. Děkuji za případnou pomoc
juriad
Profil
Můžeš používat session i pro neregistrované uživatele. Pro vložení produktu do košíku nepotřebuješ znát id uživatele. Stačí ti to, že to přiřadí košík každému návštěvníkovi.
snazimse
Profil
Session id, je právě ta identifikace podle které provedeš přidání nereg.uživatele ,až vyprší jako je to na většině eshopů,bude zase košík prázdný.
lamič
Profil
takže do scriptu kde vlastně neregistrovaný odesílá objednávku bych tedy měl přiřadit session id. poté vzít tu proměnnou a vložit do košíku? P.S. jaký je parametr session na id? Já používám pro příhlášení session_start(); session_name('WebsiteID');
Alphard
Profil
Session id se může měnit, viz třeba session_regenerate_id(). Ukládáte do databáze hodně údajů pro košík? U neregistrovaných uživatelů je možné vůbec nic nevkládat do db a informaci o zboží držet výhradně v session/cookie. Až po dokončení objednávky se vše přepíše do databáze.

Kdybyste to chtěl dávat do databáze, tak nejvhodnější postup by byl vytvářet si dočasné uživatele a jejich id si ukládat do session, stejně jako u registrovaných. Rozdíl by byl jen v té dočasnosti, přidal bych sloupec s poslední aktivitou a pravidelně promazával staré uživatele (a přes cizí klíče vše co s němi souvisí). (Tímhle v principu jen změníte uložiště, po ztrátě session identifikátoru je obsah databáze nedosažitelný stejně jako session samotná, ale využití současné db struktury může být implementačně jednodušší.)

Pro úplnost viz PHP triky - Nákupní košík v cookie, výhoda cookies je v tom, že k nim lze přistoupit z javascriptu a delší platnost (což je sporné, platnost session lze také nastavit libovolnou).
lamič
Profil
díky za reakci, nicméně bych si vybral to nejrychlejší řešení. Promazávání údajů moc nechci řešit, páč do databáze chci zasahovat pouze minimálně. I když by to asi byla chvilka... Řešení se session id mi příjde nejrychlejší... Možná by se mi hodil příklad jeho využití. zkusím o tom něco nastudovat, ale asi by mi pomohl i názorný příklad.. díky za odpověď
lamič
Profil
Tak jsem si něco o tom přečetl, ale moc chytrý z toho nejsem je tu někdo, kdo by mi s tím pomohl?
Jan Tvrdík
Profil
lamič:
session_start();
if (isset($_POST['productId'], $_POST['quantity'])) {
    $productId = (int) $_POST['productId'];
    $quantity = (int) $_POST['quantity'];
    
    if (!isset($_SESSION['cart'][$productId])) {
        $_SESSION['cart'][$productId] = 0;
    }
    
    $_SESSION['cart'][$productId] += $quantity;
}
lamič
Profil
děkuji, že se mi někdo ozval... co se týče toho kódu chápu správně, že tento kód musí být umístěn ve skriptu objednávky. Tím se přiřadí danemý nereg. uživateli session a poté tuto session v košíku musím vyvolat? Nebo jsem vedle?
lamič
Profil
Tak jsem se k tomu opět po nějakém čase vrátil... mám soubor kupted.php v něm tento script na vytvoření session
session_start();
$_SESSION["kosik"][intval($_GET["id"])] = intval($_GET["pocet"]);
include ("connect.php"); 

Když se podívám do session souboru přidá se mi tam "kosik|a:1:{i:0;i:0;}" s určitou velikostí... nyní ale když ve skriptu kosík.php se snažím vyvolat obsah uložené proměnné mi to nic neukáže... kod kosik.php
<?php
         include ("connect"); ;
         include "fce.php";
             
            if ($_SESSION["kosik"]) {
     $result = mysql_query("SELECT * FROM e_objednavky_bez_registrace
      JOIN e_produkty ON e_objednavky.id_produktu=e_produkty.id_produktu WHERE id IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
    while ($row = mysql_fetch_assoc($result)) {
        echo htmlspecialchars($row["nazev"]) . " (" . $_SESSION["kosik"][$row["id"]] . ")<br />\n";
    }
    mysql_free_result($result); 
     
 }  
juriad
Profil
lamič:
Před přístupem do SESSION ji musíš nastartovat. Nejspíš chceš do kosik.php přidat session_start();.
lamič
Profil
juriad:
prřidáno nyní vypada skript kosiku takto:
<?php
session_start();
         include ("connect"); ;
         include "fce.php";
             
            if ($_SESSION["kosik"]) {
    $result = mysql_query("SELECT * FROM e_objednavky_bez_registrace
      JOIN e_produkty ON e_objednavky.id_produktu=e_produkty.id_produktu WHERE id IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
    while ($row = mysql_fetch_assoc($result)) {
        echo htmlspecialchars($row["nazev"]) . " (" . $_SESSION["kosik"][$row["id"]] . ")<br />\n";
    }
    mysql_free_result($result); 
     
 }  
?>

6ádná změna je nto píše nějakej warning,
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /data/web/virtuals/87224/virtual/www/kosik.php on line 9

Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in /data/web/virtuals/87224/virtual/www/kosik.php on line 12
juriad
Profil
Máš chybu v SELECTu. Vypiš si jej.
$select = "SELECT * FROM e_objednavky_bez_registrace
      JOIN e_produkty ON e_objednavky.id_produktu=e_produkty.id_produktu WHERE id IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')";
echo $select;
$result = mysql_query($select);

Ve zvýrazněné části se odkazuješ na tabulku, ze které nevybíráš data.
lamič
Profil
juriad:
<?php
session_start();
        include ("connect"); ;
         include "fce.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 IN ('" . implode("', '", array_keys($_SESSION["kosik"])) . "')");
    while ($row = mysql_fetch_assoc($result)) {
        echo htmlspecialchars($row["nazev"]) . " (" . $_SESSION["kosik"][$row["id"]] . ")<br />\n";
    }
    mysql_free_result($result); 
     
 }  
?>

opraveno stále stejné warningy a prazdna stranka
juriad
Profil
Chyba je v tom dotaze. Odlaď si jej v PHPMyAdminu či Admineru. Neznáme tvé databázové schéma, takže víc poradit nejde.
lamič
Profil
juriad:
dotaz
SELECT * FROM e_objednavky_bez_registrace
      JOIN e_produkty ON e_objednavky_bez_registrace.id_produktu=e_produkty.id_produktu
mi v phpmyadmin vypíše všechny objednavky nereg. uživatelů... celý dotaz tam dat nemohu takže do klauzule WHERE je vše ok..
juriad
Profil
Vypiš si celý sestavený dotaz a ten odlaď. Nejspíš není v SESSION to co očekáváš.
lamič
Profil
juriad:
udělal jsem hned za SQL příkaz echo" $result"; a na stránce se mi objevilo Resource id #5
juriad
Profil
Počkej. Výsledek dotazu není FALSE? V tom případě to nemůže psát warningy.
Prohlédni si zdroják v [#13] a zkus, zda dotaz (ne výsledek dotazu) něco vrátí, když jej zadáš do PHPMyAdminu.
lamič
Profil
Takže začnu od začátku... tabulka v databázi ma toto usporadani
    
id_objednavky_bez_registrace
id_produktu
nazev
jmeno
prijmeni
ulice
mesto
psc
email
telefon
cena
pocet
datum
cislo_objednavky

script kup_ted.php vypada takto
<?php 
session_start();
$_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");
  }  
?>


skript kusik.php vypada takto 
[pre]
<?php
session_start();
         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"]] . ")<br />\n";
    }
    mysql_free_result($result); 
     
 }  
?>


P.S. warning už to nepíše jak jsi psal o te DB tak jsem si všiml, že tam nemám v tabulce id ale id_objednavky_bez_registrace... takže ted po tomto scriptu co jsme napsal to vypisuje jen prazdnou stranku


juriad:
po zadaní celého příkazu do php myadmin vyšel výsledek MySQL vrátil prázdný výsledek (tj. nulový počet řádků). ( Dotaz trval 0.0312 sekund ) což ani jinak skončit nemohlo ale ukazuje to, že chyba není v sql ne?

nikdo? :-(

Dostal jsem se do stádia, kde se mi už asi podařilo napojit na session, nicméně se mi zobrazují pouze texty proměnné se mi tam nezobrazují... neví někdo kde by mohla být chyba? mám podezdření, že se mi do session neukládají správné hodnoty a tímpádem se nezobrazují ani v košíku... jak bych to měl zkontrolovat prosím?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: