Portál AbcLinuxu, 25. dubna 2024 10:47


Dotaz: PHP + MySQL - pole

4.6.2013 12:52 dennyx
PHP + MySQL - pole
Přečteno: 830×
Odpovědět | Admin

Dobrý den,

 

chtěl bych se zeptat na radu zkušenějších programátorů.


Něco na úvod o mé problematice - snažím se udělat internetový obchod a dostal jsem se do poslední fáze, kterou tvoří zapsání záznamů (produktů) z košíku do databáze.

Vypisování řeším pomocí pole a session a potřeboval bych poradit s cyklem, který by prošel všechny zakoupené záznamy a zapsal je do databáze.

 

Tento obchod nepůjde do ostrého provozu, proto není potřeba se zabývat zabezpečením jako je sql injection apod.

 


Pro lepší pochopení příkládám screenshoty (Návrh tabulek, hl. stránka a screenshot kódu pro lepší zobrazení)

Vzhled webové stránky s nákupem - http://2imgs.com/2i/i/51add260/b9d58ed187be42f29810afdb884b5ca2/115e1c36e5.f.png

 

Návrh tabulek - http://2imgs.com/2i/i/51add2e2/b40d7c96fe11b51d123e6b56fe605aeb/eea1e3c91a.f.png

 

Část kódu-

http://2imgs.com/2i/i/51add318/2635afae9fb269957231f9cbbc8dd500/ffb0f2d80b.f.png

http://2imgs.com/2i/i/51add322/31275a004b304afc7822a7d1f92627cd/cc83c1eb38.f.png

http://2imgs.com/2i/i/51add328/53faf384a0fc6a3ef0585ae9f066e6b3/dd92d0fa29.f.png

 

Pokud by někdo měl čas a ochotu pomoci, byl bych mu neskutečně vděčný, jelikož je to poslední část.

Děkuji,

Daniel!

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Tarmaq avatar 4.6.2013 13:52 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zadny z obrazku se mi nezobrazuje. Navic doporucuju kod nevkladat jako obrazek, ale umistit ho sem do tagu <pre>
Don't panic!
4.6.2013 14:08 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přílohy:
To se omlouvám, mě ty odkazy fungují. Přikládám zde část kódu a v přílohách obrázky, jelikož zde jsem mohl vložit čistě jen kód z php.
        
if(isset($_GET['id_kosik'])){
        $id = $_GET["id_kosik"];
        $nazev = $_GET["nazev_kosik"];
        $cena = $_GET["cena_kosik"];
        }
        $_SESSION["data"][$id]=array(
          "nazev_kosik"=>$nazev,
          "cena_kosik"=>$cena,
        );
        if(is_array($_SESSION["data"])) {
          foreach ($_SESSION["data"] as $id=>$data) {
            $nazev = $data["nazev_kosik"];
            $cena = $data["cena_kosik"];
			echo "";
            echo $id."";
            echo $nazev."";
            echo $cena."";
            echo "";
          }
        }

			if(isset($_POST['jmeno_kosik'])){
            $dotaz1="INSERT INTO nakupujici (jmeno,prijmeni,bydliste,email,tel_cislo) VALUES (";
			$dotaz1.="'".$_POST['jmeno_kosik']."',";
			$dotaz1.="'".$_POST['prijmeni_kosik']."',";
			$dotaz1.="'".$_POST['bydliste_kosik']."',";
			$dotaz1.="'".$_POST['email_kosik']."',";
			$dotaz1.="'".$_POST['telefon_kosik']."');";
            $vysledek1 =  mysql_query($dotaz1) or die (mysql_error());
			echo "přidáno";
			}
			
			
			for($i= 0; $i < count($nazev); $i++){
            $dotaz="INSERT INTO kosik (zbozi_id,nazev_zbozi,cena_zbozi) VALUES (";
			$dotaz.="'".$id."',";
			$dotaz.="'".$nazev."',";
			$dotaz.="'".$cena."');";
            $vysledek =  mysql_query($dotaz) or die (mysql_error());
			}

