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

Č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



Ú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



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



Čtvrtek únor 26, 2009

PHP Funkce pro načtení jednoho řádku ze souboru

· rubrika Clanky · kategorie

Už jsem se mnohokrát setkal s tím, že jsem potřeboval číst data ze souboru po jednotlivých řádcích. Všimnul jsem si také, že mnoho lidí v různých diskuzích se ptá, jak číst ze souboru po jednotlivých řádcích, proto bych se chtěl s Váma podělit o moji funkci, kterou jsem si na to napsal. Funkce rozlišuje tři možné ukončení řádků a lze ji použít i na velké soubory!

Zdrojový kód:

  1. <?php
  2. function getLine($file) {
  3.  
  4.    while (!feof($file)) {
  5.      //precteme znak a pridame ho do bufferu
  6.      $character = fgetc($file);
  7.      $buffer .= $character;    
  8.  
  9.       /**
  10.        * Pohlidame si konec radku (EOL) v souboru:
  11.        *
  12.        *   \n   - Unix
  13.        *   \r\n - Windows
  14.        *   \r   - Mac
  15.        *
  16.        */
  17.        if (($character == "\x0a") || ($character == "\x0d")) {
  18.                   $character = fgetc($file);
  19.           if ($character != "\x0a") {
  20.           // neni soucasti EOL, vratime se o jeden znak zpet
  21.               fseek($file, -1, SEEK_CUR);
  22.           }
  23.           // EOL ukoncime cteni
  24.           break;
  25.       }
  26.           
  27.       }
  28.  
  29.       //vratime jeden radek
  30.       return $buffer;
  31.    }
  32. ?>
Pro jistotu uvádím ještě příklad použití této funkce.

Zdrojový kód:

  1. <?php
  2. $fp = fopen("export.sql", r);
  3. echo "<pre>";
  4. while (($line = getLine($fp, "sql"))!==false){
  5.   $line = trim($line); //odstraneni prazdnych znaku
  6.   if (!empty($line))echo $line."<br />"; //nevypiseme prazdne radky
  7. }
  8. echo "</pre>";
  9. ?>

17:57 — Komentář Stálý odkaz



Středa únor 25, 2009

PHP funkce převádějící čísla na excelovské názvy sloupců

· rubrika Clanky · kategorie

Nedávno jsem programoval export dat z databáze do formátu xlsx (MS Excel), kde jsem využil projektu "PHPExcel":http://www.codeplex.com/PHPExcel/. Jak asi víte, při základním nastavení jsou v Excelu jednotlivé sloupce označeny písmeny např. AC. Využívá se písmen A-Z, kde A odpovída číslu 1, B číslu 2 atd. Při exportu dat jsem tak potřeboval dle počtu sloupců v tabulce vytvořit příslušný počet "excelovských názvů" sloupců.
Po chvilce zamyšlení mne napadlo převést si tento problém do matematiky, kde by se v základu dalo využít způsobu převodu dekadického čísla do jakékoliv jiné číselné soustavy. Stačí si představit písmena A-Z jako čísla 0-25 a k číslu následně přičíst 65 aby jsme dostali odpovídající číselnou hodnotu znaku v ascii tabulce. Toto ovšem nemůžeme použít, nedostali by jsme to co přesně chceme. Po sloupci s označením Z následuje AA, po AZ následuje BA atd., ale pouhým převodem do jiné soustavy dostaneme něco podobného:
Array ( [0] => 90 ) Z
Array ( [0] => 66 [1] => 66 ) BB
Z tohoto důvodu je třeba funkci pro převod upravit. Výslednou funkci i s testovacím výpisem naleznete zde:

Zdrojový kód:

  1. <?php
  2. /* funkce prevadejici cisla 1...n na nazvy sloupcu v excelu A,B,C,...AA,AB,AC,....AAA,AAB,AAC,.... */
  3.  
  4. function getExcelColumnsNames($column) {
  5.   //cisla mensi 26 muzeme rovnou vratit
  6.   if ($column>=26){
  7.     //delime dekadicke cislo 26 dokud neziskame vsechny zbytky po deleni
  8.     while (ceil($column/26)!= 0){
  9.        if (($column % 26)+64 != 64){ //
  10.           $num[] = ($column % 26)+64;        
  11.           $column = floor($column/26);
  12.        }else{
  13.           unset($num);
  14.           break;
  15.        }
  16.     }
  17.   }else{
  18.     $num[] = $column+65;
  19.   }
  20.   return $num;
  21. }
  22.  
  23. // TEST funkce
  24. // vypis 720 sloupcu
  25. for ($j=0; $j<=720;$j++ ) {
  26.   $array = getExcelColumnsNames($j);
  27.   for ($k=count($array); $k>=0;$k--) {
  28.     echo chr($array[$k]);
  29.   }
  30. }
  31. ?>

16:09 — Komentář [2] — Stálý odkaz



XHTML 1.0 Strict - CSS