Fórum Root.cz
Hlavní témata => Server => Téma založeno: Václav Jaroměřský 24. 03. 2019, 21:52:42
-
Ahojte, dobrý večer. Protože sportovnímu týmu mé drahé polovičky nevyhovuje žádné řešení docházky, rozhodl jsem se, že něco rychlého zbastlím sám, protože jde o opravdu primitivní věc. Narazil jsem ale na následující problém a doufám, že mi dovedete pomoci:
K této části kódu souboru index.php se dostanu z adresy /index.php?nacti_soupisku&id=něco.
Představa je taková, že skript
- vypíše všechny id z tabulky 'soupiska', které mají ve sloupci aktivni = 1
- poskládá příkaz databázi, že má uložit do tabulky 'dochazka' tolik řádků, kolik našel aktivních id v tabulce 'soupiska'
- každý řádek do tabulky 'dochazka' by měl obsahovat
- proměnnou $id_akce (vždy stejnou, z GET)
- aktivní id z tabulky 'soupiska' (pro každý řádek své)
- hodnotu 0
}elseif($proved == 'nacti_soupisku'){
$id_akce = $_GET['id'];
$sql_nactiAktualniSoupisku = 'SELECT id FROM soupiska WHERE aktivni = 1';
$dotaz_nactiAktualniSoupisku = mysqli_query($db, $sql_nactiAktualniSoupisku) or die(mysqli_error());
function aktualniSoupiska(){
while($radek = mysqli_fetch_array($dotaz_nactiAktualniSoupisku)){
$soupiska = $radek['id'];
return('(\''.$id_akce.'\',\''.$soupiska.'\',\'0\'), ');
}
}
$sql_vlozAktualniSoupisku = 'INSERT INTO dochazka (akce, soupiska, ucast) VALUES '.aktualniSoupiska();
$dotaz_vlozAktualniSoupisku = mysqli_query($db, $sql_vlozAktualniSoupisku) or die(mysqli_error());
Ať ale dělám co dělám, nezapíše se nic. Ostatní dotazy a zápisy do databáze fungují.
Prosím, nakopněte začátečníka správným směrem. Díky.
-
Ještě bych doplnil, protože na to, možná, jdu špatně - while píše to, co chci a já to jen potřebuji dostat do proměnné.
-
Tohle se neřeší tak, že byste v cyklu generoval příkazy INSERT, ale použijete INSERT from SELECT (https://dev.mysql.com/doc/refman/8.0/en/insert-select.html) – napíšete si SELECT, který vám vrátí tabulku, kterou potřebujete zapsat, a tu pak předáte jako hodnoty do INSERTu.
-
Tohle se neřeší tak, že byste v cyklu generoval příkazy INSERT, ale použijete INSERT from SELECT (https://dev.mysql.com/doc/refman/8.0/en/insert-select.html) – napíšete si SELECT, který vám vrátí tabulku, kterou potřebujete zapsat, a tu pak předáte jako hodnoty do INSERTu.
Super, díky. Fakt stačilo přemýšlet jinak. Nakonec jsemto vyřešil:
'INSERT INTO dochazka (akce, soupiska, ucast) SELECT '.$id_akce.', id, 0 from soupiska'
a ještě je to o dvě třetiny kratší.
-
Z hlediska SQL už je to správně, ale takhle je v tom PHP kódu bezpečnostní díra – SQL injection. Kdyby vám útočník do id_akce vložil
* FROM dual; DROP DATABASE;
tak vám smaže celou databázi.
Je chyba vkládat data do SQL příkazů tak, že je tam vkládáte textově. Správně se to dělá tak, že v textu SQL příkazu jenom řeknete, že tam má být parametr (vloží se tam otazník):
INSERT INTO dochazka (akce, soupiska, ucast) SELECT ?, id, 0 from soupiska
Následně v kódu řeknete, jakou hodnotu parametr má:
mysqli_stmt_bind_param($stmt, "i", $id_akce)
Jsou to prepared statements (https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php).
-
Rozumím a díky. Zkusím ve druhé verzi odhlédnout od toho, že to je, běžně nedostupné, a nebudu dělat takové prasárny. :)
-
Ta funkce aktualniSoupiska() nemůže fungovat správně, protože proměnná $dotaz_nactiAktualniSoupisku není uvnitř dostupná.