PHP týden Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
lafleur.aa
Člen
Avatar
lafleur.aa:1. dubna 14:07

Zdravím, potřeboval bych poradit jak na víceřádkový insert nebo update do databáze s použitím PHP. Dejme tomu, že mám databázi filmů, kde je název, rok a žánr. Nyní jsem tabulku rozšířil o další sloupce stopáž a režie. Ideálně bych tedy chtěl vypsat všechny záznamy do formuláře (to už mám), kde bych jen doplnil u každého filmu tyto 2 položky a hromadně odeslal. Mohl by mi prosím někdo ze zkušených poradit jak na to? Hádám, že to nějak půjde přes cykly, ale neumím to skloubit, jelikož s PDO a OOP teprve začínám. Moc děkuji všem.

Zkusil jsem: googlit, stackoverflow

Chci docílit: Jednorázového updatu všech řádků.

 
Odpovědět 1. dubna 14:07
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1. dubna 15:11

To co hledas se jmenuje transakce (google = pdo Transaction). V pdo se nekde v configu povoluje transakce. Pak muzes odeslat serii prikazu.
Tusim, ze pri vytvareni new pdo je treba nekde povolit, ze chces rezim s transakcemi. A dal uz je klascky zapis s transakcemi

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
));

try{

    //We start our transaction.
    $pdo->beginTransaction();


    //Query 1: Attempt to insert the payment record into our database.
    $sql = "INSERT INTO payments (user_id, amount) VALUES (?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array( // stale se nic neodesila
            $userId,
            $paymentAmount,
        )
    );

    //Query 2: Attempt to update the user's profile.
    $sql = "UPDATE users SET credit = credit + ? WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array( // stale se nic neodesila
            $paymentAmount,
            $userId
        )
    );

    //We've got this far without an exception, so commit the changes.
    $pdo->commit(); // az tady se odesila cela serie sql prikazu jako jeden balicek

}
//Our catch block will handle any exceptions that are thrown.
catch(Exception $e){
    //An exception has occured, which means that one of our database queries
    //failed.
    //Print out the error message.
    echo $e->getMessage();
    //Rollback the transaction.
    $pdo->rollBack(); // tenhle prikaz vrati databazi do puvodniho stavu, pokud jeden z prikazu celeho balicku selze. Pokud je tohle chovani naopak nezadouci, tak ho proste zakomentuj
}
 
Nahoru Odpovědět 1. dubna 15:11
Avatar
Roman Havránek:1. dubna 15:16

Ahoj je to jednoduché.

Veškeré data si projeď foreachem a poukládej do databáze, nebo je updatuj.

Pokud máš problém, projdi si tady základy OOP + MySQL.

Nahoru Odpovědět 1. dubna 15:16
sleep();
Avatar
lafleur.aa
Člen
Avatar
Odpovídá na Peter Mlich
lafleur.aa:1. dubna 15:16

Aha, moc děkuji. Vyzkouším.

 
Nahoru Odpovědět 1. dubna 15:16
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1. dubna 15:16

Existuje sice tenhle prikaz pro INSERT, ale pro UPDATE nic takove nejspis neni. Protoze u update musis zadavat podminku pro vyber radku.

INSERT INTO table_name (column_list)
VALUES
    (value_list_1),
    (value_list_2),
    ...
    (value_list_n);
------
INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
    (
        '2019 Summer Promotion',
        0.15,
        '20190601',
        '20190901'
    ),
    (
        '2019 Fall Promotion',
        0.20,
        '20191001',
        '20191101'
    ),
    (
        '2019 Winter Promotion',
        0.25,
        '20191201',
        '20200101'
    );
Editováno 1. dubna 15:17
 
Nahoru Odpovědět 1. dubna 15:16
Avatar
Vladislav Ladicky:1. dubna 15:45

S MySQL žiadne cykly nepotrebuješ, viacnásobný INSERT, aj viacnásobný UPDATE, je možný.

Príklad INSERT:

INSERT INTO meno_tabulky
  (id, stopaz, rezie)
VALUES
  (1, 123, 'aaa'),
  (2, 123, 'bbb'),
  (3, 124, 'ccc');

No a pre viacnásobný update urobíš zasa viacnásobný INSERT, s menším "trikom":

INSERT INTO meno_tabulky
  (id, stopaz, rezie)
VALUES
  (1, 123, 'aaa'),
  (2, 123, 'bbb'),
  (3, 124, 'ccc')
ON DUPLICATE KEY UPDATE
  stopaz=VALUES(stopaz),
  rezie=VALUES(rezie);
Editováno 1. dubna 15:47
 
Nahoru Odpovědět  +2 1. dubna 15:45
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1. dubna 15:47

