bigzbig

Reputacja

1,293

Głosów ogółem

użytkownik głosował za tyle razy
89
Użytkownik głosował przeciw tyle razy
9
  • Roczniak
  • Wybitne pytanie
  • Samouk
  • Organizator
  • Komentator
  • Redaktor
  • Popularne pytanie
  • Student
  • Nauczyciel
  • Autobiograf
  • Cofnął głos
  • Krytyk
  • Wsparcie
Prawdziwe imię
Zbigniew Heintze
Członek od
2 lata, 4 miesiące
Ostatnio widziany
1 rok, 2 miesiące temu
Witryna
http://blog.hei...
Miejscowość
Poznań
Wiek
35

O mnie

Programista hobbista :)

Pytania: 7

Odpowiedzi: 99

  • 2010-01-31 20:15:10 Jak w skrypcie PHP pobrać ilość wybranych rekordów z tabeli bazy

    Wydaje mi się, że poprzedzające moją wypowiedzi (za wyjątkiem anii) nie do końca są na temat.

    Po wykonaniu zapytania SQL typu SELECT- jeśli używasz dodatku MySQL najlepiej jest użyć funkcji mysqlnumrows

    <?php    
    $result = mysql_query("SELECT * FROM table", $conn);
    $num_rows = mysql_num_rows($result);
    ?>
    

    Dla zapytań typu DELETE, INSERT, UPDATE z kolei należy skorzystać z funkcji mysqlaffectedrows

    <?php
    mysql_query('DELETE FROM table');
    $num_rows = mysql_affected_rows();
    ?>
    

    W przypadku dodatku MySQL Improved Extension będą to odpowiednio właściwości: num_rows

    <?php
    $stmt = $mysqli->prepare("SELECT * FROM table");
    $stmt->execute();
    $stmt->store_result();
    $num_rows = $stmt->num_rows;
    $stmt->close();
    ?>
    

    oraz affected_rows

    <?php
    $stmt = $mysqli->prepare('DELETE FROM table');
    $stmt->execute();
    $num_rows = $stmt->affected_rows;
    $stmt->close();
    ?>
    

    Z kolei korzystając z PDO wystarczy metoda rowCount

    <?php
    $st = $db->prepare("SELECT * FROM table");
    $st->execute();
    $num_rows = $st->rowCount();
    
    
    $del = $dbh->prepare('DELETE FROM table');
    $del->execute();
    $count = $del->rowCount(); 
    ?>
    

  • 2010-03-03 15:28:01 PHP: klasa dla sesji?

    Możesz używać tradycyjnych sesji tylko "zamknąć" je w obiekcie. Dopisać setery i getery, a także wzbogacić sesje o dodatkowe mechanizmy np. metode get_once, która pobierze wartość z sesji i natychmiast ją usunie. To właśnie możliwość wzbogacania o dodatkowe funkcjonalności przemawia przede wszystkim za tym aby tworzyć klasę do obsługi sesji.

    Takie wrappery ma większość dostępnych frameworków dla PHP jak Kohana PHP czy Symfony. Przykładem jest np. Zend_Session. Oczywiście oprócz zwykłego opakowania można zaimplementować własny system sesji np. oparty o bazę danych. Wszystko zależy od potrzeb.

  • 2010-03-04 12:53:38 Funkcja w funkcji. [zamknięte]

    Funkcje możesz tworzyć w dowolnym miejscu ale nie zawsze masz do niej dostęp z zewnątrz.

    Sposób pokazany przez ~piotreks to tworzenie prototypu metodą konstruktora

    var Foo = function() {
       this.someMethod = function() {
           alert('Some method');
       }
    }
    

    Wywołując obj = new Foo(); powołujesz do życia instancje prototypu Foo. Możesz następnie wywołać metodę obj.someMethod(); lub też tak jak to zrobił ~potreks z pominięciem przypisania obiektu do zmiennej new Foo().someMethod(); Tak czy inaczej zawsze w takim przypadku trzeba utworzyć obiekt. Przy okazji niejako dodam, że w przypadku powoływania wielu obiektów danego prototypu zalecany jest sposób definiowania metod z użyciem prototype (nie mylić z frameworkiem prototype).

    var Foo = function() { };
    
    Foo.prototype.someMethod = function() {
               alert('Some method');
    }
    

    Różnica polega na tym, że w pierwszym przypadku przy powoływaniu do życia nowej instancji za każdym razem metoda someMethod tworzona jest na nowo, a w drugim przypadku jest to cały czas jedna i ta sama metoda.

    Z kolei zdefiniowanie metody w sposób:

    var Foo = function() { };
    
    Foo.someMethod = function() {
        alert('Some method');
    }
    

    Daje możliwość wywołania metody prototypu bez tworzenia obiektu Foo Foo.someMethod(); - to taki jakby odpowiednik metod statycznych w PHP.

    Jak już jesteśmy przy obiektach w JS bardzo popularnym sposobem jest tworzenie obiektu ad hock w następujacy sposób

    var Foo = {
        someMethod: function () {
            alert('Some method');
        }
    }
    

    W tym wypadku Foo nie jest prototypem tylko instancja prototypu Object dlatego oczywistym jest wywołanie Foo.someMethod();.

  • 2010-01-16 21:20:44 Testujemy strone pod IE

    Niestety IE Tester niekiedy nie renderuje strony tak samo jak "właściwa" przeglądarka. Różnice są w niuansach ale w przypadku webdeveloperki to pojedyncze piksele często stanowią źródło sporu. Dlatego też w firmie, w której pracuję stosujemy wirtualki z zainstalowanymi windowsami i przeglądarkami - osobnymi dla każdej wersji IE. Począwszy od wersji 6. Inne rozwiązania jak na razie się nie sprawdziły. Microsoft przygotował nawet swego czasu specjalne wersje Windowsa XP dla webdeveloperów.

  • 2010-01-16 21:35:16 Materiały dot. JavaScript

    Jedna z najlepszych książek na ten temat "JavaScript dla webmasterów. Zaawansowane programowanie" jakie czytałem. Dziś już się pewnie nie przyda bo ludzie powoli przestają pisać w czystym JS na rzecz frameworków jquery, prototype, mootools, yui itp. Gdybyś jednak chciał napisać swój framework javascriptowy to ta lektura będzie dla Ciebie niezbędna.

  • 2010-01-23 00:29:22 Konwencje kodowania

    Dla programistów PHP z pewnością przydatne będą opisy konwencji stosowanych w PEAR a także w Zend_Framework. Są one w dużej mierze zbieżne i można śmiało przyjąć, że wytyczają standardy. Z praktycznego punktu widzenia nie do końca odpowiada mi sposób nazywania plików. Pracując np. nad newsami zdarza się, że edytuję na przemiennie kontroler i model i wtedy w edytorze na zakładkach pojawiają mi się dwa pliki o nazwie News.php. Kiedy takich plików jest więcej robi się to niewygodne.

    Dla CSS-a z kolei rozsądne przydają się reguły opisane w artykule CSS Coding Conventions.

    Edit: Aha zapomniałem jeszcze o tym: Structural Naming Convention in CSS. Dobre rady a propos dobierania nazw uniwersalnych.

  • 2010-02-03 08:54:33 Ładny kod bez warunków

    Duża ilość zagnieżdżeń przede wszystkim zmniejsza czytelność kodu, ale nie jest też bez wpływu na wydajność dlatego zalecane jest takie konstruowanie warunków aby liczba zagnieżdżeń była jak najmniejsza. Oczywiście podstawową radą jest łączenie warunków przy pomocy AND i OR, ale mamy też inne sposoby na zmniejszenie liczby zagnieżdżeń.

    Dobrą metodą jest trzymanie się zasady jak najszybszej ucieczki z funkcji przy pomocy returna.

    zamiast

    <?php
    function foo($a) {
        if ($a == 1) {
            // do something
        } else {
            retun false;
        }
    }
    ?>
    

    lepiej napisać

    <?php
    function foo($a) {
        if ($a != 1) {
            return false;
        }
    
        // do something
    }
    ?>
    

    Można tę zasadę konstruowania negatywnych warunków dodatkowo połączyć z użyciem pętli do .. while (lub od wersji PHP 5.3 konstrukcji goto) w celu ominięcia zbędnych warunków.

    zamiast

    <?php
    function foo($a) {
        if ($a == 1) {
            $a = $a + 1;
            if ($a < 3) {
                $a = 2 * $a;
                if ($a < 10) {
                    // do something
                } else {
                    return $a;
                }
            } else {
                return $a;
            }
        } else {
            return $a;
        }
    }
    ?>
    

    lepiej napisać

    <?php
    function foo($a) {
        do {
            if ($a != 1) break;
            $a = $a + 1;
    
            if ($a >= 3) break;
            $a = 2 * $a;
    
            if ($a >= 10) break;
            // do something
    
        } while(0);
        return $a;
    }
    ?>
    

  • 2010-02-08 21:00:46 .htaccess, błąd 404 i skrypty PHP

    Proponuję zrobić to tak: Wszytko co nie jest istniejącym plikiem lub katalogiem kierować za pomocą .htaccess na index.php

    RewriteCond $1 !^(index\.php)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
    

    I już w php obsłużyć żądanie. Jeśli podany adres jest błędny - czytaj nie wskazuje właściwego zasobu to należy zwrócić stosowny komunikat poprzedzony nagłówkiem 404

    <?php
    header("HTTP/1.0 404 Not Found");
    echo 'Podana strona '.$_SERVER['REQUEST_URI'].' nie istnieje.';
    die;
    ?>
    

  • 2010-02-10 15:01:49 PHP - explode po kilku znakach

    A ja polecam zapoznać się z funkcją preg_split oraz formularzem do testowania wyrażeń regularnych.

    Edit: preg_split('/\s,\s/i', $text);

  • 2010-02-11 12:03:31 Dostęp do bazy danych

    Są tacy co preferują ORM-y i chętnie stosują ActiveRecord, ja natomiast wybrałem DAO.

    ORM-y są dla mnie niepotrzebną nadbudową zmuszającą do uczenia się innej filozofii budowania zapytań gdy tymczasem na dłuższą metę i tak nie obędzie się bez znajomości SQL-a. Paradoksalnie dla prostych aplikacji ORM jest zbyt ciężki i skomplikowany, a dla rozbudowanych, wymagających efektywności aplikacji wprowadza zbyt wiele ograniczeń i praktycznie uniemożliwia optymalizację. Propel czy Doctrine mają już w tej chwili ogromne mnożliwości, ale i tak przy jakichkolwiek problemach programista jest zmuszony najpierw do skonstruowania zapytania SQL po to tylko aby potem próbować przetłumaczyć to na dialekt ORM-a.

    ActiveRecord z kolei nadaje się właściwie tylko do prostych operacji na pojedynczym rekordzie.

    DAO w moim wydaniu to po prostu najczęściej Klasa agregująca metody wykonujące zapytania SQL-owe dotyczące jakiejś logicznej części aplikacji np. newsów. Jeśli źródłem danych nie jest baza tylko np. SOAP to w DAO znajdą się metody pobierające dane via SOAP. Oczywiście w samej klasie DAO używam PDO a w praktyce jakiegoś "składacza zapytań" ułatwiającego konstruowanie zapytań SQL-owych (nie mylić z ORM-em). Tak dla jasności nie utożsamiam pojęcia modelu z relacją (tabelą) w bazie danych gdyż najprostsze operacji typu INSERT, UPDATE, DELETE najczęściej i tak wymagają działania na więcej niż jednej tabeli.