Č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
Ú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
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
Čtvrtek únor 26, 2009
PHP Funkce pro načtení jednoho řádku ze souboru
· rubrika Clanky · kategorie Programování
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:
- <?php
- function getLine($file) {
- while (!feof($file)) {
- //precteme znak a pridame ho do bufferu
- $character = fgetc($file);
- $buffer .= $character;
- /**
- * Pohlidame si konec radku (EOL) v souboru:
- *
- * \n - Unix
- * \r\n - Windows
- * \r - Mac
- *
- */
- if (($character == "\x0a") || ($character == "\x0d")) {
- $character = fgetc($file);
- if ($character != "\x0a") {
- // neni soucasti EOL, vratime se o jeden znak zpet
- fseek($file, -1, SEEK_CUR);
- }
- // EOL ukoncime cteni
- break;
- }
- }
- //vratime jeden radek
- return $buffer;
- }
- ?>
Zdrojový kód:
- <?php
- $fp = fopen("export.sql", r);
- echo "<pre>";
- while (($line = getLine($fp, "sql"))!==false){
- $line = trim($line); //odstraneni prazdnych znaku
- if (!empty($line))echo $line."<br />"; //nevypiseme prazdne radky
- }
- echo "</pre>";
- ?>
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 Programování
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 ) BBZ 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:
- <?php
- /* funkce prevadejici cisla 1...n na nazvy sloupcu v excelu A,B,C,...AA,AB,AC,....AAA,AAB,AAC,.... */
- function getExcelColumnsNames($column) {
- //cisla mensi 26 muzeme rovnou vratit
- if ($column>=26){
- //delime dekadicke cislo 26 dokud neziskame vsechny zbytky po deleni
- while (ceil($column/26)!= 0){
- if (($column % 26)+64 != 64){ //
- $num[] = ($column % 26)+64;
- $column = floor($column/26);
- }else{
- unset($num);
- break;
- }
- }
- }else{
- $num[] = $column+65;
- }
- return $num;
- }
- // TEST funkce
- // vypis 720 sloupcu
- for ($j=0; $j<=720;$j++ ) {
- $array = getExcelColumnsNames($j);
- for ($k=count($array); $k>=0;$k--) {
- echo chr($array[$k]);
- }
- }
- ?>
16:09
—
Komentář [2]
—
Stálý odkaz