Čtvrtek srpen 13, 2009
imagecreatefromjpeg() recoverable error: Premature end of JPEG file
· rubrika Clanky · kategorie Programování
Pokud pracujete s knihovnou GD, mohlo by se vám stát, že narazíte na chybovou hlášku:
imagecreatefromjpeg() recoverable error: Premature end of JPEG file
Naštěstí lze tuto chybou hlášku obejít pomocí nastavení ini souboru, kdy je chyba ignorována a vesele se pokračuje dále. V PHP kódu (lze nastavit i přímo v ini souboru, ale k němu mnohdy není umožněn přístup) se tato možnost nastaví následovně:
ini_set(’gd.jpeg_ignore_warning’, 1);
16:19
—
Komentář
—
Stálý odkaz
Pátek květen 15, 2009
SQL - stručný popis a standardy
· rubrika Clanky · kategorie Databáze
SQL je neprocedurální jazyk, nepopisuje jak pracovat s databází, ale co od ní uživatel potřebuje. Skládá se z několika částí:
- DDL (Data Definition Language) – jazyk pro definici struktury databáze
- CREATE – vytváření nových objektů.
- ALTER – změny existujících objektů.
- DROP – odstraňování objektů.
- DML (Data Manipulation Language) – jazyk pro manipulaci s daty
- SELECT – vybírá data z databáze, umožňuje výběr podmnožiny a řazení dat
- INSERT – vkládá do databáze nová data
- UPDATE – mění data v databázi (editace)
- MERGE – záznam se do tabulky vloží, pokud v tabulce neexistuje odpovídající klíč, nebo se záznam upraví
- DELETE – odstraňuje data (záznamy) z databáze
- SHOW – příkaz pro zobrazení databáze, tabulek nebo záznamů
- DCL (Data Control Language) – jazyk pro řízení transakcí a nastavování přístupových práv
- GRANT – příkaz pro přidělení práv uživateli k určitým objektům
- REVOKE – příkaz pro odejmutí práv uživateli
- BEGIN – zahájení transakce
- COMMIT – potvrzení transakce (úspěšné provedení)
- ROLLBACK – zrušení transakce a návrat do původního stavu
Jazyk SQL má v současné době šest verzí standardu, které jsou vždy označovány dle roku vzniku:
- SQL-89 – první specifikace standardu
- SQL-92 – přinesl modifikace SQL schémat, zavedení tabulek s metadaty , vnějších spojení, kaskádního mazání/aktualizace podle cizích klíčů, množinové operace, transakce, kurzory, výjimky, …
- SQL-99 – rozšíření o regulární výrazy, rekurzivní dotazy, triggery, neskalární typy, objektové vlastnosti, …
- SQL:2003 – přináší XML rozšíření, standardizované sekvence a sloupce s automaticky generovanými hodnotami, odstranění datového typu BIT
- SQL:2006 – definuje způsoby, jak importovat a ukládat XML data v databázích jak s nimi manipulovat uvnitř databáze a také jak publikovat data z databáze do XML formátu
- SQL:2008 – upravuje některá předchozí rozšíření
V dnešní době je většina DBMS založena na standardu SQL-92 a SQL-99
(existují však rozdíly v implementaci ). Implementace významných částí
standardů SQL-2006 a 2008 je pouze u některých produktů (například
Oracle). Bohužel informace o tom, co která databáze ze standardů podporuje,
jsou na internetu velmi špatně dostupné.
Celkový problém SQL spočívá v tom, že každá databáze do něj
přidává své vlastní prvky. Většina databází navíc implementuje pouze
části standardů, většinou dle aktuálních potřeb uživatelů (nebo
obecně trhu), a tak je přenositelnost aplikací složitější. Jako příklad
lze uvést vkládání více řádků pomocí jednoho INSERT dotazu. Dle
standardu by podoba takového dotazu vypadala následovně :
INSERT INTO tabulka VALUES (0,'Petr'), (1,'Pavel'), (2,'Mirek');
Ovšem podpora ze strany databází je různá:
| Databáze | MySQL 5 | PostgreSQL 8.3 | Firebird 2.1 | Oracle 11g | MSSQL 2008 |
|---|---|---|---|---|---|
| Podpora | ano | ano | ne | ne | ne |
09:24
—
Komentář
—
Stálý odkaz
Úterý duben 28, 2009
PHP třída pro tvorbu webových formulářů
· rubrika Clanky · kategorie Programování
Pokud náhodou hledáte v PHP třídu pro jednoduchou a rychlou tvorbu formulářů, zkuste třídu Form. Je šířena pod GNU licencí, takže si ji v případě nutnosti můžete upravit.
17:38
—
Komentář
—
Stálý odkaz
Pondělí duben 27, 2009
Datový typ boolean v databázích
· rubrika Clanky · kategorie Databáze
Datový typ boolean (nebo jen bool) nabívá hodnot TRUE nebo FALSE. Jedná se o jeden ze základních datových typů, přesto by jste ho ve většině databází hledali marně. Například Oracle, MySQL, MSSQL, Firebird a DB2 ho nemají. Opakem je PostgreSQL, který je ovšem v oblasti datových typů známý svou pestrou nabídkou. Proč tedy není v mnoha databázích dostupný? Je to dáno nejspíše tím, že ve standardu SQL se píše, že implementace datového typu bool je volitelná. Jeho absence ovšem není nikterak velkým problémem, nasimulovat ho lze pomocí ostatních dostupných typů. Existují čtyři možnosti:
- char(1)
- tinyint(1)
- bit
- smallint
Obecně by se dal použít jakkýkoliv číselný nebo znakový typ, ale samozřejmě je důležité aby nezabírali zbytečně mnoho místa.
11:43
—
Komentář
—
Stálý odkaz
Středa duben 22, 2009
Rozdíly v implementaci SQL jazyka
· rubrika Clanky · kategorie Databáze
Ti zvás, kteří již měli možnost pracovat s více databázovými
systémy (DBMS), zajisté o této problematice vědí své. I když je SQL
standardizován (existuje 6 verzí SQL-89, SQL-92, SQL-99, SQL:2003, SQL:2006 a
SQL:2008), tak většina DBMS implementuje jen některé části. Mnohdy je
k tomu vedou požadavky uživatelů nebo trhu obecně. V dnešní době je
navíc většina DBMS založena na standardu SQL-92 a implementace
významnějších částí standardů SQL-99 a SQL-2003 je k nalezení pouze
u některých produktů. Poslední standardy SQL:2006 a SQL:2008 jsou na tom
s jejich podporou momentálně nejhůře.
Zhlediska rozdílů v implementaci SQL jazyka v databázích jsem narazil na
zajímavou stránku,
kde se srovnává MySQL, MSSQL, Oracle, PostgreSQL, DB2 a Informix. Věřím,
že některým z vás tato stránka pomůže
20:23
—
Komentář
—
Stálý odkaz
Úterý duben 21, 2009
Optimalizace pro import velkého nmnožství dat do databáze
· rubrika Clanky · kategorie Databáze
Optimalizace se týkají vkládání (importu) většího počtu dat, které bude rychlejší a omezí se případné chyby, které by mohly nastat (typicky závislost mezi primárním a cizím klíčem). Obecně se jedná o následující kroky, které se provedou před vkládáním dat:
- odstranění primárních, cizích klíčů
- deaktivování (odstranění) indexů
- deaktivování (odstranění) trigerrů
- při použití transakcí vypnout tzv. autocommit (mód, kdy je okamžitě každý SQL příkaz implicitně potvrzen jako commit)
- zvýšení pracovní paměti na databázovém serveru
Po úspěšném vložení dat dojde ke znovu vytvoření primárních a
cizích klíčů, aktivování nebo vytvoření indexů a triggerů a
k upravení pracovní paměti na databázovém serveru, pokud byla předtím
hodnota změněna.
Samozřejmě existují optimalizace pro konkrétní typy databází. Například
v PostgreSQL příkaz VACUUM a
v MySQL OPTIMIZE
TABLE, které by se měly používat pokud v tabulce dochází k častým
změnám řádků.
14:04
—
Komentář
—
Stálý odkaz
Sobota duben 11, 2009
"Unbuffered" dotazy
· rubrika Clanky · kategorie PHP
Možná víte, možná nevíte, ale pokud programujete v PHP a položíte
nějaký dotaz na databázi, který vrací výsledky, pomocí klasických
funkcí mysql_query, pg_query atd., tak PHP čeká na všechny
data od databáze, ty si uloží v paměti a teprve následně pak s nima
může programátor pracovat. Při malém množství vrácených záznamů nám
toto vadit nebude, ale co když budeme například exportovat tabulku
s milióny záznamů? Brzo by došla pamět procesu (ne paměť přidělená
PHP skriptu).
Toto by se dalo vyřešit dvěma způsoby:
- – Prvním dotazem si zjistit kolik nám bude vráceno záznamů a pak
v cyklu číst vždy pouhých xxx záznamů, ty následně zpracovat
(samozřejmě také uvolnit použité zdroje
) a pak dalším dotazem si
říct o další, dokud je nepřečteme všechny. - – Použít tzv. „unbuffered“ dotazy, kdy se žádná data nikde neukládají, pomocí funkcí mysql_unbuffered_query, …
Druhý zmiňovaný způsob lze ovšem použít pouze pro databáze MySQL, SQLite a Sybase a má několik nevýhod:
- nelze zjistit počet vrácených záznamů
- tabulka zůstane blokována, dokud se nepřečtou všechny záznamy
- lze pracovat jen s posledním položeným dotazem
A co se děje když položíme dotaz na MySQL pomocí funkce
mysql_unbuffered_query()? Nedalo mne to a prozkoumal jsem si zdrojové kódy
PHP, kde jsem zjistil že se volá funkce
mysql_use_result()
v případě unbuffered dotazů
jinak při normálních dotazech funkce „mysql_store_result()“: http://dev.mysql.com/…-result.html
(funkce jsou z MySQL API pro C).
Rozdíl je v tom, že při volání mysql_use_result() si databáze alokuje
paměť nutnou pro přečtení jednoho záznamu a
ten pošle klientovi a po zavolání funkce mysql_fetch_row() (opět MySQL API
pro C) databáze přečte další řádek a ten pošle klientovi atd. dokud se
nepřečtou všechny záznamy. V opačném případě se čte více dat a jak
jsem již psal PHP si nejdříve vše uloží do paměti a pak stím umožní
pracovat
13:54
—
Komentář
—
Stálý odkaz
Čtvrtek duben 2, 2009
Uvozování identifikátorů v SQL dotazech
· rubrika Clanky · kategorie Databáze
Co je identifikátor snad nemusím vysvětlovatINSERT INTO set (cislo1, cislo2, cislo3) VALUES (0,1,0);MySQL nám vyhodí chybu, jelikož slovíčko set je příkaz (př. SET NAMES utf-8 ) a neočekávalo ho na tomto místě
You have an error in your SQL syntax; check the manual thatZkusme nyní názvy identifikátorů napsat takto:
corresponds to your MySQL server version for the right syntax to
use near 'set
`nazev_identifikatoru`Na databázi pak položíme upravený dotaz:
INSERT INTO `set` (`cislo1`, `cislo2`, `cislo3`) VALUES (0,1,0);Nyní se data úspěšně vloží do databáze, která díky ` zjistí, že bude následovat název identifikátoru. V každé databázi je to však jinak, např. v PostgreSQL se používají dvojté uvozovky ".
18:56
—
Komentář
—
Stálý odkaz
Úterý březen 31, 2009
Zpropadený Firefox aneb synchronizace u XMLHttpRequest
· rubrika Clanky · kategorie AJAX
Je tomu teprve pár týdnů, kdy jsem se začal věnovat AJAXu, protože jsem ho potřeboval použít v mé diplomové práci. V ní jsem potřeboval zavolat jeden skript a po jeho dokončení ho znovu zavolat, jen s jinými parametry. Výsledky běhu skriptu (tzn. proběhlo to ok, nastala nějaká chyba), jsem chtěl zobrazovat do různých objektů na XHTML stránce. Napsal jsem si tedy tři funkce na práci s XMLHttpRequest, kde jsem v jedné z nich použil následující kód:xmlhttp.open("GET",url,false);
Třetí parametr metody open říká, zda se má čekat na odpověď či nikoliv tzn. zda se použije synchroní nebo asynchroní mód.
Celé to funguje tak, že při synchroním přenosu, dojde k vytvoření nového vlákna přičemž původní je pozastaveno (tzn. je pozastavena veškerá interaktivita na straně klienta). V nově vytvořeném vláknu dojde k vyřízení požadavku a po jeho skončení se opět aktivuje vlákno původní a to zpracuje získaný výsledek. V druhém případě se nové vlákno nevytváří a uživatel tak může klidně dále využívat interaktivních stránek a po dokončení požadavku, je jeho výsledek zpracován.
Vše fungovalo dobře v Opeře 9.64, tak jsem to vyzkoušel i v IE 8 a následně ve Firefoxu 3.0.8. Jak jsem překvapivě zjistil, v mé nynější (a nejnovější) verzi Firefoxu synchroní přenos nefunguje (na internetu jsem se po té našel informace o nějakém bugu, ale už nevím kde
Druhou metodou lze poslat více požadavků najednou a současně čekat na jejich vyřízení. Tuto variantu jsem nechtěl použít z důvodu toho, že skript na který se odkazuji exportuje data z databáze a importuje do jiné. Mnohdy jde i o statisíce záznamů a tak jsem nechtěl server moc zatěžovat vícenásobným spuštěním skriptu. Bohužel jsem po několika hodinách dospěl k názoru, že je to jediné možné řešení.
Pokud například chceme výsledky zobrazovat v různých objektech na (X)HTML stránce, tak jako já v diplomce, stačí k tomu použít třídu v JavaScriptu, kde si dokážeme uchovat jednotlivé instance XMLHttpRequestu a id objektu (bez použití třídy by jsme o ně přišli). Napsal jsem si tak vlastní třídu, kterou můžete najít níže. Předem bych chtěl schovívavost ke kódu. Vím, že mnou napsaná třída nesplňuje požadavky na znovupoužitelnost, až budu mít více času upravím ji
Zdrojový kód:
- /**
- * Trida pro vykonavani Http pozadavku (AJAX)
- */
- function HttpClient() { } // HTTPCLIENT CLASS
- HttpClient.prototype = {
- // GET nebo POST
- request_type:'GET',
- // synchroni a nebo asynchroni pozadavek (synchroni nefunguje ve firefoxu 3 neco
) - request_async:true,
- // instance
- xmlhttp:false,
- //kde se zobrazi vysledek
- where_show_content:'',
- // inicializace -> vytvoreni XMLHttpRequest
- init:function() {
- try {
- // Mozilla / Opera / Safari
- this.xmlhttp = new XMLHttpRequest();
- }
- catch (e){
- // IE (snad vsechny nejpouzivanejsi verze)
- var MSXML = new Array('MSXML2.XMLHTTP.5.0',
- 'MSXML2.XMLHTTP.4.0',
- 'MSXML2.XMLHTTP.3.0',
- 'MSXML2.XMLHTTP',
- 'Microsoft.XMLHTTP');
- var ok = false;
- for (var i=0;i < MSXML.length && !ok; i++){
- try {
- this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
- success = true;
- }
- catch (e){}
- }
- if (!success){
- alert('Váš prohlížeč napodporuje AJAX!');
- }
- }
- },
- //provedeni pozadavku
- request: function(url){
- if (!this.xmlhttp){
- this.init();
- }
- this.xmlhttp.open(this.request_type,url,this.async);
- this.xmlhttp.send(null); //pro posilani POST pozadavku
- //zobrazení loadingu
- document.getElementById(this.where_show_content).innerHTML = '<img src=\"images/loading.gif\" alt="" />';
- //zpristupneni this ve funkci
- var self = this;
- this.xmlhttp.onreadystatechange = function(){
- switch(self.xmlhttp.readyState) {
- case 0:
- break;
- case 1:
- break;
- case 2:
- break;
- case 3:
- break;
- case 4:
- if (self.xmlhttp.status == 200) {
- document.getElementById(self.where_show_content).innerHTML = self.xmlhttp.responseText;
- }else {
- alert('HTTP Chyba při vykonávání dotazu: ' + '[' + self.xmlhttp.status + ']' + ' ' + self.xmlhttp.statusText);
- }
- break;
- }
- }
- }
- }
- /**
- * ukazka volani tridy
- */
- var client = new HttpClient();
- client.async = true; //asynchroni mod
- client.where_show_content = 'main-box'; //kde zobrazit vysledek
- client.request('localhost/diplomka?pg=ajax'); //url pozadavku
20:00
—
Komentář
—
Stálý odkaz
Středa březen 4, 2009
Získání dat z meta informací databází (informační schémata)
· rubrika Clanky · kategorie Databáze
Včera jsem se snažil najít informace o tom, jak získat seznam tabulek pro určitou databázi v PostgreSQL . V MySQL lze použít příkaz:
SHOW FULL TABLES FROM databaze WHERE table_type = „BASE TABLE“
Chceme-li přesněji definovat jaké tabulky chceme získat:
SHOW FULL TABLES FROM databaze WHERE table_type = „BASE TABLE“
LIKE „prefix_%“
Hledal jsem proto nějakou alternativu k MySQL příkazu SHOW FULL
TABLES pro PostgreSQl a narazil jsem přitom na stránky člověka Lorenzo Alberton .
Ten na svých stránkách uveřejnil několik tutoriálů
(v anglickém jazyce), kde píše jak získat data z metainformací
databází PostgreSQL , Firebird/Interbase
, Oracle , SQL Server .
V jeho tutoriálech tak můžeme najít nejenom jak získat seznam tabulek,
ale i pohledů, indexů, klíčů atd. Tyto informace mohou být pro mnoho
lidí cenné, proto se tímto chci s váma poddělit o výše uvedené
odkazy
09:55
—
Komentář
—
Stálý odkaz