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.
Tvůrce
Zobrazeno 19 zpráv z 19.
//= 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.
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());
}
No dobře 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)
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]
]);
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
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?
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
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
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
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é 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é.
Warning: Invalid argument supplied for foreach() in D:\Programy\XAMMPP\htdocs\PHP_TEST\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_hours=:afternoon WHERE day_name=:day' at line 1' in D:\Programy\XAMMPP\htdocs\PHP_TEST\PDO_UPDATE OPENING HOURS\index.php:33 Stack trace: #0 D:\Programy\XAMMPP\htdocs\PHP_TEST\PDO_UPDATE OPENING HOURS\index.php(33): PDO->query('UPDATE hours SE...') #1 {main} thrown in D:\Programy\XAMMPP\htdocs\PHP_TEST\PDO_UPDATE OPENING HOURS\index.php on line 33
Divné
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)
Neviem v com moze byt problem, vytvorim si ten projekt a vyskusam
Je to tym, ze ked mas viacej inputov s rovnakym name, hodnota sa bude vzdy
prepisovat a nakoniec sa napr. v $_POST["morning_hours"] neodosle pole
otvaracich hodin vsetkych dni, ale iba posledne(prepisane), cize piatok.
Takze to, co musis spravit je pridat [] za nazvom inputu:
<input name="morning_hours[]" type="text" value="' . $row['morning_hours'] . '" />'
Zobrazeno 19 zpráv z 19.