Diskuze: Víceřádkový insert /update do mysql
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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
}
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.
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'
);
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);
Fiha, to je celkem zajimava konstrukce, ten update. To nekdy zkusim
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.
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.
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.
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.
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(stopaz) a rezie=VALUES(rezie). 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.
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.
Zobrazeno 16 zpráv z 16.