Autor Zpráva
nightrider
Profil
Už se to tu předčasem řešilo, ale nevyřešilo se to :-( pomůže mi někdo teď?
<?php 
$dotaz = mysql_query("SET NAMES utf8 COLLATE utf8_unicode_ci");
$dotaz = 'SELECT * FROM kategorie, produkt WHERE kategorie.id_kategorie = produkt.id_kategorie AND produkt.id_produktu IN (';
var_dump($_SESSION['kosik']);
foreach ($_SESSION['kosik'] as $klic => $hodnota) {
    $dotaz .= $klic. ',';
}
$dotaz = substr ($dotaz, 0, -1). ') ORDER BY kategorie.nazev ASC';
var_dump($dotaz);
$vysledek = mysql_query($dotaz);

while ($radek = mysql_fetch_array($vysledek, MYSQL_ASSOC)) {
    var_dump($radek);
    foreach($kosik as $val) {
        $dotaz='INSERT INTO objednavky (nazev_produktu) VALUES("'.$radek['nazev_produktu'].'")';
        var_dump($dotaz);
        $db->query($dotaz);
    }
}
?>


Tímhle chci dosáhnout vložení všeho co mám zapsaný pod sessionem v elektronickém košíku.
Bohužel mi vyhazuje chybu a vůbec nevím jak na to. Děkuju všem a snad mi někdo pomůže
Mastodont
Profil
V řádku 15 chybí uvozovky a tečky:
$dotaz='INSERT INTO objednavky (id_objednavky,nazev_produktu) VALUES('', ' . $radek["nazev_produktu"] . ')';
Tomasds
Profil
 $dotaz='INSERT INTO objednavky (id_objednavky,nazev_produktu) VALUES('', '$radek[nazev_produktu]')';


Nepochopí náhodou php tento apostrof jako ukončení stringu?
Mastodont
Profil
Tomasds
Jo, to jsem přehlédl.
ninja
Profil
$dotaz='INSERT INTO objednavky (id_objednavky,nazev_produktu) VALUES("", "' . $radek['nazev_produktu'] . '")';
Tomasds
Profil
kromě toho.. neznám logiku té aplikace, ale nějak se mi nechce zdát, že by mělo smysl ukládat do id_objednavky prázdný string. Nula by byla trochu zvláštní, ale představit si to umím. Takto bude nejspíš chyba, už ne syntaktická na úrovni php ale na úrovni sql.
Mastodont
Profil
smysl ukládat do id_objednavky prázdný string
To bude sloupec s nastaveným auto increment, tam to projde, ovšem nemělo by se to takto psát.
Tomasds
Profil
nightrider
Když dám prázdnej, tak auto_increment přičte id objednávky,ne?

To nevím, možná to projde, jak píše Mastodont, nezkoušel jsem to. Ale je nesmysl to psát.
Jestli ten kód nějak upravuješ a nefunguje, dej sem aktuální verzi, ať se v tom dá orientovat. Ne všechno, stačí ten inkriminovaný řádek.
tiso
Profil
MastodontTo bude sloupec s nastaveným auto increment
Myslíš?
nightrider
Profil
Aktuální verze je ta nahoře. Pokud udělám zásah, tak ho přepisuju aby jsem zbitečně nezahlcoval db :-)
Tomasds
Profil
Mastodont
To bude sloupec s nastaveným auto increment,
Když se na to dívám, tak spíš nebude. Mám pocit, že nightrider trochu tápe.
nightrider
Profil
Mastodont má pravdu a já na to reagoval že ta tabulka má auto_increment. Jinak máte pravda "TÁPU a dumám" celej a současnej kod je úplně nahoře. Pokud udělám zásah, tak ho tam upravuju.
Mastodont
Profil
nightrider
Ten sloupec id_objednavky z INSERTu úplně vypusť, být tam nemusí (a nemá).
Tomasds
Profil
nightrider
Ujasni si, co od toho chceš. V session máš košík, po jeho potvrzení chceš vytvořit objednávku. To znamená že potřebuješ tabulku objednávek, kde bude asi jen ID a ID_zakaznika. A pak potřebuješ tabulku polozky_v_objednavkach, kde bude ID_objednavky a pak jednotlivé položky objednávky. Nejjednodušší by bylo tam nastrkat jen jejich ID a aktuální cenu, případné další informace joinovat.
Teď mě napadá, že i v té tabulce objednávek by to chtělo místo ID_zakaznika jeho komplet aktuální adresu, protože se ta se může změnit.
nightrider
Profil
Tohle všechno už je :-) já ted jen potřebuju vkládání objednávek. Mám i formulář a tohle je kodik kterým to chci vkládat do databáze. Můžu to udělat rovnou zápisem do db,ale to by jsem si jí zbytečně zaplnoval a proto to mám zápisem sessionem a ted právě chci udělat konečnou část a to je to že zákazník skutečně produkt chce a tak se uskuteční zápis přímo do db.
Tomasds
Profil
nightrider
Tohle všechno už je
Není. Ty snad chceš mít v databázi deset objednávek, když si zákazník objedná deset věcí?

