Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: sokzzuka, dodany: 09.06.2010 21:29, tagi: php

Witam w drugiej części tutoriala. Tematem na dziś będzie łączenie się z bazą MySql i wykonywanie prostych zapytań typu insert czy select. Pierwszą rzeczą jaką trzeba wykonać by móc podłączyć się do bazy MySql jest ściągnięcie sterownika. Paczki dla *nixów są na stronie projektu.Dostępne są też instalki dla Windowsa.

Po zainstalowaniu drivera tworzymy dwa pliki. Pierwszy będzie się nazywał common_db, będziemy go includować za każdym razem gdy będziemy coś robić z bazą, w pliku tym jest funkcja connect, która utworzy nam połączenie z odpowiednimi parametrami:

import MySQLdb
 
def connect():
    oDb = MySQLdb.connect (host="localhost", user="root", db="test")
    return oDb

Dla porównania plik php-owy, który robi dokładnie to samo:

$oDb = new PDO('mysql:dbname=test;host=127.0.0.1', 'root');

Natomiast drugi plik nazywa się test_insert.py , w którym mamy insertowanie danych do bazy:

import common_db
 
oDb = common_db.connect()
content = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
 
def test(path):
    global oDb
    global content
 
    oDb.begin()
    cursor = oDb.cursor()
 
    result = ''
    for i in range(0,1000):
        cursor.execute ("INSERT INTO test1(content) values ('"+content+"')")
        result += "inserted row number"+str(i)+"<br/>"
 
    oDb.commit()
    cursor.close()
    oDb.close ()
 
    return result

Ekwiwalent php:

require 'lib/common_db.php';
 
$sContent = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ';
 
set_time_limit(0);
 
for ($i=0; $i < 1000; $i++){
    $sQuery = "INSERT INTO test1(content) values ('$sContent')";
    $oDb->exec($sQuery);
    echo "inserted row number $i <br/>";
}

Są to skrypty do testów obciążeniowych więc nie dziwcie się, że zapytania tam idą w pętli, oczywiście globale też są złe ;) . Driver Pythonowy nie ma defaultowo ustawionego auto-commita więc wszystkie zapytania typu insert, update, delete trzeba przeprowadzać w transakcji.

Pobieranie z bazy – test_select.py:

import common_db
import random
 
oDb = common_db.connect()
 
def getRandomId(table):
    global oDb
    cursor = oDb.cursor()
    sQuery = 'select max(id) as max, min(id) as min from '+table;
    cursor.execute(sQuery)
    iMax, iMin = cursor.fetchone()
 
    return random.randint(int(iMin),int(iMax))
 
def test(path):
    global oDb
    cursor = oDb.cursor()
    cursor.execute('select * from test1 where id = %s',getRandomId('test1'))
    return cursor.fetchall()

Ekwiwalent php-owy

require 'lib/common_db.php';
function getRandomId($table) {
    global $oDb;
    $sCountStatement = 'select max(id) as max, min(id) as min from '.$table;
    $oCountStatement = $oDb->query($sCountStatement);
    list( $iMin,$iMax ) = $oCountStatement->fetch(PDO::FETCH_NUM);
 
    return rand($iMin,$iMax);
}
 
$sStatement = 'select * from test1 where id = ?';
$oQuery = $oDb->prepare( $sStatement );
 
$iId = getRandomId('test1');
 
$oQuery->execute(array($iId));
$aResult = $oQuery->fetch(PDO::FETCH_ASSOC);
 
echo($aResult['content']);

Aby przetestować powyższy kod, należy utworzyć w katalogu z projektem z pierwszej części tutorialu ww. pliki, uruchomienie jak poprzednio – http://localhost/py/nazwa_pliku_z_przykladem.py.

Jeszcze na koniec taka mała dygresja, w pierwszej części opisałem jak obsługiwać błędy, niestety informacje, które dostawaliśmy z wyjątku były dość skąpe i rzadko pozwalały zidentyfikować problem.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: sokzzuka, dodany: 09.06.2010 18:12, tagi: php

