Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: Zpracování více stejných name ve formuláři

Aktivity
Avatar
gorri
Člen
Avatar
gorri:23.5.2019 12:22

Ahoj,
prosím. Opět bych potřeboval nasměrovat správným směrem.
Napsal jsem si script pro hromadné nahrávání fotografií do eshopu. Pak bude pro mě jednodušší vybrat fotku k produktu jen ze select. Nicméně některé fotografie budou mít i popisek. Takže po nahrátí mi zobrazí všechny aktuálně nahrané fotografie spolu s inputy kam se může napsat co potřebuji. Nicméně jsem narazil na zádrhel. Uložení.
Například mám 3 fotografie a u všech se zobrazí

<input type="text" name"nadpis">
<textarea name="obsah"></textarea>

a netuším jak uložit všechny hodnoty najednou.
Přikládám kód pro lepší představu jak jsem to udělal. Uznávám, že je to asi prapodivný způsob ale vše funguje dokud nedám uložit. Nic se nezpracuje.

<h1>Dokončení</h1>
<?php
if(Db::querySingle('SELECT * FROM photos WHERE process=?', 0))
{
    echo '<form method="POST" class="process">';
    if($_POST['add-photo'])
    {
        foreach (Db::queryAll('SELECT * FROM photos WHERE process=?', 0) as $d) {
            Db::query('
                        UPDATE photos
                        SET nadpis=?, popis=?, link=?, process=?
                        WHERE uid=?
                ',$_POST['nadpis'],$_POST['description'], $_POST['link'], $_POST['uid']);
        }
    }
    foreach (Db::queryAll('SELECT * FROM photos WHERE process=?', 0) as $pf) {
        ?>
<stepp>
    <img src="/photos/<?php echo (htmlspecialchars($pf['url']));
         if($pf['druh'] == 1)
         {
             echo '/eshop/produkty/';
         }
         else
         {
             if($pf['druh'] == 2)
             {
                 echo '/eshop/category/';
             }
             else
             {
                 if($pf['druh'] == 3)
                 {
                     echo '/content/';
                 }
             }
         }
         echo (htmlspecialchars($pf['foto']));
         ?>
         ">
    <input type="hidden" name="uid" value="<?= htmlspecialchars($pf['uid']); ?>">
    <label for="nadpis">Nadpis u fotografie</label>
    <input type="text" name="nadpis">

    <label for="description">Text u fotografie</label>
    <textarea name="description"></textarea>

    <label for="link">Odkaz u fotografie</label>
    <input type="text" name="link">
</stepp>
<?php
    }
    echo '<div class="clear"></div>';
    echo '<input type="submit" value="Pokračovat" name="add-photo">';
    echo '</form>';
}
?>

Děkuji za případnou radu :-)

Zkusil jsem: google, foreach

Chci docílit: Uložení informací k fotografii

Editováno 23.5.2019 12:23
Odpovědět
23.5.2019 12:22
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Tomáš Novotný:23.5.2019 12:44

Ahoj,
řekl bych, že zádrhel bude v tom, že neprocházíš cyklem data v $_POST, ale záznamy v DB.
Česky, jak jsem přečetl část kódu... php server si říká: "pokud mi bylo posláno add-photo tak vyberu některé řádky z DB a ke všem přidám z přijatých informací stejný nadpis, popis, odkaz a nějaký identifikátor".

Editováno 23.5.2019 12:46
Nahoru Odpovědět
23.5.2019 12:44
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
gorri
Člen
Avatar
Odpovídá na Tomáš Novotný
gorri:23.5.2019 12:51

I to mě napadlo. Proto jsem to zkusil jen vložit ale stejně nic

if($_POST['add-photo'])
    {
        Db::query('
                        UPDATE photos
                        SET nadpis=?, popis=?, link=?, process=?
                        WHERE uid=?
                ',$_POST['nadpis'],$_POST['description'], $_POST['link'], $_POST['uid']);
    }

Nebo to myslíš jinak? Pokud ano, tak jsem to asi moc nepochopil. Mohl bych tě požádat o nasměrování ve scriptu?

Nahoru Odpovědět
23.5.2019 12:51
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Tomáš Novotný:23.5.2019 13:18

Potíž je v

$_POST['nadpis'],$_POST['description'], $_POST['link'], $_POST['uid']

vlož si do kódu třeba

echo '<pre>';
print_r[$_POST];

a tam už bych řekl, že to uvidíš sám ;-) a pokud ne hned na první dobrou tak podumej, aha moment jistě přijde..

Nahoru Odpovědět
23.5.2019 13:18
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
gorri
Člen
Avatar
Odpovídá na Tomáš Novotný
gorri:23.5.2019 13:23