4.6.2013 15:16 Kit
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Doporučuji celé smazat a napsat znovu. Je to děravé jako řešeto, pro nasazení nepoužitelné.
4.6.2013 15:51 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Nemá to jít do ostrého nasazení, tudíž jestli je to děravé nebo ne je v podstatě fuk.

Navíc, i kdybych to celé smazal, nevymyslel bych nic jinýho. Spíš by se mě hodila rada jak pokračovat, nebo jak znovu začít.

Rada celý to smaž mě osobně k ničemu nepomůže.
4.6.2013 17:44 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Děravé je to v zásadě ze dvou důvodů. První je že používáš uživatelem zadaná vstupní data rovnou na konstrukci dotazu a druhý je, že nepoužíváš vůbec mysql_escape_string(), a na závěr ještě to nejnevhodnější připojení do db, tedy pomocí mysql, kdyby alespoň mysqli, kde by už i Prepared Statements lze použít hezky.
Je dobré si to zkusit od píky a zabývat se pak i tím, „proč je to špatně“, nyní je to ukázka velmi nebezpečného kódu a neměl by být akceptován i za jen výukovým účelem jinak, než jako „tudy tedy ne“.
Jinak původní otázce moc nerozumím, SQL dotazy jaksi tvoříš a foreach, taky používáš…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
4.6.2013 19:38 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

Je poměrně zajímavé tohle všechno číst. Studuji 3.ročník SŠ oboru IT a způsob, který mi je zde vytýkán je zároveň i způsob, jakým mě to ve škole naučili.

V podstatě jsem se ještě nedozvěděl žádnou radu, jak pokračovat. je mi zde vytýkána bezpečnost, ale o tu v tomhle případě nejde, protože se to nikde používat nebude.

 

Původní otázka je - jak zapsat ten nákup kterýje vypisován do pole do databáze.

Mám tam sice cyklus, který by záznamy v poli měl projít, ale nefunguje správně.