Dzisiejszy post będzie o dwóch przydatnych funkcjach, których dość nagminnie używam. Nie widziałem ich jeszcze nigdzie w internecie za bardzo więc stwierdziłem, że podzielę się nimi z publiką, a nuż się komuś przydadzą. Pierwsza funkcja jest pewnym ulepszeniem var_dump. Pewnie nie raz się Wam zdarzyło, że zostawiliście gdzieś samotnego var_dumpa w kodzie i nie mogliście dość do tego gdzie on się podziewa.

Ta funkcja przy wywołaniu podaje nazwę pliku i linie w której została wywołana, jest to podawane nad dumpem. Z innych ekstrasów dołącza ona formatowanie dumpowanej zmiennej (ta funkcjonalność ma już Zend_Debug), więc wynik jest bardziej czytelny. A więc Pani i Panowie oto ona wraz z przykładem:

function dump() {
    $aTrace = debug_backtrace(false);
    $aArgs = func_get_args();
    echo "<code style='white-space: pre'>";
    echo "Line {$aTrace[0]['line']} \n";
    echo "File {$aTrace[0]['file']} \n";
    call_user_func_array('var_dump',$aArgs);
    echo "</code>";
}
dump('test');
 
/*wynik
Line 4
File D:\www\projekt\index.php
string(4) "test"
*/

Natomiast druga funkcja jaką chciałem przedstawić, to funkcja zamieniająca polskie znaki diakrytyczne na ich odpowiedniki bez ogonków – przydatna przy tworzeniu przyjaznych url-i.

function ascii_encode($input, $encoding = 'utf-8'){
$sResult = iconv($encoding,'ascii//translit', $input);
$aSearch = array(',',"'");
$sResult = str_replace($aSearch, '', $sResult);
return $sResult;
}
 
if(PHP_OS === 'WINNT'){
    setlocale(LC_ALL,'polish');
} else {
    setlocale(LC_ALL,'pl_PL.utf8');
}
 
echo ascii_encode('zażółć gęślą jaźń');
//wynik: zazolc gesla jazn

Bardzo ważną rzeczą w przypadku funkcji ascii_encode jest wcześniejsze wywołanie setlocale, inaczej konwersja nie przebiegnie pomyślnie, co więcej jak zauważyliście inaczej ustawia się locale dla windowsa a inaczej dla całej reszty.

Autor wpisu: Zyx, dodany: 08.06.2010 21:26, tagi: php

Pierwsza rewolucja PHP miała miejsce, gdy programiści odkryli słowo framework i zaczęli tak oto zwanych systemów masowo używać. PHP jest jednym z nielicznych języków, gdzie rynek nie został zdominowany przez "jedyny słuszny" framework. Jedni twierdzą że to wada, inni że zaleta, ponieważ pozwala wypróbować wiele różnych rozwiązań. Ostatnio jednak powoli pojawiają się nowe trendy programistyczne, z których już teraz zaczynają wykluwać się frameworki nowej generacji, które będą podstawą drugiej rewolucji.

Autor wpisu: sokzzuka, dodany: 08.06.2010 09:47, tagi: php

Dzisiaj mija 15 lat od wypuszczenia w świat przez Rasmusa Lerdorfa pierwszej wersji PHP. Więc sto lat niech żyje nam. A tu mały fragmencik kodu z tej archaicznej wersji:

<?
      Function Sum $a,$b,$c (
        return($a+$b+$c);
      );
 
      echo Sum($a,$b,$c);
    >

Dla chętnych na więcej sampli kodu z prehistorycznego PHP polecam manual tej właśnie wersji.

Autor wpisu: sokzzuka, dodany: 07.06.2010 23:47, tagi: php

I jak to mówi jeden bloger “piekło zamarzło”. Dziś właśnie został commitowany do php-owego trunka patch z featurem znanym też jako “function array dereferencing”. Co to oznacza ? Mniej więcej tyle, że od dziś będzie można robić coś takiego:

function foo(){
    return array('baz','bar');
}
//nowy feature !!!
echo foo()[0];

Dotychczas nie było możliwości by z funkcji zwracającej tablice od razu odwołać się do jej elementu. Należało zrobić to przez zmienną tymczasową. Szczegóły i patch można znaleźć na http://wiki.php.net/rfc/functionarraydereferencing.

