NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Foreach - prosím o radu

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

Aktivity
Avatar
gorri
Člen
Avatar
gorri:3.6.2017 13:23

Zdravím zkušenější programátory.
Potřeboval bych asi poradit.
Pokouším se rozjet cyklus foreach.
Konkrétně tak aby vzal postupně vše co je v array a následně s tím pracoval.

Moje myšlenka je následující:
Zjisti jestli existuje soubor a pokud ano, tak ho otevři. V cyklu je rovnou i další podmínka a ta říká, že má prohlédnout otevřený soubor a pokud souhlasí ID tak má rovnou includovat soubor, který v sobě nese styl.
Nicméně (a už nevím z jakého důvodu) toto nefunguje.
Mohl by prosím někdo poradit?
Děkuji moc.
Kód vypadá takto.

<?php
$idkategorie = "1";
?>
<?php
foreach ($vsechnyproduktyarray as $value) {

    if(file_exists($vsechnyproduktyarray[$pocitadloproduktyall]))
    {
        ob_start(); include ($vsechnyproduktyarray[$pocitadloproduktyall]); ob_end_clean();
    }
    else
    {
      continue;
    }

    if($idkategorie == $kategorieid)
    {
        include ($viewkategorie);  ++$pocitadloproduktyall;
    }
    else
    {
        echo "";
    }

}
?>
Odpovědět
3.6.2017 13:23
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Neaktivní uživatel:3.6.2017 15:04

Nemá náhodou být místo

file_exists($vsechnyproduktyarray[$pocitadloproduktyall])

spis

file_exists($value)
Nahoru Odpovědět
3.6.2017 15:04
Neaktivní uživatelský účet
Avatar
gorri
Člen
Avatar
gorri:3.6.2017 15:35

Bohužel ani toto nefunguje. Zkusil jsem to.
Dokonce jsem i zkusil jestli ta adresa, která tam má být existuje. A existuje.
Fakt netuším už čím to může být.
Každopádně díky za radu. ;-)

Nahoru Odpovědět
3.6.2017 15:35
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Neaktivní uživatel:3.6.2017 17:38

Můžeš ukázat script který zkoušíš, protože z tohoto skriptu nechápu co je konkrétně např. v tom array.

Editováno 3.6.2017 17:40
Nahoru Odpovědět
3.6.2017 17:38
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:3.6.2017 17:46

Nicméně napadlo mě ještě, že to můžeš zkusit takhle, pokud ten file existuje ale php píše, že ne.

file_exists(realpath($value))
Nahoru Odpovědět
3.6.2017 17:46
Neaktivní uživatelský účet
Avatar
gorri
Člen
Avatar
gorri:3.6.2017 18:01

Problém je, že to funguje jen do první poloviny. Vypíše to, že soubor existuje, je schopen i vypsat cokoli ale jakmile se má pustit do druhé podmínky tak má problém.

<?php
foreach ($vsechnyproduktyarray as $products) {

    if(file_exists($products))
    {
        ob_start(); include ($vsechnyproduktyarray[$pocitadloproduktyall]); ob_end_clean();
    }
    else
    {
      continue;
    }

    if(strpos($druhproduktu, "granule") )
    {
        include ($viewkategorie);  ++$pocitadloproduktyall;
    }
    else
    {
        echo "";
    }

}
?>

Toto má zkontrolovat jestli existuje soubor, který je v

$vsechnyproduktyarray

.
Toto má pochopitelně říct pořadí.

[$pocitadloproduktyall]

Nejprve je tam 0. Jakmile je první podmínka splněna tak má zkontrolovat jestli je otevřený soubor ve správné kategorii.

strpos($druhproduktu, "granule")

(zkusil jsem i

$idkategorie == $kategorie

a nefungovalo). Dokonce jsem zkusil natvrdo napsat přímo číslo kategorie a stejně nic.
Když souhlasí ID kategorie, tak má includovat soubor, který v sobě nese HTML (layout, který nastyluje výpis produktu) a zároveň incrementovat

++$pocitadloproduktyall

Už nějak nevím jak na toto jít. Fungovalo mi to u jiné stránky a teď mi to nějak nefunguje. Nevím proč. Vzal jsem stejný script, který mi jinde funguje a jen jsem změnil $ a stejně nic.
Existuje ještě nějaký lepší způsob? Kromě MySQL. S MySQL jsem se zatím moc dobře nenaučil, takže ho nebudu používat zatím.
Věděl by jsi prosím ještě o nějakém řešení?
Děkuji ti moc