OK. Díky zkusím. Ještě mě napadlo, že to zkusím cyklem for(). Spočítá se kolik je tam záznamů a na základě toho by se to mohlo uložit ke správnému. Zkusím a uvidím. Každopádně díky :-)

Nahoru Odpovědět
23.5.2019 13:23
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.5.2019 15:44

Ja bych si udelal script zvlast pro nahravani, treba pomoci drag-drop a multifile. A popisky bych dopisoval dodatecne. Vytahl to pak z db s id


move_uploaded_fi­le...
INSERT ...


<div class=cart>
    <img src="...">
    <input type="text" value="" name="images[456][title]">
    <textarea name="images[456][desc]"></textarea>
</div>

<div class=cart>
    <img src="...">
    <input type="text" value="" name="images[457][title]">
    <textarea name="images[457][desc]"></textarea>
</div>

// V POSTu bys pak mel mit pole
var_dump($_POST['images']);
array(
456 => array(title => titulek, desc => popisek),
457 => array(title => titulek, desc => popisek)
)
Editováno 23.5.2019 15:45
 
Nahoru Odpovědět
23.5.2019 15:44
Avatar
gorri
Člen
Avatar
Odpovídá na Peter Mlich
gorri:23.5.2019 18:25

Ono těch fotek může být více. A já to mám tak, že nahraju fotky, uloží se, provede se zápis do DB a pak se vytáhne jen kolik jich tam je a na základě toho se pokračuje. Teď už mám ten script upravený. Napsal jsem to nakonec tak, že to vytáhne jeden, nechá mě do toho zapsat nebo přeskočit zápis. Pak se podívá jestli tam je další. Když ne, tak hotovo. Šel jsem řekněme jednodušší cestou, když se mi nedařilo abych to mohl napsat pro všechny najednou.

Nahoru Odpovědět
23.5.2019 18:25
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.5.2019 7:54

Jj. Pro 5 fotek je to ok, ale pro vic uz nee.
Tabulka je vlastne podobna tvemu problemu.Jeste by to slo zapsat treba s pomlckami a pak bys z toho musel to id dolovat (cislo radku).

<input name="jeden ze seznamu">
table[1][1], table[1][2], table[1][3]
table[2][1], table[2][2], table[2][3]
table[radek1][sloupec1], table[radek1][sloupec2], table[radek1][sloupec3]
table[radek2][sloupec1], table[radek2][sloupec2], table[radek2][sloupec3]
table_1_1, table_1_2, table_1_3
table_2_1, table_2_2, table_2_3
images[456][title], images[456][desc]
images[457][title], images[457][desc]
Editováno 24.5.2019 7:55
 
Nahoru Odpovědět
24.5.2019 7:54
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.5.2019 8:06

A jeste mne napadlo pouzit pole bez cisel (indexu, nazvu). By sis musel ale pak hlidat poradi sloupcu. Takze je lepsi ukecanejsi reseni
table[1][], table[2][]
table[1][1], table[1][2] // lepsi

 
Nahoru Odpovědět
24.5.2019 8:06
Avatar
gorri
Člen
Avatar
Odpovídá na Peter Mlich
gorri:24.5.2019 9:52

Vsak podobnym zpusobem jsem to udelal. Akorat ze se mi to neukladalo vsechno ale bylo tam vzdy jine ID. Nicmene uz asi vim kde je problem. I když mám víceméně pro každý obrázek vlastní pole, tak to zpracuje vždy poslední položku. Tak jsem to raději udělal tak, že se mi načte vše pro jeden obrázek, spočítá se kolik jich je ještě v DB nezpracovaných a pak mi to vyhodi dalsi obrázek. Jednodušší. Každopádně děkuji všem za rady :-)

Nahoru Odpovědět
24.5.2019 9:52
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.5.2019 10:43

" zpracuje vždy poslední položku"
pokud mas cyklus typu

cyklus() {nacti(i)} // nacte treba 10 obrazku
zapis(i) // zapise posledni, protoze zapis neni uvnitr cyklu

To se pak nediv :)


Pripadne, jak pises na zacatku, pokud polickam das stejne name, tak samozrejme php veme posledni polozku. Vsechny predchozi se stejnym name prepise vzdy tou nasledujici, logicky.

Editováno 24.5.2019 10:44
 
Nahoru Odpovědět
24.5.2019 10:43
Avatar
gorri
Člen
Avatar
Odpovídá na Peter Mlich
gorri:24.5.2019 11:16

Jo no

Nahoru Odpovědět
24.5.2019 11:16
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 12 zpráv z 12.