4.6.2013 20:11 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
I pokud je to učení jen mimochodem a ne jako „hlavní“ předmět, je to špatně porušuje to totiž elementární principy (vstup musí být ošetřený).
Pokud by to byl kód zapsat/přečíst z DB nu dobrá, ale je to „web“ kód, toto je od základu špatně, takže to málokdo, kdo trochu „ví“, stráví.
Možná to vypadá, že ti nikdo nechce pomoct, ale je to spíš o tom, že to nikdo nechce za tebe psát (nehledě na to, že by to musel celé přepsat protože, prostě bez záklaního ošetření to lze těžko publikovat :( ), ona ta otázka je vágní.
Za předpokladu, že ID sloupce jsou auto_increment, tak asi ti jde o toto (nakupujici_id):
$sqlq="INSERT INTO nakupujici (jmeno,prijmeni,bydliste,email,tel_cislo) VALUES…";
mysql_query($sqlq)…
//získani id posledního vloženého záznamu, nesmí být použit mysql_pconnect() pro připojení
$nakupujici_id=mysql_insert_id();
for($i= 0; $i < count($nazev); $i++){
  $sql="INSERT INTO kosik (nakupujici_id,zbozi_id,nazev_zbozi,cena_zbozi) VALUES ('${nakupujici_id}',…";
  mysql_query($sqlq)…
  …
}
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
kozzi avatar 4.6.2013 20:23 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

Mohl bych se zeptat kam chodis na skolu?

Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
4.6.2013 18:15 kuka
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
A cemu to teda ma cele byt? Od toho se odviji, jak dal postupovat.
kozzi avatar 4.6.2013 19:31 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

fuk to neni, jde o to proc takovyto kod vubec psat? Pokud se hodlate neco naucit, tak prave to ze to delate spatne a to jak by jste to mel delat by melo byt dulezite. Pokud jde o nejaky skolni projekt, tak by za neco takoveho meli dat nula bodu, takze opet ma smysl to resit a neni to fuk.

Celkove bych se zamyslel, jestli to cele nesmazat a nezacit znovu, a treba zkusit pouzit nejaky framework. Osobne mohu doporucit napriklad Nette.

Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
4.6.2013 15:20 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Použil bych alespoň PDO
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
4.6.2013 15:55 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
O tom slyším poprvé a vypadá to jako skvělé ulehčení. Ale když už jsem udělal celej ten obchod (administrace, zobrazení, design a všechno) tímto způsobem a chybí mě jen zápis nákupu do db, nevím jestli by změna v tomto bodě byla vhodná.

Nebo se mýlím?
rADOn avatar 4.6.2013 16:36 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Z dlouhodobyho hlediska asi jo. Ale na tvym levelu ti trocha low-level praxe nemuze uskodit. Ony se vsechny tyhlety supermegacool nadstavby lip pouzivaji kdyz clovek ma predstavu co je pod kapotou.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
kozzi avatar 4.6.2013 19:38 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

Co se tyce navrhu, tak minimalne si myslim ze nazev_zbozi v kosiku je zbytecnej, kdyz uz tam je id na zbozi, a naopak mi tam chyby pocet kusu nakoupeneho zbozi

Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
4.6.2013 19:47 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
S tím názvem zboží souhlasím. Počtem kusů se chci zabývat až se mě podaří úspěšný zápis do databáze
kozzi avatar 4.6.2013 20:17 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

Ok co se tyce kodu, tak:

for($i= 0; $i < count($nazev); $i++){
    $dotaz="INSERT INTO kosik (zbozi_id,nazev_zbozi,cena_zbozi) VALUES (";
    $dotaz.="'".$id."',";
    $dotaz.="'".$nazev."',";
    $dotaz.="'".$cena."');";
    $vysledek =  mysql_query($dotaz) or die (mysql_error());
}
tohle ma podle tebe delat co? nechces tam neco jako:
foreach($_SESSION["data"] as $id=>$data){
    $nazev = $data['nazev'];
    $cena = $data['cena'];
    $dotaz="INSERT INTO kosik (zbozi_id,nazev_zbozi,cena_zbozi) VALUES (";
    $dotaz.="'$id',";
    $dotaz.="'$nazev',";
    $dotaz.="'$cena');";
    $vysledek =  mysql_query($dotaz) or die (mysql_error());
}
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
David Watzke avatar 5.6.2013 13:56 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
INSERTem lze vložit víc řádků najednou. (Následující jsem netestoval.)
$dotaz="INSERT INTO kosik (zbozi_id,nazev_zbozi,cena_zbozi) VALUES ";
$vysledek=NULL;

foreach($_SESSION["data"] as $id=>$data){
    $nazev = $data['nazev'];
    $cena = $data['cena'];

    $dotaz.="('$id', '$nazev', '$cena'),";
}

if ($dotaz[strlen($dotaz)-1] == ',') {
    $dotaz[strlen($dotaz)-1] = ')';
    $vysledek = mysql_query("$dotaz;") or die (mysql_error());
}
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
7.6.2013 10:56 Kozzi
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Tak to samozrejme jde, ale prichazi se o moznost napriklad zjistit posledni vlozene id zaznamu . Ale je pravda ze v tomto pripade ho nejspis stejne k nicemu nepotrebuje, takze aspon usetri vykon
7.6.2013 11:26 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Tuto fičuru využívám ve velmi specifických případech, pro založení desítek až set tisíců záznamů, ale je trochu na ladění, kdy to na daném nastavení serveru (a HW) má pozitivní efekt, pode mé zkušenosti úspora začíná na několika desítkách až set záznamech a končí (u jednoduchých insert-ů) někde v jednotkách tísíc, až desítek tisíc a úspora může být až několika-více-násobků rychlejší.
Poslední vložené id záznamu (, které není nyní potřeba) stále funguje, ale jinak :-), po příkazu je nastaveno na ID prvního záznamu.
Prostě multi-insert to spíše zpřehlední, než zrychlí, ale nemusí to být přenositelné…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
6.6.2013 10:23 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Není, název by tam měl být, představete si, že bude chtít v budoucnosti ten samý výrobek třeba jen přejmenovat, nebo k němu přidat nějaký dárek. Už jsem se s tím párkrát setkal a název opravdu ukládat doporučiji, stejně jako cenu a případně sazbu DPH.
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
6.6.2013 11:52 Kit
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
S tím názvem, cenou a sazbou DPH souhlasím, ale určitě by se neměly předávat přes POST, ale přímo z databáze při insertu. Přes POST by se mělo předat jen ID a množství žádaného zboží.
6.6.2013 15:06 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Ano, s tím se nedá než souhlasit. Bral jsem to jako samozřejmost :-O.
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
6.6.2013 15:13 Kit
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Když se podívám na první skript od it_projekt, tak mi to zas tak samozřejmé nepřipadá :-)
4.6.2013 23:06 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Odpovědět | | Sbalit | Link | Blokovat | Admin