Nahoru Odpovědět
3.6.2017 18:01
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michal Šmahel:3.6.2017 19:59

Používat MySQL (nebo jinou databázi tohoto směru) by nebylo úplně od věci, nicméně teď tu řešíme něco jiného.

Jak vypadá soubor, z něhož čteš? A nech si vypsat hodnoty proměnných které používáš:

// Klasicky:
var_dump($promenna);

Jsou v nich očekávané hodnoty?

Nahoru Odpovědět
3.6.2017 19:59
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
gorri
Člen
Avatar
Odpovídá na Michal Šmahel
gorri:4.6.2017 9:26

Jo to je fakt, že MySQL by to hodně usnadnilo. Ale raději se ho pořádně naučím a pak s ním budu pracovat. Přeci jen je to trochu složitější a rizikovější.
Každopádně jak jsem psal. Adresa k produktu je zcela správně.
Zkusil jsem vzít stejnou proměnnou a jen ji otevřít. Problém nebyl.
Mám někde chybu v cyklu.
Něco tam mám špatně. A nějak nevím co. No tak jsem to prozatím vyřešil tak, že to nebude zacyklené. Sice se to bude načítat o trochu déle ale bude se vše zobrazovat.
Kažopádně díky všem za snahu :-)

Nahoru Odpovědět
4.6.2017 9:26
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Neaktivní uživatel:4.6.2017 10:45

napis aspon co to hlasi za chybu a zkopiruj sem ten php soubor nebo metodu ve ktere je ten cyklus.:)

Nahoru Odpovědět
4.6.2017 10:45
Neaktivní uživatelský účet
Avatar
Odpovídá na gorri
Neaktivní uživatel:4.6.2017 11:08

Naopak bych řekl, že je to jednodušší i bezpečnější než ta magie se souborama :)

Nahoru Odpovědět
4.6.2017 11:08
Neaktivní uživatelský účet
Avatar
gorri
Člen
Avatar
Odpovídá na Neaktivní uživatel
gorri:4.6.2017 12:03

Problem je ze to nehlasi zadnou chybu

Nahoru Odpovědět
4.6.2017 12:03
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Neaktivní uživatel
gorri:4.6.2017 12:04

Na jednu stranu ano ale pak je tady SQL inject a hlavne se mi nedari (v testovaci verzi) zobrazit ani konkretni obsak po kliknuti na link. Celkem sranda

Nahoru Odpovědět
4.6.2017 12:04
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:4.6.2017 12:09

Mam se jeste hodne co ucit abych byl na dobre urovni.

Nahoru Odpovědět
4.6.2017 12:09
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michal Šmahel:4.6.2017 13:33

Takže když si necháš obsah proměnné v tom cyklu vypsat, dostaneš správnou hodnotu? Zkus si ještě hodnotu proměnné vypsat na těchto místech:

foreach ($vsechnyproduktyarray as $products) {

    if(file_exists($products))
    {
        ob_start(); include ($vsechnyproduktyarray[$pocitadloproduktyall]); ob_end_clean();

        // Tady
        var_dump($druhproduktu);
    }
    else
    {
      continue;
    }

    // A tady
    var_dump($druhproduktu);

    if(strpos($druhproduktu, "granule") )
    {
        include ($viewkategorie);  ++$pocitadloproduktyall;
    }
    else
    {
        echo "";
    }

}

Máš alespoň v jednom výstupu hodnotu "granule", kterou očekáváš?

Nahoru Odpovědět
4.6.2017 13:33
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na gorri
Michal Šmahel:4.6.2017 13:37

S SQL injection si nedělej starosti, stačí používat PDO nebo MySQLi a dodržovat určité zásady. Jedná se vlastně jen o to, že nesmíš dosazovat proměnné do dotazu přímo, ale přes nějaké zástupné znaky (PDO to řeší přes otazníky, MySQLi nejspíše také). Před vložením si proměnnou zpracují a ošetří ji proti SQL injection, až poté ji vloží do dotazu.

Přečti si nějaké články tady na ITNetwork, není to nic složitého.

Nahoru Odpovědět
4.6.2017 13:37
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
gorri
Člen
Avatar
Odpovídá na Michal Šmahel
gorri:4.6.2017 14:37

