Autor Zpráva
peter_r
Profil
prosím o radu, mám výpis z tabuľky podľa nejakých kritérií:

$vypis = Db::queryAll('
            SELECT *
            FROM latky WHERE spotreba >0 AND obj=""
            ORDER BY dodavatel
        ');
        
        foreach ($vypis as $u)
        {
            echo(".htmlspecialchars($u['nazov']).");
            echo(".htmlspecialchars($u['dodavatel']).");
            echo(".htmlspecialchars($u['spotreba']).");            
            echo("<input type='checkbox' id='vehicle1' name='vehicle1' value='Bike'>");
        }
            

kde vypíše všetky riadky, ktoré majú vypísanú spotrebu (väčšiu ako nula) a stĺpec obj je prázdny, ten CHECKBOX id, name a value je len príklad

teraz potrebujem pomocou checkboxu vybrať určité riadky a pod tabuľku pridať tlačidlo objednať a po stlačení tohoto tlačidla zapíše do riadkov ktoré majú zaškrtnutý checkbox do stĺpca obj nejakú hodnotu, najlepšie aktuálny dátum a čas

poradí mi niekto prosím? ďakujem
anonym_
Profil *
peter_r:
Ten htmlspecialchars v uvozovkách neudělá to, co chceš.

po stlačení tohoto tlačidla zapíše do riadkov ktoré majú zaškrtnutý checkbox do stĺpca obj nejakú hodnotu, najlepšie aktuálny dátum a čas
Zaškrtnutý checkbox poznáš tak, že se odešle. Nezaškrtnutý nikoliv.

Čili, pokud má každý řádek více polí, kontroluj, jestli exituje checkbox se stejným indexem. Pokud ano, zapiš, pokud ne, jdi dál. Zápis do DB (ten dotaz) je pak snad jasný, ne?

Indexy tam dostaneš pomocí nějaké iterační proměnné (třeba $k v tom cyklu, který tam máš), v name pak bude vehicle[$k].
peter_r
Profil
anonym:

s tým htmlspecialchars to mi je jasné, bolo tam ešte niečo čo som vymazal aby to bolo prehľadnejšie

to ostatné, neviem či tomu rozumiem ale skôr som myslel keby mi to niekto zapísal, lebo ja som v tom amatér, ďakujem
Kajman
Profil
Do value checkboxu dejte id řádku. Name můžete dát např. "vybrano[]". Po odeslání pak budou v hodnotách pole $_POST['vybrano'] zatrhnutá id.
anonym_
Profil *
peter_r:
neviem či tomu rozumiem ale skôr som myslel keby mi to niekto zapísal, lebo ja som v tom amatér
Popis máš, tak s ním zkus nějak naložit. Až si nebudeš vědět rady s něčím konkrétním, ptej se.
peter_r
Profil
tak to som v prdeli

<input type='checkbox' id=".htmlspecialchars($u['latky_id'])." name=obj['latky_id'] value="ano")

a potom po stlačení button odoslať

$dt=date("Y-m-d H:i:s");

Db::query("INSERT INTO latky (obj) VALUES (?)" WHERE value="ano",
   $dt
  );

