Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/blue-team.org/bcblog/textpattern/lib/txplib_db.php on line 14 Bc. BLOG: Články

Čtvrtek srpen 13, 2009

imagecreatefromjpeg() recoverable error: Premature end of JPEG file

· rubrika Clanky · kategorie

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

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í:

  1. DDL (Data Definition Language) – jazyk pro definici struktury databáze
  1. DML (Data Manipulation Language) – jazyk pro manipulaci s daty
  1. DCL (Data Control Language) – jazyk pro řízení transakcí a nastavování přístupových práv

Jazyk SQL má v současné době šest verzí standardu, které jsou vždy označovány dle roku vzniku:

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

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

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:

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

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

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:

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

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:

  1. – 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.
  2. – Použít tzv. „unbuffered“ dotazy, kdy se žádná data nikde neukládají, pomocí funkcí mysql_unbuffe­red_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:

A co se děje když položíme dotaz na MySQL pomocí funkce mysql_unbuffe­red_query()? Nedalo mne to a prozkoumal jsem si zdrojové kódy PHP, kde jsem zjistil že se volá funkce
mysql_use_resul­t() v případě unbuffered dotazů
jinak při normálních dotazech funkce „mysql_store_re­sult()“: 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

Co je identifikátor snad nemusím vysvětlovat V databázích to jsou názvy tabulek, databází, sloupců a aliasů. Co se stane, když následující dotaz položíme na MySQL databázi?
INSERT 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ě Konkrétně vypíše:
You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to
use near 'set
Zkusme nyní názvy identifikátorů napsat takto:
`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

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 ) a já potřeboval aby to fungovalo ve všech nejpoužívanějších prohlížečích.

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:

  1. /**
  2.  * Trida pro vykonavani Http pozadavku (AJAX)
  3.  */
  4.  function HttpClient() { } // HTTPCLIENT CLASS
  5.  HttpClient.prototype = {
  6.   // GET nebo POST
  7.   request_type:'GET',
  8.   // synchroni a nebo asynchroni pozadavek (synchroni nefunguje ve firefoxu 3 neco )
  9.   request_async:true,
  10.   // instance
  11.   xmlhttp:false,
  12.   //kde se zobrazi vysledek
  13.   where_show_content:'',
  14.  
  15.   // inicializace -> vytvoreni XMLHttpRequest
  16.   init:function() {
  17.     try {
  18.       // Mozilla / Opera / Safari
  19.       this.xmlhttp = new XMLHttpRequest();
  20.     }
  21.     catch (e){
  22.       // IE (snad vsechny nejpouzivanejsi verze)
  23.       var MSXML = new Array('MSXML2.XMLHTTP.5.0',
  24.          'MSXML2.XMLHTTP.4.0',
  25.          'MSXML2.XMLHTTP.3.0',
  26.          'MSXML2.XMLHTTP',
  27.          'Microsoft.XMLHTTP');
  28.       var ok = false;
  29.       for (var i=0;i < MSXML.length && !ok; i++){
  30.         try {
  31.           this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
  32.           success = true;
  33.         }
  34.         catch (e){}
  35.       }
  36.       if (!success){
  37.         alert('Váš prohlížeč napodporuje AJAX!');
  38.       }
  39.     }
  40.   },
  41.   
  42.   //provedeni pozadavku
  43.   request: function(url){
  44.     if (!this.xmlhttp){
  45.       this.init();
  46.     }
  47.     this.xmlhttp.open(this.request_type,url,this.async);
  48.     this.xmlhttp.send(null); //pro posilani POST pozadavku
  49.    
  50.     //zobrazení loadingu
  51.     document.getElementById(this.where_show_content).innerHTML = '<img src=\"images/loading.gif\" alt="" />';
  52.    
  53.     //zpristupneni this ve funkci
  54.     var self = this;
  55.     this.xmlhttp.onreadystatechange = function(){
  56.       switch(self.xmlhttp.readyState) {
  57.       case 0:
  58.         break;
  59.       case 1:
  60.         break;
  61.       case 2:
  62.         break;
  63.       case 3:
  64.         break;
  65.       case 4:
  66.         if (self.xmlhttp.status == 200) {
  67.           document.getElementById(self.where_show_content).innerHTML = self.xmlhttp.responseText;
  68.         }else {
  69.           alert('HTTP Chyba při vykonávání dotazu: ' + '[' + self.xmlhttp.status + ']' + ' ' + self.xmlhttp.statusText);
  70.         }
  71.         break;
  72.       }
  73.     }
  74.   }
  75.  }
  76.  
  77. /**
  78. * ukazka volani tridy
  79. */
  80. var client = new HttpClient();
  81. client.async = true; //asynchroni mod
  82. client.where_show_content = 'main-box'; //kde zobrazit vysledek
  83. 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

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/Inter­base , 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



Starší

XHTML 1.0 Strict - CSS