Zkusim to jak sednu k pocitaci. Diky za rady.
Ja neumim programovat objektove. Zkousel jsem to pochopit. Ale k tomu se musim postupne propracovat.

Nahoru Odpovědět
4.6.2017 14:37
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michal Šmahel:4.6.2017 14:43

To nevadí, máme tady zdejší wrapper, který PDO obalí a můžeš ho používat i neobjektově. Jmenuje se Db.php a nechá se stáhnout tady.

Nahoru Odpovědět
4.6.2017 14:43
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
gorri
Člen
Avatar
Odpovídá na Michal Šmahel
gorri:4.6.2017 14:45

Moc dekuji. Toho jsem si vsimnul. Nicmene k tomu abych to pouzival potrebuji alespon trochu vedet co a jak. Uznavam ze objektovy programovani je snazsi ale nejprve to musim pochopit

Nahoru Odpovědět
4.6.2017 14:45
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michal Šmahel:4.6.2017 14:46

No, ten seriál bych doporučoval projet celý.

Nahoru Odpovědět
4.6.2017 14:46
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
gorri
Člen
Avatar
Odpovídá na Michal Šmahel
gorri:4.6.2017 15:01

To kazdopadne. Videl jsem jak je to delane a je to opravdu pekne delane. Jen si to musim procist vicekrat abych to pochopil.
Vsechny ty serialy jsou dobre delane. To jako zakladateli klobouk dolu. :-)

Nahoru Odpovědět
4.6.2017 15:01
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Neaktivní uživatel:5.6.2017 10:02

To je sice pravda, ale to za tebe třeba PDO řeší samo.

Nahoru Odpovědět
5.6.2017 10:02
Neaktivní uživatelský účet
Avatar
gorri
Člen
Avatar
gorri:7.6.2017 22:43

Tak jen pro info.
Už jsem přišel na to kde mám chybu.
Zapomel jsem na inkrementaci kdyz v danem souboru nesouhlasi ID kategorie.
I kdyz nesouhlasi tak to neznamena, ze se musi script prerusit. A takhle kdyz nesouhlasi ID i jakehokoli produktu, tak se vse zastavi, protoze se cely cyklus toci porad dokola.
Hlupak jsem :-D
Takhle to ma vypadat.

<?php
$idkategorie = "1";
?>
<?php
foreach ($vsechnyproduktyarray as $value) {

    if(file_exists($vsechnyproduktyarray[$pocitadloproduktyall]))
    {
        ob_start(); include ($vsechnyproduktyarray[$pocitadloproduktyall]); ob_end_clean();
    }
    else
    {
      continue;
    }

    if($idkategorie == $kategorieid)
    {
        include ($viewkategorie);  ++$pocitadloproduktyall;
    }
    else
    {
        ++$pocitadloproduktyall;
    }

}
?>

Pokud v tom někdo vidí ještě chybu tak se rád poučím. Každopádně děkuji za rady :-)

Nahoru Odpovědět
7.6.2017 22:43
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Honza Prosecký:11.6.2017 16:01

No kazdopadne to vypada, ze by jsi se mel jeste mrknout do dokumentace jak se pouziva foreach cyklus. Uplne zbytecne se odkazujes pres nejakej countern na prvek pole. Takhle by se dejme tomu delalo kdybys mel for cyklus a ne foreach.

 
Nahoru Odpovědět
11.6.2017 16:01
Avatar
gorri
Člen
Avatar
Odpovídá na Honza Prosecký
gorri:11.6.2017 16:25

Jo to je možné, že to používám jinak. Ale mě momentálně "jako amatérovy" postačí, že to funguje.
Jsem rád za to, že jsem se něco naučil a funguje mi to.

Nahoru Odpovědět
11.6.2017 16:25
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Honza Prosecký:11.6.2017 16:43

Jak je libo :). Ja jen, ze je dobry od zacatku se ty veci naucit spravne pouzivat, usetri to spoustu casu a chyb :)). Ale jak je libo

 
Nahoru Odpovědět
11.6.2017 16:43
Avatar
gorri
Člen
Avatar
Odpovídá na Honza Prosecký
gorri:11.6.2017 17:51

Ja vim. Diky za kritiku. Teprve se PHP ucim.

Nahoru Odpovědět
11.6.2017 17:51
Když vím, tak poradím. Nikdo neví všechno :-)
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 26 zpráv z 26.