Autor Zpráva
Nevim
Profil *
Ahoj, měl bych takový asi banální problém, ale nějak nevím jak s tím hnout. Mám funkci která ukládá do db. jako parametr má název tabulky, sloupečky a data. Potom je druhá funkce která pomocí foreach rozdělí post a měla by výsledky předávat do té funkce na ukládání.
  require "../database.php";
function SplitF(){
  foreach ($_POST as $key => $value) {
   return "'".$value."',";
  }
}
$data = SplitF();
 

  ZapisDoDb("tabulka","Jmeno,Prijmeni");

  function ZapisDoDb($tbl,$columns,$data)
  {
    $dotaz="INSERT INTO $tbl($columns)
        VALUES($data)";
        mysql_query($dotaz);
  }  
No problém je že to sice do db ukládá, jenomže vždycky jenom jednu hodnotu a tolikrát kolikrát proběhne funkce SplitF. Něví někdo co s tím?
Děkuji
BuGeR
Profil
Nevim:
Ta funkce pracuje s proměnnou $data - kterou ale nepředávaš.. Takže 10 řádek přepiš na:
ZapisDoDb("tabulka","Jmeno,Prijmeni", $data);
Nevim
Profil *
Jo děkuju toho jsem si nevšiml, ale to pořád neřeší můj problém, když vypíšu data, tak mi to vypíše pouze první hodnotu z formuláře v apostrofech, takže problém bude s foreachem. pokud dám echo v foreachu je to ok, tedka to potřebuju pořešit v té funkci. asi místo return bych tam dal nějakou proměnnou, ale co potom?
Keeehi
Profil
Problém je, že jakmile se narazí na return, funkce končí.
function SplitF(){
  $out = "";
  foreach ($_POST as $key => $value) {
   $out .= "'".$value."',";
  }
  return substr($out,0,-1);
}

Jinak tento kód nemá ošetřené sql injections. Navíc je to zbytečně složité. Mnohem přehlednější je:
$jmeno = mysql_real_escape_string($_POST["jmeno"]);
$prijmeni = mysql_real_escape_string($_POST["prijmeni"]);

$sql = "INSERT INTO tabulka (Jmeno, Prijmeni) VALUES('$jmeno','$prijmeno')";
mysql_query($dotaz);

Pokud však chcete používat něco co Vám usnadní práci s databází, použijte již něco hotového, prověřeného, zabezpečeného a nebastlete svoje funkce. Můžu doporučit třeba dibi.
Nevim
Profil *
Děkuji už to funguje jenom taková technická, dneska mi to nemyslí na co ten substr?
DarkMeni
Profil
Aby si neměl na konci zbytečně čárku, tím by vznikl neplatný sql dotaz, to by zase uměl řešit implode:
return '"'.implode('", "', $_POST).'"';
ale ten by vrátil všechno co v poli $_POST je, takže i tím by mohl vzniknout neplatný SQL dotaz.
Nejlepší je tahat jen to, co potřebuješ.
Nevim
Profil *
Keeehi
tak jasně že je jednodušší napsat klasický sql dotaz, jenomže já dělám web kde těch sql dotazů bude hejno, takže jednodušší je zavolat funkci, předat jí název tabulky a sloupečků a hotovo. Mimochodem v tom mém řešení asi nepůjde použít mysql_real_escape_string, že? třeba někde v tom foreachu... :)
DarkMeni
Profil
Jo, přesně tam by to šlo použít. Ale s tím foreachem je pořád možnost že v formuláři bude třeba o 1 input s jménem navíc a pak by do dotazu šlo něco jako:
INSERT INTO tabulka(Jmeno, Prijmeni) VALUES ("Jméno", "Příjmení", "Další zbytečná hodnota co byla náhodou v formuláři");
3tí sloupec tam není, takže buď vyhodí chybu syntaxe a nebo v tom udělá chaos
Nevim
Profil *
No tak já v kodu tu funkci budu volat a můžu jí zadat kolik sloupečků potřebuju, podle inputů ve formuláři, taková univerzální funkce. Jinak jak do toho foreachu narvu ten real_escape_string?
Keeehi
Profil
Nevim:
Jinak jak do toho foreachu narvu ten real_escape_string?
No přece kolem toho, na co chceš tu funkci aplikovat. V tomto případě jí obalit proměnnou $value.

