Avatar
Paranormal
Redaktor
Avatar
Paranormal:

Zdravím, Potřeboval bych aktualizovat 5 řádek při jednom kliknutí.. Může mi někdo prosím poradit? :) Učím se PDO tak prosím v tom :)
Přikládám obrázek jak to vypadá..

Díky moc :)

Odpovědět 30. ledna 12:44
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

Pri INSERTE by si pouzil viacere VALUES bloky, pri UPDATE by som to asi riesil cez transakcie, v ktorej napises vsetky queries a commitom to odosles databaze naraz(aspon tak som transakcie pochopil ja).
Cize v transakcii by si klasicky foreach-om prechadzal cele pole co chces aktualizovat.

$db->beginTransaction();

$stmt = $db->prepare("tvoja query");

try{
   foreach($pole_na_update as $riadok)
      $stmt->execute(/* data do UPDATE query -$riadok */);

   $db->commit();
}
catch(PDOException $e){
   $db->rollback(); //ak transakcia zlyhala, vrati zmeny
   var_dump($e->getMessage());
}
Nahoru Odpovědět 30. ledna 13:42
Svet patrí tím, ktorí sa neposerú.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na joci
Paranormal:

No dobře :D Ale jak sem psal tak začínám.. Jak by jste to tedy přesně aplikoval na tohle?
Posílám obrázek kódu, který vytváří tabulku (viz. příspěvek)

Editováno 30. ledna 20:47
Nahoru Odpovědět 30. ledna 20:47
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

V tomto pripade by query vyzerala asi nejak takto:

UPDATE tvoja_tabulka SET morning_hours=:morning, afternoon_hours=:afternoon WHERE ...

pri tom WHERE musis dat nejaku podmienku, inak ti to updatne vsetky riadky

a v tom cykle by si presiel cely $_POST:

//pocitam s tym ze morning_hours a afternoon_hours je rovnaky pocet
foreach($_POST["morning_hours"] as $key => $value)
   $stmt->execute([
               ":morning" => $_POST[":morning_hours"][$key], //alebo $value
               ":afternoon" => $_POST["afternoon_hours"][$key]
   ]);
Nahoru Odpovědět 31. ledna 15:36
Svet patrí tím, ktorí sa neposerú.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Commit ne, to je něco jiného. Databáze si udržuje změny (ty se provádějí ihned), ale aplikuje je až po zavolání commitu. Ale principálně se pořád na server odešle několik dotazů, ten je zpravuje a navíc s musí stav databáze uložit do paměti a udržovat, dokud není avolánn commit nebo rollback.
Buď update s where a nebo odeslat 5 dotazů. Ta prodleva není zas tak hrozná, pokud neřešíme tisíce dotazů za sekundu ;-)

Nahoru Odpovědět 31. ledna 15:42
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na joci
Paranormal:

A jak by jsi třeba ještě udělal tu podmínku k tomu WHERE?
ja ten tam dal

WHERE day_name=:day

a do toho foreach sem přidal ještě

":day" => $_POST["day_name"][$value]

Ale tam je problém že dny mám zjištovaný podle, Pon,Úte, Stř... ale tohle mi asi vrací jen čísla ne?

Nahoru Odpovědět 31. ledna 15:52
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na patrik.valkovic
Paranormal:

Absolutně nevím o čem mluvíš :D

Nahoru Odpovědět 31. ledna 15:53
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Paranormal
patrik.valkovic:

Jde o to, že když použiješ transakci, tak tím server ještě více zatížíš, ale pořád budeš odesílat 5 updatů zvlášť. Prostě to nedělej :D

Nahoru Odpovědět  +2 31. ledna 16:05
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

Nie, vratilo by ti to presne to, co mas aj vo forme, len musis pridat hidden input s name=day_name a value="konkretny den", lebo ten label sa ti neodosiela v $_POSTe