Opakuju: jedna tabulka: objednavky. Po potvrzení košíku vytvoříš záznam, kde bude ID (samozřejmě automaticky vytvořené) a jméno a adresa zákazníka.
druhá tabulka: polozky_v_objednavkach. Tam bude ID (pouze pro účely administrace), IDobjednavky, IDzbozi, cena
TomášK
Profil
Je poznámku ke kódu, jak ho udělat krásnější:
$dotaz = 'SELECT * FROM kategorie, produkt WHERE kategorie.id_kategorie = produkt.id_kategorie AND
produkt.id_produktu IN ('
. implode(", ", array_keys($_SESSION['kosik']))
. ') ORDER BY kategorie.nazev ASC';


Druhá věc, která mě tam bije do očí je, že se v druhém foreach nepoužívá $val, je to v pořádku?
A ještě hint - je lepší sestavit v tom druhém foreach jeden dotaz a pak ho odeslat najednou:
Místo n-krát
$dotaz='INSERT INTO objednavky (nazev_produktu) VALUES(...)';

použít dotaz
$dotaz='INSERT INTO objednavky (nazev_produktu) VALUES(...), (...), (...)';


Co se týče tabulek, podpořím mého jmenovce a jím navrhovanou strukturu.
nightrider
Profil
"Ty snad chceš mít v databázi deset objednávek, když si zákazník objedná deset věcí?"
Původně jsem to tak zamýšlel, ale to co píšeš je složitější proces,ne?
Tomasds
Profil
Možná složitější, asi o 10 řádků. Ale určitě lepší než jedna tabulka pro všechno. Za tu dobu, co se o tom bavíme, už jsi to mohl mít napsaný.
TomášK
Profil
Složitější možná při vkládání (a řekl bych, že nepatrně), ale má to několik podstatných výhod:
- představ si situaci, že budeš chtít měnit email zákazníka. Tvůj návrh musí změnit spousty řádků, Tomasdsův jeden řádek v tabulce zákzníci.
- tvá databáze bude několikanásobně větší - jméno zákazníka nebo produktu tam bude uloženo spoustakrát na jednom místě.
- některé dotazy budou při tvém návrhu dramaticky náročnější na databázi - třeba seznam zákazníků
- uložení zákazníka, který si nic neobjednal (nebo např. zrušil objednávku) v tvém případě nejde (nebo jen s obtížemi)

Aneb zkušenosti říkají, že stojí za to to změnit ;-)
nightrider
Profil
hmm, jseš frajer, ale fakt nemám šajn jak to udělat
TomášK
Profil
Jak říká Tomasds
Tabulky:
zakaznici(id, jmeno, prijmeni, adresa, ...)
produkty(id, nazev_produktu, ...)
objednavky(id, zakaznik_id)
polozky(id, objednavka_id, produkt_id)