A Ještě jednou. Proč znovu vymýšlet kolo, když už ho někdo vymyslel? Navíc toto kolo oproti vašemu dřevěnému má i pneumatiku, a nerozbíjí se po pár ujeých kilometrech a jde lehce namontovat na každé auto.
Nevim
Profil *
No tak za prvé, tomu dibi nerozumím, ikdyž je to pěkně popsaný, nevím jak to funguje. navíc dělám web jako ročníkovou práci do školy a nemůžu tam použít něco co jsme se neučili, to by asi vypadalo trochu jako opisování. A tímhle si chci kod zjednodušit. Nebo řekni mi jaké jsou tamtoho řešení výhody, co to umí atd, já tomu moc nerozumím.
Takže by ten foreach mohl vypadat takhle: foreach (mysql_real_escape_string($_POST) as $key => $value)?
Keeehi
Profil
1) Psal jsem, že tím máš obalit $value. To je to, co chceš ošetřovat
2) Rozhodně to necpi dovnitř foreach.

Dibi třeba například řeší právě to ošetřování vstupů za tebe.
$data = array (
    "Jmeno" => $_POST["jmeno"],
    "Prijmeni" => $_POST["prijmeni"]
);

dibi::query('INSERT INTO [tabulka]', $data);

No řekni, jestli to není hezčí.
Nevim
Profil *
Jo to vypadá hezky, jenomže fakt mi to nepůjde použít. nemůžu jentak z webu stáhnout hotový řešení kterýmu ani nerozumím a vydávat ho za svoje. Jinak proměnná value je pouze v foreachu, takže ten tvůj druhý bod že real escape tam nemám cpát mi trochu nesedí. Upravil jsem kod, tak že nepřiřazuju té funkci proměnnou, ale přímo v sql dotazu jí volám, tak kam dát ten real_escape? Omlouvám se za tu natvrdlost a děkuji za trpělivost :)
function SplitF(){
  $out = "";
  foreach (mysql_real_escape_string($_POST) as $key => $value) {
   $out .= "'".$value."',";
  }
  return substr($out,0,-1);
}


ZapisDoDb("tabulka","Jmeno,Prijmeni,RodC");

  function ZapisDoDb($tbl,$columns)
  {
    $dotaz="INSERT INTO $tbl($columns)
        VALUES(".SplitF().")";
        mysql_query($dotaz);
  }  
panther
Profil
Nevim:
$out .= "'".mysql_real_escape_string($value)."',";
Keeehi
Profil
Nevim:
Nikdo tu nemluví o vydávání za svoje.

No když to nemá být ve foreachTak to musí být o kousek dál:
$out .= "'".mysql_real_escape_string($value)."',";