Mnohokrát všem děkuji, uživatelům Kozzi a Šangala, konečně jsem se částečně posunul z místa a mohu pokračovat.

 

Dále pro upřesnění -

často mi zde byla vytýkáná ,,děravost" a nemožnost užití v praxi. Chci bych jen říct, že takové použití do nás učitelé vštěpují a jelikož se o programování zas tak moc nezajímám, používám to, co jsem se od nich naučil.

 

Ještě jednou děkuji.

5.6.2013 12:40 fffffffffffffffffffffff
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Ucitelia by si mali doplnit/osvojit vedomosti ohladom osetrovania vstupov od uzivatelov nezavisle od programovacieho jazyka.
5.6.2013 16:13 jos
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
tohle vytiskni a lípni to tomu učiteli na kabinet
okbob avatar 5.6.2013 19:43 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Prosím o kontakt na Vaše učitele. Rád jim to osobně vysvětlím.

Čistě se má psát bez ohledu na to, jestli to někdo uvidí nebo ne. Zvlášť při výuce, neb co se v mládí naučíš, tak to potom použiješ :-(.

A SQL injection je nehorázná ostuda!
5.6.2013 20:21 dennyx
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

Ani si nedokážeš představit, jak rád bych ti ten kontakt dal. Není to poprvé, co mě bylo řečeno, že podobný kód se v praxi použít nedá. Na druhou stranu, kdyby mu podobná zpráva došla, soudě podle mého nicku a žádosti(typu) o radu bych z toho ve výsledku měl jen problémy.

Přece jen co člověk na internetu jednou napíše, to tam taky zůstane.

 

Z té lepší stránky si člověk udělá obrázek o výuce některých kantorů. :o)

okbob avatar 5.6.2013 21:29 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: PHP + MySQL - pole
Výuka nemusí být dokonalá - a ne všechno musí být nezbytně praktické - ale všechno musí být bezpečné! Mám stavební průmyslovku, a představte si, že by nás podobným způsobem učili konstrukci staveb. Samozřejmě, že nás učili technologie, které se pak už třeba nepoužívali nebo leccos nám zatajili. Ale všechno, co nám řekli bylo bezpečné - a praktickou část vedli učitelé, kteří si své na stavbách odsloužili.

Před roky jsem sloužil v Olomouci coby záklaďák, a potkával jsem se s holkama z peďáku. Jako ajťák jsem žasl, jaké nesmysly se učí. Mentorovaly parametry filesystému a klávesové zkratky wordu. Vím, že učit databáze není jednoduché - ale lepší je někdy neučit než učit blbě.
6.6.2013 09:01 DarkKnightCZ | skóre: 12
Rozbalit Rozbalit vše Re: PHP + MySQL - pole

co databaze... se spatne navrzenou databazi muze mensi projekt stabilne fungovat, ale s deravou aplikaci moc dlouho nevydrzi

a celkove se na oborech mimo IT uci dost zajimave veci, nedavno jsem se taky podivoval nad tim, proc musi ekonomove vedet, jake kodeky se pouzivaji pro prenos zvuku a jake maji parametry

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.