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: PHP vícenásobná aktializace mySQL

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

Aktivity
Avatar
Verquido
Tvůrce
Avatar
Verquido:30.1.2016 12:44

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.1.2016 12:44
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:30.1.2016 13:42

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.1.2016 13:42
Svet patrí tím, ktorí sa neposerú.
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:30.1.2016 20:47

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.1.2016 20:47
 
Nahoru Odpovědět
30.1.2016 20:47
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:31.1.2016 15:36

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.1.2016 15:36
Svet patrí tím, ktorí sa neposerú.
Avatar
Patrik Valkovič:31.1.2016 15:42

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.1.2016 15:42
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 15:52

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.1.2016 15:52
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Verquido:31.1.2016 15:53

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

 
Nahoru Odpovědět
31.1.2016 15:53
Avatar
Odpovídá na Verquido
Patrik Valkovič:31.1.2016 16:05

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
31.1.2016 16:05
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:31.1.2016 16:08

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.1.2016 16:08
Svet patrí tím, ktorí sa neposerú.
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 17:27
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.1.2016 17:27
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 17:32

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.1.2016 17:32
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:31.1.2016 17:37

Vypisuje to nejaku chybu ?

Nahoru Odpovědět
31.1.2016 17:37
Svet patrí tím, ktorí sa neposerú.
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 17:40

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.1.2016 17:40
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:31.1.2016 17:44

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.1.2016 17:44
Svet patrí tím, ktorí sa neposerú.
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 17:51

Jop chapu ;)

 
Nahoru Odpovědět
31.1.2016 17:51
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 18:25

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

 
Nahoru Odpovědět
31.1.2016 18:25
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:31.1.2016 18:29

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

Nahoru Odpovědět
31.1.2016 18:29
Svet patrí tím, ktorí sa neposerú.
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na joci
Verquido:31.1.2016 19:03

dobře

 
Nahoru Odpovědět
31.1.2016 19:03
Avatar
joci
Člen
Avatar
Odpovídá na Verquido
joci:1.2.2016 14:56

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
1.2.2016 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.