Ale jak už psal DarkMeni, jakmile se ve formuláři objeví input navíc, máte problém. A to že vy jich do formuláře napíšete správný počet neznamená, že si útočník nemůže další přidat. Další věc je, že se spoléháte na pořadí, ve kterém ta data v postu přijdou.
Nevim
Profil *
No a oni se data můžou v POST přeházet?
Navíc počet útočníků je minimalizován přihlašováním do celého webu, tam je real_escape string, session a další
panther
Profil
Nevim:
oni se data můžou v POST přeházet?
rozhodně bych se nespoléhal na to, že přitečou v nějakém pořadí.
Nevim
Profil *
No a co s tím? mou snahou je vytvořit univerzální skript bez použití OOP jako je dibi.
Na webu bude spousta formulářů a chci to ukládat jediným skriptem, proto takovýhle akce. A nedal by se POST nějak seřazovat?
Tori
Profil
Nevim:
Ještě by šlo tu funkci pro zápis volat takto: ZapisDoDb('jménoTabulky', 'sloupec1,sloupec2,sloupec3', $_POST);Tzn. funkce ZapisDoDb si rozebere řetězec s názvy sloupců, potřebná data si sama vezme z pole, zadaného jako 3.parametr a sama si doplní escapování. Funkce SplitF by už nebyla potřeba. (Případná chybějící data / nevyplněná pole by se pak ověřovala mimo funkci ZapisDoDb.)
DarkMeni
Profil
Nepotřebuješ něco jako:
function funkce($table, $columns, $indexes){
  //kontrola správnosti argumentů
  if(!(isset($table) || isset($columns) || isset($indexes) || is_array($columns) || is_array($indexes)) || count($columns) < 1 || count($columns) != count($indexes)){
    return false;
  }
  $values = '';
  foreach($indexes as $index){
    $values .= (isset($_POST[$index]) ? mysql_real_escape_string('"'.$_POST[$index].'"') : 'NULL').', ';
  }
  return mysql_query('INSERT INTO `'.$table.'` (`'.implode('`, `', $columns).'`) VALUES ('.substr($values, 0, -2).')');
}
//funkce($table (string) = Název tabulky, $columns (array) = Sloupce v tabulce, $indexes (array) = Indexy v $_POSTu)
funkce('tabulka', array('Jmeno', 'Prijmeni'), array('jmeno', 'prijmeni'));
?
A to vlastně udělá:
mysql_query('INSERT INTO `table` (`Jmeno`, `Prijmeni`) VALUES ("'.mysql_real_escape_string($_POST['jmeno']).'", "'.mysql_real_escape_string($_POST['prijmeni']).'")');
Což je i kratší, tak proč neni možný to napsat rovnou tak?
Nevim
Profil *
No je to pěkné řešení, jenomže jak by vypadal sql dotaz? bylo by tam něco jako Values($_POST["name"]....) no a to je znovu problém, protože potom bych zase musel pro každý formulář používat zvlášt sql dotaz, nebo bych musel mít všude stejný name např A,B,C... a tím si znepřehlednit formy a stejně každý formulář má různý počet inputů...
Nebo možná to myslíš dobře, jenom jsem to špatně pochopil


To by možná fungovalo, ta předchozí zpráva byla na Tori
Tori
Profil
Nevim:
Názvy formulářových polí by se musely shodovat s názvy DB sloupců.
Máte proměnné $sloupce a $hodnoty (pro SQL dotaz). Rozsekáte zadané názvy sloupců na pole a procházíte ho cyklem. Uvnitř cyklu:
1. ukládáte si postupně názvy sloupců (kvůli pořadí) do $sloupce,
2. ze 3.parametru čtete $data[$nazevSloupce], escapujete hodnotu a přidáte ji do $hodnoty. Pokud takový prvek pole neexistuje nebo je prázdný, pole formuláře je nevyplněné. V tom případě buď uložíte hodnotu NULL, nebo ten sloupec do dotazu nepřidáváte vůbec, nebo vyhodíte chybu (podle toho, jestli se nevyplněná pole kontrolují už dřív, nebo až tady).
Za cyklem poskládáte kompletní dotaz a provedete.
Lamicz
Profil
Keeehi:
Kdyby David Grudl taky jenom "někde něco postahoval" a použil, nikdy by to nette a dibi nevymyslel ;) Právě to, že se tím má chuť někdo zabývat, vede k pokroku.
Keeehi
Profil
Lamicz:
Ano, jenže David Grudl je na úplně jiné úrovni a v době, kdy vytvářel nette a dibi na to měl potřebné znalosti a zkušenosti. Jenže Nevim, jak je vidět, nemá potřebné znalosti ani na vytvoření toho, o co se snaží.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0