PHP, jednoduchá transakční operace do MySQL

PHP, jednoduchá transakční operace do MySQL
« kdy: 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

Kód: [Vybrat]
}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.


Re:PHP, jednoduchá transakční operace do MySQL
« Odpověď #1 kdy: 24. 03. 2019, 22:41:59 »
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é.

Re:PHP, jednoduchá transakční operace do MySQL
« Odpověď #2 kdy: 25. 03. 2019, 07:14:27 »
Tohle se neřeší tak, že byste v cyklu generoval příkazy INSERT, ale použijete INSERT from SELECT – napíšete si SELECT, který vám vrátí tabulku, kterou potřebujete zapsat, a tu pak předáte jako hodnoty do INSERTu.

Re:PHP, jednoduchá transakční operace do MySQL
« Odpověď #3 kdy: 25. 03. 2019, 07:37:14 »
Tohle se neřeší tak, že byste v cyklu generoval příkazy INSERT, ale použijete INSERT from SELECT – 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:

Kód: [Vybrat]
'INSERT INTO dochazka (akce, soupiska, ucast) SELECT '.$id_akce.', id, 0 from soupiska'
a ještě je to o dvě třetiny kratší.

Re:PHP, jednoduchá transakční operace do MySQL
« Odpověď #4 kdy: 25. 03. 2019, 08:26:23 »
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
Kód: [Vybrat]
* 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):

Kód: [Vybrat]
INSERT INTO dochazka (akce, soupiska, ucast) SELECT ?, id, 0 from soupiska
Následně v kódu řeknete, jakou hodnotu parametr má:

Kód: [Vybrat]
mysqli_stmt_bind_param($stmt, "i", $id_akce)
Jsou to prepared statements.


Re:PHP, jednoduchá transakční operace do MySQL
« Odpověď #5 kdy: 25. 03. 2019, 08:56:31 »
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. :)

Kit

  • *****
  • 661
    • Zobrazit profil
    • E-mail
Re:PHP, jednoduchá transakční operace do MySQL
« Odpověď #6 kdy: 25. 03. 2019, 13:02:28 »
Ta funkce aktualniSoupiska() nemůže fungovat správně, protože proměnná $dotaz_nactiAktualniSoupisku není uvnitř dostupná.