Seznam produktů bys měl naplnit sám produkty, které prodáváš. Nechť jsem pak na stránce, kde se ukládají objednávky. Pokud přijde nový zákazník, vložíš ho do tabulky zákazníci. Pokud už existuje, zjistíš jen jeho id. Vytvoříš pro zákazníka novou objednávku (=záznam v tabulce objednávky) a zapamatuješ si její id jako id_objednavky. Pro každý kus zboží, který má v košíku, vytvoříš jeden záznam v tabulce polozky, objednavka_id použiješ to, které sis zapamatoval.

Zkusím někde najít link - postup, jak vytvořit podobnou strukturu je někde určitě popsaný, já si ho nevymýšlím, jen aplikuju

Edit: http://cs.wikipedia.org/wiki/3NF - tvé řešení je na úrovni druhého pokusu, Tomasdsovo na úrovni třetího pokusu
nightrider
Profil
Tak jestli tomu dobre rozumim, tak si budu zapisovat ip adresu a tim ho skatulkovat? Nebo tohle vsechno úri vkladani do db?
TomášK
Profil
Škatulkovat zákazníky je potřeba - ale podle IP bych to nedělal - může být víc stejných jmenovců pod jednou IP. Zkusil bych třeba kombinaci jména, příjmení a telefonu nebo emailu, to by mělo být unikátní.
nightrider
Profil
jasan to znamená že všechny akce musím udělat při odesílání,ale fakt nevím jak to udelat :-) Neni nekde hotove reseni?
TomášK
Profil
Někde určitě jo, free eshopů je hodně :) Kód po ruce bohužel nemám...

Při odesílání objednávky uděláš v tomto pořadí:
- zkusíš najít v databázi zákazníka, pokud tam není, vytvoříš ho
- vytvoříš nový záznam v tabulce objednávky, který bude obsahovat id nalezeného zákazníka
- v cyklu pro každou položku si [ najdeš id produktu, vložíš záznam do tabulky polozky, ktery bude obsahovat id produktu a id objednavky ]

V tabulce produkty bys měl mít seznam produktů, které nabízíš, ten vložíš dřív než přijde první zákazník.

Je to víc akcí než předtím, ale zdá se mi, že žádná z nich není příliš těžká. Když tohle přepíšeš do kódu, tak si vyhrál :)
Tomasds
Profil
nightrider
Je otázka, jestli předpokládáš, že se ti zákazníci budou vracet a tudíž má smysl jim umožňovat nějakou registraci a pozdější přihlášení.
Pokud ne, tak tabulka zakaznici(id, jmeno, prijmeni, adresa, ...) , jak ji navrhuje TomášK, nemá smysl a v tabulce objednavky nebude zakaznik_id, ale komplet adresa. Píšu to z toho důvodu, že by se ti to tím všecho zjednodušilo o registraci a přihlašování. TomášK to samozřejmě myslí dobře a jeho návrh je správný.

Takže v té jednodušší variantě, o které píšu, je postup tento. Zákazník není přihlášen (protože možnost přihlášení neexistuje). Potvrdí, že má nakoupeno a chce dokončit objednávku. Tam vypíše adresu a formulář odešle.
Ty vytvoříš nový řádek v tabulce objednavky (INSERT) a tam vložíš adresu zákazníka. Zjistíš id právě vloženého záznamu (mysql_insert_id) a do tabulky polozky vložíš toto id a id objednaných produktů. A to je asi tak všechno, tádydádydá.

Propracovanější varianta předpokládá přihlašování, sessions a do objednávek nevkládá jméno, ale ID zákazníka.

TomášK
Díky za spolupráci a za tu wiki, dozvěděl jsem se něco teorie na téma OLAP vs. OLTP :-)
nightrider
Profil
..
Toto téma je uzamčeno. Odpověď nelze zaslat.