Autor wpisu: Śpiechu, dodany: 06.06.2010 22:52, tagi: php, zend_framework

Na stronie Zend Framework macie podane konwencje/standardy dotyczące formatowania kodu, nazewnictwa i dokumentacji. Chciałbym pewne rzeczy rozszerzyć w oparciu o własne obserwacje kodu ZF i zalecenia twórców/ekspertów (głównie z ich blogów). Nie będę oczywiście bawił się w tłumacza. Mam nadzieję, że ten 3 częściowy wpis się komuś przyda. Dzielę go z braku czasu… 1. Formatowanie [...]

Autor wpisu: sokzzuka, dodany: 06.06.2010 21:55, tagi: php, apache

Czasami przychodzi ten dzień, że mamy dość naszego poczciwego PHP. Czasami nawet nie mamy go dość ale chcielibyśmy spróbować coś innego, albo po prostu w pracy chcą, żebyśmy coś napisali w jakimś innym języku. W mojej pracy magisterskiej mam między innymi porównać wydajność dwóch języków (vel interpreterów języków) skryptowych – PHP i Pythona w typowych zastosowaniach (pobieranie rekordów z bazy, parsowanie xml etc).

Stanąłem więc przed wyzwaniem nauczenia się Pythona, a co więcej podpięcia go apache-a, aby generował jakieś strony. Artykuł ten będzie krótkim tutorialem, o tym jak skonfigurować Pythona i Apache-a oraz odpalić prostą PHP-like aplikacje. Mam nadzieje również, że ten artykuł przerodzi się w jakąś dłuższą serię o tym jak zrobić to samo w obu językach ;) .

Taka mała uwaga odnośnie tekstu, zakładam, że czytający ten tekst znają podstawy pythona umożliwiające napisanie prostego skryptu “Hello World”, jeżeli nie, to polecam “Zanurkuj w Pythonie” – dobry wstęp/tutorial.

Setup.

Zakładam, że wszyscy mają skonfigurowanego Apache-a w celu tworzenia aplikacji PHP-owych.  Pierwszym krokiem jaki będziemy musieli uczynić to ściągnięcie odpowiedniej paczki instalacyjnej Pythona (najlepiej wersji 2.6).

Jako, że pracuje na Windowsie, ściągałem pierwszą z góry paczkę. Jest to fajny instalator, który po kilku kliknięciach zainstaluje i skonfiguruje nam Pythona, nie ma tu żadnych specyficznych opcji więc nie będę się zagłębiał.

Drugim krokiem będzie ściągnięcie mod_wsgi, jest tam kilka paczek dla Windowsa i Linux-a, specyficznych dla konkretnych wersji interpretera, my ściągamy tą dla wersji 2.6. Ściągnięta paczkę rozpakowujemy i kopiujemy do katalogu rozszerzeń apache-a (katalog_apache/modules).

Następnie otwieramy plik httpd.conf i dodajemy następujące linie.

LoadModule wsgi_module modules/mod_wsgi-win32-ap22py26-3.0.so
<IfModule wsgi_module>
WSGIScriptAlias /py D:/python_test/index.py
</IfModule>

Gdzie oczywiście mod_wsgi-win32… jest nazwą pliku modułu, który skopiowaliśmy. Natomiast dyrektywa WSGIScriptAlias mówi apache-owi, że cały ruch, który przychodzi na adres http://localhost/py ma przekierowywać do skryptu znajdującego się w ścieżce D:/python_test/index.py .

Gdy już powpisywaliśmy wszystko do httpd.conf, zapisujemy plik i restartujemy apache-a. Jeżeli wszystko poszło gładko to nie powinno być żadnych błędów logu błędów apache-a. W razie błędów, polecam Wiki projektu mod_wsgi. Tam znajdziecie odpowiedzi na większość pytań związanych z instalacją.

Nasz pierwszy web-owy skrypt.

Każda aplikacja działająca na mod_wsgi musi stosować się do specyfikacji WSGI (Web Server Gateway Interface), która została opisana w jakimś tam mądrym dokumencie Pythonowym. Jest on długi i nudny więc bez większych ceregieli powiem to co ważne.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.