Motywacja
Ciągle sobie mówię, że nie potrafię stawiać dachów, a robię to coraz częściej.
Tata Izy
Niech to będzie dla tych co sobie ciągle mówią, że nic nie potrafią… ;-]
Ciągle sobie mówię, że nie potrafię stawiać dachów, a robię to coraz częściej.
Tata Izy
Niech to będzie dla tych co sobie ciągle mówią, że nic nie potrafią… ;-]
Dlaczego dzieje się tak, że na części stron jakie przeglądam Opera pokazuje mi tekst, który się znajduje w jej cache? Mam ten problem ze stronami haxite.org oraz deviantart.com, dopiero F5 ratuje sytuację. Z joggerem nie ma tego problemu, wszystko jest cały czas aktualne…
Nie podążaj wulgarną drogą; nie poddawaj się nieuważności; nie utrzymuj fałszywych poglądów; nie trwaj długo w świeckim życiu.
Powstań! Nie bądź niedbały! Prowadź swe życie dobrze. Ludzie prawi żyją szczęśliwie i w tym świecie, i w następnym
Tak, wiosna bywa zaskakująca i naprawdę pozytywna
Bez zbędnych “oświadczyn” po prostu. Gdy dwoje ludzi chce być ze sobą, to żadne formułki nie są potrzebne, oni po prostu są ze sobą…
Muszę przyznać, że jestem szczęśliwy ^^
Raz na stronie zlecenia.przez.net znalazłem zlecenie dotyczące stworzenia skryptu, który generuje formularz na podstawie struktury tabeli MySQL. Pomyślałem sobie, że to zadanie jest czymś ciekawym dla mnie i w wolnej chwili postanowiłem napisać prosty (a właściwie prowizoryczny) skrypt, który by wykonywał takie zadanie.
Na początku szukałem przeróżnych funkcji do obsługi MySQL, które oferuje PHP. Coś tam niby znalazłem, ale one były dla mnie niewystarczające. Po prostu nie spełniały moich wymagań. Właściwie bezsensem było szukanie skomplikowanych funkcji. Kluczem do eksportu struktury dla jakiejś tabeli było zapytanie SQL: “SHOW COLUMNS FROM `tabela`”. Wynik tego zapytania zwróci nam (np) coś takiego: Jak widać wynik tego zapytania może być wystarczający do tego aby wygenerować formularz. Także przejdźmy już do jakiś konkretów… Ok to oczywiście standardowo połączenie z bazą danych, oraz natychmiastowe wykonanie zapytania do bazy MySQL. Ok, to skoro połączenie już mamy to teraz czas na fetch’owanie Póki co ta pętla jest pusta. Stało się tak dlatego, że chcę z osobna opisać co się będzie działo. W tej pętli nastąpi “analiza” wyników. Zostanie pobrana nazwa pola, oraz jego typ i default’owa wartość. Wszystkie te informacje zostaną zapisane do tablicy $form, która posłuży później do generowania formluarza. Jak pisałem wcześniej ten skrypt będzie prosty, także nie liczcie na to, że obsłuży każdy typ pola Generalnie sprawa będzie wyglądała tak: Jedynym problemem, może być wyciągnięcie wartości z pól “enum” lub “set”, bo jak wiadomo są one ustawione “z góry” (właśnie dlatego wstawi się do formularza pole radio). Wprawdzie zamiast pola radio można posłużyć się <select> z tylko jedną możliwością wyboru, ale myślę, że przedstawione przeze mnie rozwiązanie nie sprawi większych problemów. Ok, to najpierw pokażę kod, a potem postaram się go objaśnić. Nie wygląda tak źle, prawda? Instrukcja warunkowa jest jasna. Zmylić może wartość zmiennej $options. Funkcja explode “rozrywa” wszystkie stringi, które są podzielone znakiem przecinka (“,”), ale zanim to nastąpi funkcja preg_replace usunie zbędne fragmenty, czyli “enum(” i “)” Wygenerowanie formularza już nie powinno sprawić większych problemów. Na wszelki wypadek na końcu tej notki umieszczę jeszcze cały kod tego skryptu (wraz z wygenerowanym formularzem). Teraz mała uwaga do “znawców”. Jeśli jesteście zdania, że można to zrobić lepiej, to proszę bardzo róbcie, ale nie krytykujcie mnie za to, że zrobiłem to inaczej. Oczywiście wszelkie rady chętnie przyjmę, a błedy poprawię
Teoria
Gdzieś w komentarzach na stronie php.net natknąłem się na pewien ciekawy komentarz.
mysql> show columns from `lol`;
+----------+------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------------------------------------+------+-----+---------+-------+
| test | enum('zlo','dobro','papa smerf','nerd','blah') | NO | | | |
| text | varchar(100) | NO | | | |
| textarea | text | NO | | | |
+----------+------------------------------------------------+------+-----+---------+-------+
3 rows in set (0.04 sec)
Praktyka
define("MYSQL_USER", "user");
define("MYQL_PASS", "pass");
define("MYSQL_HOST", "localhost");
define("MYSQL_BASE", "lol"); // przykladowa nazwa bazy ;p
$tabela ="lol"; // tabela na podstawie której powstanie formularz
$form = array(); // stworzenie tablicy form, która będzie trzymała dane potrzebne to stworzenia formularza
mysql_connect(MYSQL_HOST, MYSQL_USER, MYQL_PASS) or die ("Nie mozna polaczyc sie z baza MySQL!");
mysql_select_db(MYSQL_BASE) or die ("Nie mozna wybrac bazy danych!");
$result = mysql_query("SHOW COLUMNS FROM `$tabela`");
while($row = mysql_fetch_object($result))
{
// (...)
}
if(preg_match("/(enum|set)/", $row->Type))
{
$options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row->Type));
$form[$row->Field] = array("type" => "radio", "value" => $options);
}
Normalnie zmienna $row->Type dla pola “enum” (lub “set”) wygląda tak: enum(‘val1′,’val2′).
Zakończenie
Ten skrypt nie jest doskonały, można dużo zmienić i poprawiać. Nie pokażę kodu zapisującego dane z formularza, bo myślę, że dacie sobie radę (gdyby jednak tak nie było to mogę potem coś o tym naskrobać)
Kodziwo
<?php
// Generator formularza na podstawie struktury bazy MySQL
// Made by radmen
// radmen [at] gmail dot com
// Copyleft
//
define("MYSQL_USER", "root");
define("MYQL_PASS", "mysql-pass");
define("MYSQL_HOST", "localhost");
define("MYSQL_BASE", "lol");
$tabela = "lol"; // tabela na podstawie której powstanie formularz
$form = array(); // stworzenie tablicy form, która będzie trzymała dane potrzebne to stworzenia formularza
mysql_connect(MYSQL_HOST, MYSQL_USER, MYQL_PASS) or die ("Nie mozna polaczyc sie z baza MySQL!");
mysql_select_db(MYSQL_BASE) or die ("Nie mozna wybrac bazy danych!");
$result = mysql_query("SHOW COLUMNS FROM `$tabela`");
while($row = mysql_fetch_object($result))
{
// $row->Field => nazwa rekordu
// $row->Type => typ rekordu
if(preg_match("/(enum|set)/", $row->Type))
{
$options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row->Type));
$form[$row->Field] = array("type" => "radio", "value" => $options);
}
if(preg_match("/(varchar|char)/", $row->Type))
{
$form[$row->Field] = array("type" => "text", "value" => $row->Default);
}
if(preg_match("/text/", $row->Type))
{
$form[$row->Field] = array("type" => "textarea", "value" => $row->Default);
}
}
// Formularz - tutaj wyjątkowo prymitywny ;p
echo "<form>\n";
foreach ($form as $name => $info)
{
if($info['type'] == "text")
{
echo "<p>$name: <input type=\"text\" name=\"$name\" value=\"".$info['value']."\"/></p>\n";
}
if($info['type'] == "textarea")
{
echo "<p>$name <textarea name=\"$name\">".$info['value']."</textarea></p>\n";
}
if($info['type'] == "radio")
{
echo "<p>$name: ";
foreach ($info['value'] as $RadioValue)
{
echo "$RadioValue <input type=\"radio\" name=\"$name\" value=\"$RadioValue\"> ";
}
echo "</p>\n";
}
}
echo "</form>";
?>
Wczoraj chwilkę się męczyłem, aby móc masowo zmienić wymiary dla kilku obrazków. Szukałem, kombinowałem i w końcu przypomniałem sobie, że po Linuksem mam Imagemagick…
Generalnie cały skrypt jest totalnie banalny, ale dla mnie kompletnego n00ba basha to zajęło chwilkę (ok 5 minut ;p), dlatego chcę się podzielić tym mało odkrywczym kodem, oraz z lekka wyjaśnić…
Ci co znają basha to właściwie nie mają po co czytać reszty tej notki
Ok na początek przedstawię od razu jak wygląda całe kodziwo: Ok teraz po kolei… for x in *.jpg – to jest pętla, która listuje wszystkie pliki jpg będące w katalogu. W zmiennej x zostaje zapisana nazwa tego pliku. convert $x -resize 30×30% $x – to oznacza, że plik (którego nazwa jest w zmiennej x) będzie przeskalowany. Jego wymiary będą stanowiłi 30% oryginału. Przeskalowany plik będzie posiadać nazwę “mini_[RESZTA NAZWY ORYGINAŁU].jpg” Tą notkę napisałem tylko dlatego, że być może komuś to się kiedyś przyda. Mi takie rozwiązanie uratowało moje leniwe dupsko, wiem, że to nie jest nic nadzwyczajnego, ale “a nóż widelec”
#!/bin/bash
# Copyleft... whatever.. ;p
#
for x in *.jpg
do
convert $x -resize 30x30% "mini_$x"
done
Oczywiście do polecenia convert możemy dać inne parametry, ale to już odsyłam do manuala.
Przyjrzyjcie się opisowi aukcji xD
Gdyby obrazek jakimś trafem zginął to maci niżej…
Dzięki parv za cynk ;p
Dzisiaj postanowiłem sprawdzić jak w boju sprawuje się Opera. Już podoba mi się to, że tak strasznie nie przymula jak mój FF. ;-]
Przy okazji sprawa do operowców… Co powinienem zrobić z moją Operką, aby była jeszcze milsza w obsłudze? :>
Zapytaj się żydokomunistycznocynicznofaszystowskich czarnych masonów rozprowadzających rosyjską pornografię i narkotyki w bangladejskiej szkole turlania skamieniałych fekalii. WYPIERDALAJ!
Powód skasowania art’a, zapodany przez Sumika ;-p
i tak się dziwnym trafem złożyło, że polski klon digg’a znowu zaliczył glebę ;p