Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
PHP
Z SQL přímo do www formuláře
17. ledna 2000, 00.00 | Praktický příklad jednoduchého univerzálního editoru dat v sql.
V jednom z předcházejících článků jsme si ukázali jak použít fci mysql_field_name(). Nyní si předvedeme i použití dalších funkcí pracujících s informacemi o tabulce v sql.
Praktickým příkladem nám bude procedura na vytvoření formuláře dle tabulky. Formulář převezme nejen jména položek, ale i jejich max délku a jiné vlastnosti (blob bude jako textarea a bool jako checkbox). Jde vlastně o takový jednoduchý univerzální editor dat v SQL.
Použité funkce:
mysql_field_type($res,$j) typ buňky (string, int, blob, real, unknown)
mysql_field_name($res,$j) jméno sloupce tabulky
mysql_field_len($res,$j) délka položky (maximální)
mysql_field_flags($res,$j) mezerou oddělené vlastnosti buňky (auto_increment, not_null, primary_key ap.)
Samotná filosofie programu:
Úkolem procedury je vygenerovat forumulář odpovídající zadané tabulce. A to jak velikostí položek tak i přiřazením správného input objektu ve formuláři (textarea, text, checkbox ap.).
Zde nastává malý problém, protože se můžeme domnívat že blob může obsahovat text na několik řádek (nutný textarea) zatímco varchar nemusí (pak stačí text, který je možno rozměrově omezit). Dalším problémem je funkce mysql_field_type, která rozpozná jen omezený počet typů a např. tinyint (==bool) vrací jako neznámý. Pro tento případ je třeba použít trochu heuristiky..
Dále např. nemáme zájem o editaci položek jenž jsou auto_increment ap..
Jak je vidět problémů je hned několik a není záruka, že procedura bude fungovat na všechny tabulky jak bysme si představovali.
Kód:
tabulka:
CREATE TABLE test (
uid int(11) DEFAULT '0' NOT NULL auto_increment,
xxx blob,
string varchar(255) DEFAULT '' NOT NULL,
cislo int(20) DEFAULT '0' NOT NULL,
b tinyint(1) DEFAULT '1' NOT NULL,
PRIMARY KEY (uid)
);
INSERT INTO test VALUES (2,'aaa\nbbb\ncccc','STR\" aha',12334,0);
Php:
\n";
for($i=0; $i<$rows; $i++)
for($j=0; $j<$cols; $j++)
{
$type=mysql_field_type($res,$j);
$name=mysql_field_name($res,$j);
$len=mysql_field_len($res,$j);
$flags=mysql_field_flags($res,$j);
$data= mysql_result($res,$i,$j);
if(strstr($flags,"auto_increment")) continue;
echo "$name: ";
switch($type) {
case "blob":
$data=htmlspecialchars($data);
echo "\n";
break;
case "string":
$data=htmlspecialchars($data);
default:
/* ostatni, co lze editovat jako text
ale napr. i boolean (v mysql bool (tinyint))
ale v $type jako unknown
*/
if($len==1&&($data==0||$data==1))
{
/* zrejme jde o booloskou hodnotu */
if($data) $ch="checked";
echo "\n";
}
else {
$size=$len<30?$len:30;
echo "\n";
}
}
//echo "$type $name $len $data ($flags)
";
}
echo "\n"
?>
Výstup:
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007