Nahoru Odpovědět 31. ledna 16:08
Svet patrí tím, ktorí sa neposerú.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na joci
Paranormal:
if(isset($_POST['edit_button']))
{
       $sql = "UPDATE hours SET morning_hours=:morning, afternoon_hours=:afternoon WHERE day_name=:day";
        $stmt = $conn->prepare($sql);

    foreach($_POST["morning_hours"] as $key => $value)
        $stmt->execute([
           ":morning" => $_POST["morning_hours"][$key], //alebo $value
           ":afternoon" => $_POST["afternoon_hours"][$key],
           ":day" => $_POST["day_name"][$value]
        ]);
}



    <form action="" method="post">
        <table>
            <?php
            foreach ($conn->query($sql) as $row)
            {
                echo '<tr><td><label>' . $row['day_name'] . ' </label>' .
                    '</td><td><input style="display: none;" name="day_name" type="text" value="' . $row['day_name'] . '" />' .
                    '</td><td><input name="morning_hours" type="text" value="' . $row['morning_hours'] . '" />' .
                    '</td><td><input name="afternoon_hours" type="text" value="' . $row['afternoon_hours'] . '" />' .
                    '</td></tr>';
            }
        ?>
        </table>
        <input type="submit" name="edit_button" value=" AKTUALIZUJ " />
    </form

Furt to nějak nešlape :D

Nahoru Odpovědět 31. ledna 17:27
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na joci
Paranormal:

Někde sem četl že by se tohle dalo udělat přes cyklus, ale nevím jestli je to účiné, validní pro server, rychlé nebo jaké :D A taky je to ve starší verzi PHPčka a nevím jak přesně to převést na nové PDO.

if($Submit)
{
for($i=0;$i<5;$i++){
$sql="UPDATE $tbl_name SET name='$name[$i]', lastname='$lastname[$i]', email='$email[$i]' WHERE id='$id[$i]'";
$result=mysql_query($sql);
}
}

if($result){
header("location:update_multiple.php");
}
mysql_close();

↑ Není to přesně pro můj projekt je to rovnou zkopírované.

Nahoru Odpovědět 31. ledna 17:32
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

Vypisuje to nejaku chybu ?

Nahoru Odpovědět 31. ledna 17:37
Svet patrí tím, ktorí sa neposerú.
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na joci
Paranormal:

Warning: Invalid argument supplied for foreach() in D:\Programy\XAM­MPP\htdocs\PHP_TES­T\PDO_UPDATE OPENING HOURS\index.php on line 14

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':morning, afternoon_hou­rs=:afternoon WHERE day_name=:day' at line 1' in D:\Programy\XAM­MPP\htdocs\PHP_TES­T\PDO_UPDATE OPENING HOURS\index.php:33 Stack trace: #0 D:\Programy\XAM­MPP\htdocs\PHP_TES­T\PDO_UPDATE OPENING HOURS\index.php(33): PDO->query('UPDATE hours SE...') #1 {main} thrown in D:\Programy\XAM­MPP\htdocs\PHP_TES­T\PDO_UPDATE OPENING HOURS\index.php on line 33

Divné :D

Nahoru Odpovědět 31. ledna 17:40
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

mysql_query() je v PDO to

$stmt = $conn->prepare("SQL bez konkretnych hodnot")

do SQL nikdy nevkladaj priamo hodnoty od usera -> na to su tie "aliasy" :nieco, ktore sa nahradia hodnotami

$stmt->execute($pole_hodnot)
Nahoru Odpovědět 31. ledna 17:44
Svet patrí tím, ktorí sa neposerú.
Avatar
Paranormal
Redaktor
Avatar
Nahoru Odpovědět 31. ledna 17:51
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na joci
Paranormal:

Ale stejně mi to nešlape.. Sem asi dement :D

Nahoru Odpovědět 31. ledna 18:25
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

Neviem v com moze byt problem, vytvorim si ten projekt a vyskusam

Nahoru Odpovědět 31. ledna 18:29
Svet patrí tím, ktorí sa neposerú.
Avatar
Paranormal
Redaktor
Avatar
Nahoru Odpovědět 31. ledna 19:03
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
joci
Člen
Avatar
Odpovídá na Paranormal
joci:

Je to tym, ze ked mas viacej inputov s rovnakym name, hodnota sa bude vzdy prepisovat a nakoniec sa napr. v $_POST["mornin­g_hours"] neodosle pole otvaracich hodin vsetkych dni, ale iba posledne(prepi­sane), cize piatok.
Takze to, co musis spravit je pridat [] za nazvom inputu:

<input name="morning_hours[]" type="text" value="' . $row['morning_hours'] . '" />'
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 1. února 14:56
Svet patrí tím, ktorí sa neposerú.
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 19 zpráv z 19.