ako hovorím, nerozumiem tomu, som v tom absolútny amatér, preto vás prosím o pomoc
anonym_
Profil *
peter_r:
id=".htmlspecialchars($u['latky_id'])." 
Tohle je nesmysl, viz [#2].

name=obj['latky_id']
Tady ti vypadlo to $u.

Db::query("INSERT INTO latky (obj) VALUES (?)" WHERE value="ano",
   $dt
  );
WHERE je nesmyslné v INSERTu, dev.mysql.com/doc/refman/8.0/en/insert.html. Binduješ (to je ten otazník) sloupec obj, kde nevím, co má být za hodnotu, ale vkládáš do ní čas. SQL má navíc vlastní fci NOW() pro vložení aktuálního času.

Ty budeš mít na stránce třeba 20 checkboxů. Po odeslání formáře v proměnné $_POST[obj] budou jen ty zaškrtnuté. To jsem ti ale už psal (žádný s value="ne" se neodešle).
Kajman
Profil
peter_r:
Ani nedokážete číst. Do value checkboxu dejte id řádku. Name můžete dát např. "vybrano[]" Neudělal jste ani jedno.
echo("<input type='checkbox' value=".$u['latky_id']." name='vybrano[]'>");

Pak záleží na tom, jaký používáte databázový layer. Pokud je dobře udělaný a bude podporovat pole, tak stačí.

Db::query("UPDATE latky SET obj=Now() WHERE latky_id in (?)",
   $_POST["vybrano"]
  );
Pokud ne, najděte si mocnější databázovou vrstvu, nebo si cyklem převeďte pro jistotu hodnoty z pole na číslo a zřetězte je za sebou s čárkou jako oddělovačem.

A pokud se nechcete snažit do dotáhnout, zvolte kategorii Práce a zakázky a udělejte si inzerát.
peter_r
Profil
Kajman:

:-( tak díky
peter_r
Profil
nahodil som to takto ale neurobí nič a ani nevyhodí žiadnu chybu:

if ($_POST)
{
        Db::query("UPDATE latky SET obj=Now() WHERE latky_id in (?)",
           $_POST["vybrano"]
          );
    header('Location: latky.php');
    exit();
    }
    
    <form method='post'>
        <?php    
        $vypis = Db::queryAll('
            SELECT *
            FROM latky WHERE spotreba >0 AND obj=""
            ORDER BY dodavatel
        ');
        
        foreach ($vypis as $u)
        {
            echo("<tr class='tab'><input type='hidden' name='latky_id' value=".$u['latky_id']. " />");        
            echo("<td width='160px'>".htmlspecialchars($u['nazov'])." ".htmlspecialchars($u['typ'])."</td>");
            echo("<td width='80px' align='center'>".htmlspecialchars($u['dodavatel'])."</td>");
            echo("<td width='140px' align='center'>".htmlspecialchars($u['cislo_obj'])."</td>");
            echo("<td width='270px' align='center'>".htmlspecialchars($u['odberatel'])."</td>");
            echo("<td class='datum' width='70px'> ".date('d.m.Y', strtotime($u['datum_zap']))."</td>");
            echo("<td align='center'>".htmlspecialchars($u['poznamka'])."</td>");
            echo("<td width='80px' align='center'>".htmlspecialchars($u['spotreba'])."</td>");            
            echo("<td width='70px' align='center'><input type='checkbox' value=".$u['latky_id']." name='vybrano[]'></td>");
            echo("</tr>");
        }
            
        echo("</tbody></table>");
        ?>
        <br /><br /><input type="submit" value="Objednať" />
        </form>    
juriad
Profil
Zakomentuj si řádek 6 a 7 a místo nich si přidej výpis:
var_dump($_POST);
Obsahuje to, co čekáš?

Zatím jsi nám neprozradil, co je DB - php samotné takovou třídu nemá. Používáš tedy nějakou knihovnu. Jakou?
Kajman ti říkal, že předat pole může a nemusí fungovat. To bys zjistil v dokumentaci té funkce query.
peter_r
Profil
juriad:
no vypísalo chybu

Notice: Array to string conversion in C:\xampp\htdocs\Db.php on line 61
array(2) { ["latky_id"]=> string(2) "43" ["vybrano"]=> array(1) { [0]=> string(2) "43" } }

ten súbor Db.php mám z príkladov nejakej stránky, už nepamätám asi itnetwork.cz a používam ho všade
juriad
Profil
Aha, relevantní část je:
    /**
     * Spustí dotaz a vrátí PDO statement
     * @param array $params Pole, kde je prvním prvkem dotaz a dalšími jsou parametry
     * @return \PDOStatement PDO statement
     */
    private static function executeStatement($params)
    {
        $query = array_shift($params);
        $statement = self::$connection->prepare($query);
        $statement->execute($params);
        return $statement;
    }

    /**
     * Spustí dotaz a vrátí počet ovlivněných řádků. Dále se předá libovolný počet dalších parametrů.
     * @param string $query Dotaz
     * @return int Počet ovlivněných řádků
     */
    public static function query($query) {
        $statement = self::executeStatement(func_get_args());
        return $statement->rowCount();
    }

Takže to používá PDO. Zkusme o tom něco najít:
Google: pdo bind array
https://stackoverflow.com/questions/920353/can-i-bind-an-array-to-an-in-condition-in-a-pdo-query

Existuje workaround, musíš v tom dotazu složit přesný počet otazníků a následně předat ne pole, ale jednotlivá id:
$ids = $_POST["vybrano"];
$inQuery = implode(',', array_fill(0, count($ids), '?'));
Db::query("UPDATE latky SET obj=Now() WHERE latky_id in ($inQuery)", ...$ids);

Pokud bys používal skutečnou knihovnu pro prác s DB a ne jen tuto triviální třídu z ITNetworks.cz (která je dostatečná pro ten jejich kurz), tak je dost pravděpodobné, že by to mohla umět za tebe. Příkladem je česká Dibi, která v dokumentaci ukazuje, že s poli pracovat umí: dibiphp.com/cs/documentation

Mimochodem, měl bys zkontrolovat, že uživatel zaškrnul alespoň jeden checkbox - tedy, že pole $ids není prázdné. Pokud by bylo, tak dostaneš chybu:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
peter_r
Profil
juriad:

ďakujem, funguje to

ešte mám jednu prosbu a už potom vám dám pokoj :-)

po stlačení objednať mi zapíše do tabuľky dátum pre vybrané položky, ale ešte by som potreboval aby hneď za tým tieto vybrané (zaškrtnuté) položky vypísalo do jednoduchej tabuľky html

ďakujem pekne za pomoc
anonym_
Profil *
peter_r:
Tak select pravděpodovně umíš (byl v #1), tak jen do WHERE přidej podmínku na vybrání jen těch chtěných položek. Výpis do tabulky bude v tom foreach cyklu.

Symbolicky nějak takto
echo '<table>';
foreach (...) {
    echo '<tr>
        <td>...
    </tr>';
}
echo '</table>';
peter_r
Profil
anonym:
tak toto náhodou viem :-) ale akú dám podmienku WHERE ???


uvažujem,

v podmienke za príkazom UPDATE mám presmerovanie na inú stánku, toto by som nahradil nejako takto:

Db::queryALL("SELECT * FROM latky WHERE latky_id in ($inQuery)", ...$ids);
    exit();

ale to je asi blbosť
anonym_
Profil *
peter_r:
Pokud tu tabulku chceš vypsat jen bezprostředně po tom uložení a redirectu, tak nemusíš nic lovit v DB a jen si ta IDčka z `$_POST[$ids]` ulož do SESSION a pak je vypiš z té session.

Proměnná inQuery po redirectu už existovat nebude, musíš si ji uložit někam, kde se ten redirect přežije. To je ta session.

Pokud bys chtěl vypsat vždy poslední uložená, tak všechny záznamy podle posledního uloženého času.
peter_r
Profil
anonym:
áno chcem to vypísať bezprostredne po tom uložení, ale nemám šajnu ako to uložím do SESSION a vypíšem :-(
anonym_
Profil *
peter_r:
ale nemám šajnu ako to uložím do SESSION
Jako do jakékoliv jiné proměnné.

a vypíšem
Jako jakékoliv jiné pole.

Projev trochu vlastní iniciativy, za těch 10 minut od mojí poslední odpovědi sis ji maximálně stihl přečíst a odpověď, bez vlastního zamyšlení se nad ní.
peter_r
Profil
anonym:
to nie je pravda, pozerám na www.w3schools.com/php/php_sessions.asp

ale nič mi to nehovorí
blaaablaaa
Profil
peter_r:
Pak je třeba se to naučit nebo zadat jako zakázku. Toto jsou základní věci, které jsou mj. vysvětlené i na stránce, kterou odkazuješ.
peter_r
Profil
za komplet vypracovanú zákazku nemám problém zaplatiť

ale keď tu potrebujem jednu-dve rady, lebo sa neviem pohnúť ďalej, je to taký problém?

tak mi napíšte číslo účtu a sumu koľko chcete za túto jednu radu a pošlem vám peniaze
Kajman
Profil
Ne, udělejte to naopak. Napište si inzerát do sekce Práce a zakázky podle tamních pravidel.
peter_r
Profil
To naozaj sa tu nenájde dobrá duša ktorá by mi to napísala?
Stroganov
Profil *
peter_r:
to nie je pravda, pozerám na www.w3schools.com/php/php_sessions.asp

Veď to je úplne polopate vysvetlené. Sú tam príklady. Čomu konkrétne na tých príkladoch nerozumiete?
peter_r
Profil
Stroganov:

tak tomu príkladu na tej stránke v podstate rozumiem ale neviem ako to dať do tej mojej požiadavky, keďže tam tých $_SESSION môže byť jeden alebo aj viac
blaaablaaa
Profil
peter_r:
V session může být i pole.
anonym_
Profil *
peter_r:
Tak si najdi ještě jiný zdroj, pokud tomuto nerozumíš. Napovim, ze i v tom tebou odkázaném příkladu se pracuje se dvěma sessionami.

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:

0