Fiha, to je celkem zajimava konstrukce, ten update. To nekdy zkusim :)

 
Nahoru Odpovědět  +1 1. dubna 15:47
Avatar
Odpovídá na Vladislav Ladicky
Uživatel sítě :1. dubna 15:50

Pane, děkuji vám! To se bude v budoucnu jistě hodit.. (v)

Nahoru Odpovědět 1. dubna 15:50
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Vladislav Ladicky:1. dubna 15:51

Niet za čo, rado sa stalo :)

 
Nahoru Odpovědět  +1 1. dubna 15:51
Avatar
lafleur.aa
Člen
Avatar
Odpovídá na Vladislav Ladicky
lafleur.aa:1. dubna 15:56

Jasně, takhle by to samozřejmě šlo, ale já hledám spíš globální řešení, kdy je počet řádků dynamický. Může jich být 5, ale také 500. Nakonec jsem našel celkem jednoduché řešení na YouTube - odkaz zde Ještě nemám vyzkoušené, ale vypadá to zatím nejlépe a nejsrozumitelněji, alespoň tedy pro mne.

 
Nahoru Odpovědět  -1 1. dubna 15:56
Avatar
lafleur.aa
Člen
Avatar
Odpovídá na Vladislav Ladicky
lafleur.aa:1. dubna 15:57

Díky moc, tento trik je určitě užitečný.

 
Nahoru Odpovědět 1. dubna 15:57
Avatar
Odpovídá na lafleur.aa
Vladislav Ladicky:1. dubna 16:10

V tom videu čo si našiel na YouTube rieši viacnásobný INSERT cyklom v PHP. Našiel si horšie a pomalšie riešenie... A ani nerozumiem čo myslíš tým, že hľadáš globálne riešenie ktoré bude použiteľné aj na 5, aj na 500 riadkov. Pretože to, čo som ti napísal je použiteľné aj na 5, aj na 500 riadkov. Navyše, čím viac riadkov naraz budeš vkladať či upravovať, o to rýchlejšie to bude vykonané s tým syntaxom, aký ti ukazujem, nie s tým, čo si našiel na YouTube.

 
Nahoru Odpovědět 1. dubna 16:10
Avatar
lafleur.aa
Člen
Avatar
Odpovídá na Vladislav Ladicky
lafleur.aa:1. dubna 22:30

Myslel jsem to tak, že bych tohoto rád docílil pomocí PHP a univerzální metody, která ovlivní všechny řádky. Ne vypisovat manuálně hodnoty do kódu. Viz úvodní příspěvěk vlákna.

 
Nahoru Odpovědět 1. dubna 22:30
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na lafleur.aa
Peter Mlich:2. dubna 7:33

To reseni z videa ma radu bezpecnostnich chyb. Napr ve 4:00 je videt, ze obsah $_POST primo tlaci do sql dotazu, aniz by se snazil neco escapovat.

 
Nahoru Odpovědět 2. dubna 7:33
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na lafleur.aa
Peter Mlich:2. dubna 7:43

Te druhe poznamce o univerzalnosti moc nerozumim.

To, co napsal V. Ladicky prepise data jen u vybranych radku. Predpokladam (nezkousel jsem jeho reseni), ze klicem bude id. Pokud se bude shodovat, tak prepise sloupce stopaz=VALUES(sto­paz) a rezie=VALUES(re­zie). Coz mi prijde celkem elegantni. A hlavne jednim sql dotazem. Ten dotaz normalne poskladas do stringu. V tom bych problem nevidel.

Mozna potrebujes neco jineho. Mozna potrebujes prepisovat vic radku stejnou hodnotou. To bys musel vedet ale jejich id tak ci tak. To ziskas SELECTEM. Pak by slo UPDATE napsat i takto:

UPDATE users SET credit = credit + ? WHERE id = ? -- tvuj dotaz
UPDATE users SET credit = credit + ? WHERE id IN (14,  26,  35)

A mozna potrebujes cely program, kde si uzivatel muze prepisovat tabulku a jen klikat. Tak to jsem mysleli, ze zvladas, ze to mas. To jsem chtel vlastne napsat, ze muzes uzivateli vytvorit sql ucet a pustit ho do phpmyadmina. A nemusis psat vlastni rozhrani pro prepisovani hodnot. Vim, nepracuje se v tom zrovna nejlepe. Tak muzes zkusit jiny program, Adminer nebo neco podobneho.

 
Nahoru Odpovědět 2. dubna 7:43
Avatar
Petr Langer
Člen
Avatar
Petr Langer:2. dubna 7:57

Prostě foreachem projedeš všechny položky z formuláře a naskládáš je do výše zmíněného dotazu. Je to univerzální pro libovolný počet řádků, v jednom dotazu.

 
Nahoru Odpovědět 2. dubna 7:57
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 16 zpráv z 16.