<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4173337481551559793</id><updated>2024-09-04T16:47:08.933+02:00</updated><category term="php"/><category term="Apache"/><category term="funkcja"/><category term="obiekty"/><category term="proxy"/><category term="PHP funkcja echo"/><category term="balancer"/><category term="błędy"/><category term="ciąg Fibonacciego"/><category term="class"/><category term="construct"/><category term="destruct"/><category term="destruktor"/><category term="dom"/><category term="echo"/><category term="function"/><category term="klasa"/><category term="kod"/><category term="konfiguracja"/><category term="konstruktor"/><category term="mysql"/><category term="mysqli"/><category term="parent"/><category term="php obiekty programowanie mysqli msql domdocument dom"/><category term="php porady"/><category term="php porady kod błędy"/><category term="prepare statement"/><category term="programowanie domdocument"/><title type='text'>Walki z PHP</title><subtitle type='html'>Postaram się przekazać swoje doświadczenia z PHP, oraz innych dziwnych rzeczach, typu MySQL, DB2. Czyli to co umiem. Blogoczytelników o słabych nerwach proszę o nieczytanie tego blogu. Dlaczego? Jeszcze nie wiem.&#xa;W razie pytań z dziedziny PHP proszę pytać, jest cień możliwości że akurat to wiem. ;)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-842075553971166961</id><published>2015-07-07T14:36:00.000+02:00</published><updated>2015-07-07T14:37:43.754+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ciąg Fibonacciego"/><category scheme="http://www.blogger.com/atom/ns#" term="funkcja"/><category scheme="http://www.blogger.com/atom/ns#" term="obiekty"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Funkcja obliczające ciąg Fibonacciego</title><content type='html'>Witam.

Natchniony jakimś blogiem przedstawiam prostą punkcje obliczający ciąg Fibonacciego.

&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;
&amp;lt;?php
function fibonacci($count, $f1=0, $f2=1) {
    if ($count &amp;lt; 1) return 0;
    $return = $count &gt;1 ? fibonacci($count -1, $f2, $f1 + $f2) : $f2;
    return $return;
}

echo fibonacci(19);
?&gt;
&lt;/pre&gt;

Trzeba uważać żeby nie przesadzić z liczbą. Można dopisać if ($count &gt; 10000) return null;.
Analizować raczej nie trzeba. Jeżeli $count jest większy niż 1 wywołaj funkcję i licz dalej zwróć ostatni wynik.
Można to zrobić w pętli for, ale to wydaje mi się bardziej proste i przejrzyste i pozwala myśleć obiektowo.

Powodzenia.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/842075553971166961/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2015/07/funkcja-obliczajace-ciag-fibonacciego.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/842075553971166961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/842075553971166961'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2015/07/funkcja-obliczajace-ciag-fibonacciego.html' title='Funkcja obliczające ciąg Fibonacciego'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-5895732368962976965</id><published>2012-09-23T09:09:00.000+02:00</published><updated>2012-09-23T09:12:01.222+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="class"/><category scheme="http://www.blogger.com/atom/ns#" term="construct"/><category scheme="http://www.blogger.com/atom/ns#" term="destruct"/><category scheme="http://www.blogger.com/atom/ns#" term="destruktor"/><category scheme="http://www.blogger.com/atom/ns#" term="echo"/><category scheme="http://www.blogger.com/atom/ns#" term="function"/><category scheme="http://www.blogger.com/atom/ns#" term="funkcja"/><category scheme="http://www.blogger.com/atom/ns#" term="klasa"/><category scheme="http://www.blogger.com/atom/ns#" term="konstruktor"/><category scheme="http://www.blogger.com/atom/ns#" term="parent"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Programowanie obiektowe w PHP. (cz. 3)</title><content type='html'>Programując w Javie na Androida są dostępne w klasie dwie ciekawe metody. onCreate, onDestroy. Takie cacka dostępne są też w PHP. Nazywają się &lt;b&gt;__construct&lt;/b&gt; i &lt;b&gt;__destruct&lt;/b&gt;. Jedna i druga zaraza jest dziedziczona. Teraz trochę z nimi zamieszam. Uwaga!

Załóżmy że mamy taki malusi przykładzik.

&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;
&amp;lt;?php
class klasa_a {
 function &amp;#095;&amp;#095;construct() {
 echo &quot;Się skonstruowało! &amp;lt;br&gt;&quot;;
 }
}
$ob = new klasa&amp;#095;a();
?&gt;
&lt;/pre&gt;

Jak widać wiem co nieco o HTML&#39;u. ;-) 
Mamy prostą klasę i se ją wywołujemy, pakując do zmiennej $ob, co spowodowało objawieniem się napisu. Co by utrudnić życie, zrobimy drugą klasę na podstawie tej pierwszej. Ci od Androida (ja do nich też należę)  tak mają, to czemu nie w PHP. Nie można? A trzeba!

&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;
&amp;lt;?php
class klasa_a {
 function __construct() {
  echo &quot;Się konstruowało!&lt;br&gt;&quot;;
 }
}

class klasa_b extends klasa_a {
}
$ob = new klasa_b();
?&gt;
&lt;/pre&gt;

Wywołujemy klasę która jest rzekomo pusta, a tu pojawia się napis. To żaden cud, błąd, spisek, układ. Klasa b dziedziczy wszystko co ma klasa a, włącznie z konstruktorami i całym dobrodziejstwem inwentarza. Dziedzictwo oczywiście można nadpisać.

&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;
&amp;lt;?php
class klasa_a {
 function __construct() {
  echo &quot;Się skonstruowało! &amp;lt;br&gt;&quot;;
 }
}

class klasa_b extends klasa_a {
 function __construct() {
  echo &quot;Dziedziczone &quot;;
 }
}
$ob = new klasa_b();
?&gt;
&lt;/pre&gt;

Jak widać wyświetliło się co innego, metoda została nadpisana. Ale co zrobić że w klasie a podoba mi się wpis i chcę dodać drugi w klasie b? Jest na to metoda. Zmieniamy w klasie b konstruktor tak.

&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;
function __construct() {
 echo &quot;Dziedziczone &quot;;
 parent::__construct();
}
&lt;/pre&gt;

Po prostu odwołujemy się do rodzica i już. Cała filozofia. w ten sposób możemy ostro namieszać w klasach, co by wrogi element z mniejszym doświadczeniem, a większymi aspiracjami se zęby połamał.
Do pieca można dowalić jeszcze __destruct. Ta metoda wykonuje się kiedy skrypt jest kończony. A tak to wygląda.

&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;
&amp;lt;?php
class klasa_a {
 function __construct() {
  echo &quot;się skonstruowało! &amp;lt;br&gt;&quot;;
 }
}

class klasa_b extends klasa_a {
 function __construct() {
  echo &quot;Dziedziczone &quot;;
  parent::__construct();
 }
 function __destruct() {
  echo &quot;To już jest koniec, nie będzie nic! &amp;lt;br&gt;&quot;;
 }
}
$ob = new klasa_b();
echo &quot;Jakaś linia co by była?!! &amp;lt;br&gt;&quot;;
?&gt;
&lt;/pre&gt;

Jak widać &lt;b&gt;destruktor&lt;/b&gt; wykonał się na samym końcu. W brew pozorom bardzo przydatna rzecz. Można zamykać połączenie z bazą kiedy robimy to w swojej klasie, można zamykać plik, co by nie zapomnieć, a dane nie poszły se w siną dal, można dać stopkę kiedy tworzymy stronę w jakiejś zagmatwanej stronie... można zamieszać, ja tylko dałem marny przykład co by wiedzieć co w trawie piszczy.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/5895732368962976965/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2012/09/programowanie-obiektowe-w-php-cz-3.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/5895732368962976965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/5895732368962976965'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2012/09/programowanie-obiektowe-w-php-cz-3.html' title='Programowanie obiektowe w PHP. (cz. 3)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-3002389950280770509</id><published>2012-03-26T21:13:00.000+02:00</published><updated>2015-07-24T13:20:47.771+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="błędy"/><category scheme="http://www.blogger.com/atom/ns#" term="kod"/><category scheme="http://www.blogger.com/atom/ns#" term="php porady"/><category scheme="http://www.blogger.com/atom/ns#" term="proxy"/><title type='text'>Jak skonfigurować prosto w Apache mod_proxy?</title><content type='html'>Dość krótko. Jak włączyć modproxy? Na 99% Apache jest standardowo włączony. Jak nie wpisujemy w httpd.config:
&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
LoadModule proxy_module modules/mod_proxy.so
&amp;lt;Proxy *&gt;
Order deny,allow
Allow from all
&amp;lt;/Proxy&gt;
ProxyRequests Off
&lt;/i&gt;&lt;/pre&gt;
Jesteśmy twardziele i sami kompilujemy Apache, czyli rzadkość wśród adminów musimy skompilować z parametrem
&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
./configure --enable-proxy=shared
&lt;/i&gt;&lt;/pre&gt;
Oczywiści plus swoje parametry. Prefix, php itd...&lt;br /&gt;
W pliku konfiguracyjnym np w wirtualnych hostach wpisujemy:
&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
ProxyPass /jakis_katalog http://ip:port/jakis_katalog
ProxyPassReverse /jakis_katalog http://ip:port/jakis_katalog
&lt;/i&gt;&lt;/pre&gt;
Dlaczego ProxyRequests Off? Jest dużo robotów wykorzystujących mod_proxy do spamowania.&lt;br /&gt;
Zamiast ip, może być host.&lt;br /&gt;
ProxyPass jest potrzebny do zmianynagłółków od klienta do serwera.&lt;br /&gt;
ProxyPassReverse jest potrzebny do zmiany nagłówków z serwera do klienta.&lt;br /&gt;

Jeszcze jedna istotna rzecz, jeżeli macie włączony SElinux i proxowany prot jest inny niż 80, np 8080, w logach pojawia się:&lt;br /&gt;
&lt;b&gt;(13)Permission denied: proxy: HTTP: attempt to connect to 192.168.1.19:8080 (192.168.1.19) failed&lt;/b&gt;&lt;br /&gt;
Na pewno to dotyczy Fedora Linux, wiem, sam to przerabiałem niedawno.&lt;br /&gt;
Należy jako ROOT wpisać: 
&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
setsebool -P httpd_can_network_connect 1
&lt;/i&gt;&lt;/pre&gt;
Wtedy będzie na 100% działać.

Powodzenia.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/3002389950280770509/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2012/03/jak-skonfigurowac-prosto-w-apache.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/3002389950280770509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/3002389950280770509'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2012/03/jak-skonfigurowac-prosto-w-apache.html' title='Jak skonfigurować prosto w Apache mod_proxy?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-7729116620894480679</id><published>2012-03-24T09:36:00.002+01:00</published><updated>2012-03-24T09:44:35.154+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="balancer"/><category scheme="http://www.blogger.com/atom/ns#" term="konfiguracja"/><category scheme="http://www.blogger.com/atom/ns#" term="proxy"/><title type='text'>Proxy balancer w Apache i jego konfiguracja</title><content type='html'>Mamy serwer z jedynym słusznym PHP, niestety sukces przerósł nas i maszyna dymi co zrobić? Postawić cztery! Jak to zrobić? Banalnie prosto.&lt;br /&gt;
Jednemu z czterech serwerów nadajemy mu ciężką funkcję balancera. Jeżeli jest jakieś logowanie przez HTTPS, albo inne tajne czynności, szyfruje strony tylko i wyłącznie ten serwer. Reszta serwerów o HTTPS&#39;ie nie ma pojęcia że w ogóle takie coś jest. HTTPS zżera dość duże zasoby procesora. Tamte niech zajmują się liczeniem, kryptografia tylko balancer.&lt;br /&gt;
Załóżmy że nasz balancer ma IP 10.10.10.10 jako master of flamaster. Reszta od 10.10.10100 do 10.10.10.102. Nazywamy je sbn1, do sbn3 dla przykładu. Proponuje je nazwać inaczej i żeby nazwa mało co sugerowała.&lt;br /&gt;
W Apachu naszego balancera wpisujemy w httpd.conf, albo w jakimś naszym takie coś:
&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
Header add Set-Cookie &quot;IDB=.%{BALANCER_WORKER_ROUTE}e; path=/&quot; env=BALANCER_ROUTE_CHANGED
ProxyPass / balancer://nasz_balancer/ stickysession=IDB scolonpathdelim=On nofailover=Off lbmethod=byrequests
ProxyPassReverse / balancer://nasz_balancer/
&amp;lt;Proxy balancer://nasz_balancer&gt;
 BalancerMember http://10.10.10.100 route=sbn1
 BalancerMember http://10.10.10.101 route=sbn2
 BalancerMember http://10.10.10.102 route=sbn3
&amp;lt;/Proxy&gt;
&lt;/i&gt;&lt;/pre&gt;

&lt;strong&gt;Header add Set-Cooki&lt;/strong&gt;e jest linią bezcenną. Dodaje ciasto które może identyfikować który klient jest do którego naszego balancera, poza tym przekazuje ciastka choćby sesji PHP.&lt;br /&gt;
&lt;strong&gt;ProxyPass&lt;/strong&gt; definiuje ruch od klienta do jednego z naszych serwerów.&lt;br /&gt;
&lt;strong&gt;ProxyPassReverse&lt;/strong&gt; definiuje ruch z serwera do klienta. Jest to dość ważna rzecz zwłaszcza kiedy zamiast niezawodnego PHP mamy coś takiego jak Tomcat. Tomcaty charakteryzują się tym że projekt jest zawsze w jakimś katalogu. Żeby to ukryć piszemy to tak:
&lt;pre style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
ProxyPass / balancer://nasz_balancer/nasz_projekt/ stickysession=IDB scolonpathdelim=On nofailover=Off lbmethod=byrequests
ProxyPassReverse / balancer://nasz_balancer/nasz_projekt/
&lt;/i&gt;&lt;/pre&gt;
Muszą być dwie linie, żeby nasz balancer przetłumaczył wszystkie nagłówki Apacha z http://www.naszastrona.pl/bla.html zrozumiała dla klienta, na http://10.10.10.100/nasz_projekt/bla/html zrozumiała dla Tomcata i odwrotnie.&lt;br /&gt;
&lt;strong&gt;&amp;lt;Proxy balancer://nasz_balancer&gt;&lt;/strong&gt; wpisujemy wszystkie nasze trzy serwery. &lt;strong&gt;BalancerMember http://ip:jak_inny_niż_80_to_podać_port route=naza_nazwa_serwera&lt;/strong&gt;.&lt;br /&gt;
I.... to wszystko. Powodzenia.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/7729116620894480679/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2012/03/proxy-balancer-w-apache-i-jego.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7729116620894480679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7729116620894480679'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2012/03/proxy-balancer-w-apache-i-jego.html' title='Proxy balancer w Apache i jego konfiguracja'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-7170659674502410655</id><published>2012-03-16T17:20:00.001+01:00</published><updated>2012-03-16T20:08:08.259+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dom"/><category scheme="http://www.blogger.com/atom/ns#" term="obiekty"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="programowanie domdocument"/><title type='text'>Programowanie obiektowe w PHP. (cz. 2)</title><content type='html'>Trzeba oderwać się od Javy i napisać coś o języku który lubię.
Dobra. Udało zmienić się w template tytuł, na laurach nie ma co spoczywać. Trzeba zrobić coś bardziej zaawansowanego. Choćby w DIV dodać jakiś tekst, albo coś większego.&lt;br /&gt;
Mamy bardzo skomplikowaną stronę:
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&amp;lt;html&gt;&lt;br /&gt;
&amp;lt;head&gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;&lt;br /&gt;
&amp;lt;title&gt;Obiektowe herezje&amp;lt;/title&gt;&lt;br /&gt;
&amp;lt;/head&gt;&lt;br /&gt;
&amp;lt;body&gt;&lt;br /&gt;
&amp;lt;h1&gt;To jest strona z tytułem&amp;lt;/h1&gt;&lt;br /&gt;
&amp;lt;div id=&quot;diwek&quot;&gt;&amp;lt;/div&gt;&lt;br /&gt;
&amp;lt;/body&gt;&lt;br /&gt;
&amp;lt;html&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/div&gt;
Z góry przepraszam jak w HTML&#39;u jakimś pożrę w napadzie szału jakiś tag. Muszę go konwertować na coś wyświetlanego przez serwis, a z konwersjami różnie bywa.
Ale do rzeczy. Mamy DIV, który ma swój ID. Po pierwsze przydaje się taki wynalazek, żeby grafik mógł się na pastwić w CSS&#39;ach na konkretnym DIV, a dla nas przyda się co by mieć pewność że chodzi nam o dokładnie ten DIV a nie jakiś inny. W HTML/XHTML obowiązuje teza nieśmiertelnego „There can be only one!” i bardzo dobrze.
Wrzucić tam jakiś tekst jest dość prosto. Oto i przykład:
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&amp;lt;?php&lt;br /&gt;
$dom = new DOMDocument(&#39;1.0&#39;, &#39;UTF-8&#39;);&lt;br /&gt;
$dom-&gt;validateOnParse = TRUE;&lt;br /&gt;
$dom-&gt;loadHTMLFile(&quot;blog.html&quot;);&lt;br /&gt;
$div = $dom-&gt;getElementById(&#39;diwek&#39;);&lt;br /&gt;
$div-&gt;nodeValue = &quot;Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.&quot;;&lt;br /&gt;
echo $dom-&gt;saveHTML();&lt;br /&gt;
?&gt;
&lt;/i&gt;&lt;/div&gt;
Już. Działa. Gorzej jak w napadzie szału zachce się naw wstawić coś takiego:
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&amp;lt;strong&gt;Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.&amp;lt;/strong&gt;
&lt;/i&gt;&lt;/div&gt;
Wyświetli się nam coś takiego:
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&amp;amp;lt;strong&amp;amp;gt;Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.&amp;amp;lt;/strong&amp;amp;gt;
&lt;/i&gt;&lt;/div&gt;
No jak śmiało!!! To jakaś niedorzeczność!&lt;br /&gt;
Otóż to jest dorzeczność. Ponieważ wartość HTML&#39;a, XHTML&#39;a XML&#39;a i innego podobnego składem ela nie może mieć znaków specjalnych. Sprytny DOM żeby nie mieć problemów konwertuje znaki specjalne. Więc żeby dodać STRONG należy się ciut bardziej wysilić.&lt;br /&gt;
A oto wysiłek przekraczający ludzkie pojęcie:
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&amp;lt;?php&lt;br /&gt;
$dom = new DOMDocument(&#39;1.0&#39;, &#39;UTF-8&#39;);&lt;br /&gt;
$dom-&gt;validateOnParse = TRUE;&lt;br /&gt;
$dom-&gt;loadHTMLFile(&quot;blog.html&quot;);&lt;br /&gt;
$div = $dom-&gt;getElementById(&#39;diwek&#39;);&lt;br /&gt;
$strong = $dom-&gt;createElement(&#39;strong&#39;, &#39;Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.&#39;);&lt;br /&gt;
$div-&gt;appendChild($strong);&lt;br /&gt;
echo $dom-&gt;saveHTML();&lt;br /&gt;
?&gt;
&lt;/i&gt;&lt;/div&gt;
Ale... zawsze musi być jakieś ale. Ale załóżmy że z jakiś powodów element STRONG musimy wstawić teraz, a wartość gdzieś tam daleko daleko. Żaden problem.&lt;br /&gt;
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&amp;lt;?php&lt;br /&gt;
$dom = new DOMDocument(&#39;1.0&#39;, &#39;UTF-8&#39;);&lt;br /&gt;
$dom-&gt;validateOnParse = TRUE;&lt;br /&gt;
$dom-&gt;loadHTMLFile(&quot;blog.html&quot;);&lt;br /&gt;
$div = $dom-&gt;getElementById(&#39;diwek&#39;);&lt;br /&gt;
$strong = $dom-&gt;createElement(&#39;strong&#39;);&lt;br /&gt;
$do_daleko = $div-&gt;appendChild($strong);&lt;br /&gt;
// załóżmy że tu jest dużo kodu PHP, który jest niezbędny do funkcjonowania.&lt;br /&gt;
// bla bla bla&lt;br /&gt;
// i jeszcze jedna linijka dla lepszego samopoczucia!&lt;br /&gt;
$do_daleko-&gt;nodeValue = &quot;A jednak wstawiłem!&quot;;&lt;br /&gt;
echo $dom-&gt;saveHTML();&lt;br /&gt;
?&gt;
&lt;/i&gt;&lt;/div&gt;
CUD! DZIAŁA!&lt;br /&gt;
W następnej części popastwię się nad tabelą jak ją zmajstrować i po co. ;)&lt;br /&gt;
Obiecuję napisać to trochę szybciej niż za pół roku. :D</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/7170659674502410655/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2012/03/programowanie-obiektowe-w-php-cz-2.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7170659674502410655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7170659674502410655'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2012/03/programowanie-obiektowe-w-php-cz-2.html' title='Programowanie obiektowe w PHP. (cz. 2)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-5633903057879069980</id><published>2011-08-13T13:12:00.007+02:00</published><updated>2012-03-16T17:14:27.259+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="php obiekty programowanie mysqli msql domdocument dom"/><title type='text'>Programowanie obiektowe w PHP.</title><content type='html'>Złośliwi opowiadają że Java jest obiektowa, Obcjective-C jak w samej nazwie jest obiektowy. Tylko jakiś ten PHP nie ma obiektów jest prostacki i dla amatorów. Dopiero jak przesiądziesz się na Java lub te drugie, to dopiero czujesz że pracujesz obiektowo. Ja na to odpowiadam że to stek bzdur. Co do Objective-C nie mogę nic napisać, bo nie programuję (jak będę chciał wywalać 100$ Applowi za konto deweloperskie co rok, wtedy będę pyskował), za to Javie mogę wytknąć kilka bzdurnych i przyprawiających o zawał obiektów, dzięki którym nasz króciutki programik działa z „zawrotną prędkością”, jak by procesor był taktowany zegarem z kukułką która właśnie zdechła. Już nie wspominam że owa obiektowość może wygenerować błąd składający się z 50 linii, z czego każda linia dotyczy czego innego, coś do poćwiczenia prekognicji (jasnowidzenia). Zdarzyło się kilka razy iż błąd nie miał nic wspólnego rzeczywistością.
&lt;br /&gt;
&lt;br /&gt;Dość tego jadu, teraz pokaże jak obiektowo można pracować w PHP.  Pierwszym jaki rzuca się w oczy i jest oczywisty jest podłączenie się do bazy danych.
&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&lt;br /&gt;&amp;lt;?php
&lt;br /&gt;$mysqli = new mysqli(&quot;localhost&quot;, &quot;juzer&quot;, &quot;pasłord&quot;, &quot;baza&quot;);
&lt;br /&gt;if (mysqli_connect_errno()) {
&lt;br /&gt;    printf(&quot;Connect failed: %s\n&quot;, mysqli_connect_error());
&lt;br /&gt;    exit();
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;if (!$mysqli-&gt;query(&quot;SET zmienna=1&quot;)) {
&lt;br /&gt;    printf(&quot;Errorcode: %d\n&quot;, $mysqli-&gt;errno);
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;$mysqli-&gt;close();
&lt;br /&gt;?&gt;
&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Jak zwykle większość kodów to jest obsługa błędów. Złośliwi mówią że 90% kodu to obsługa błędów i kod idioto odporny co by użytkownik bzdur nie wpisywał. W sumie coś w tym jest.
&lt;br /&gt;Nie będę się pastwił nad MySQL&#39;em, tam można pomęczyć się ze statemantami i takimi tam dziwactwami, ale ja po pastwię się nad DOMDocument. Nawet uzasadnię zaraz dlaczego.
&lt;br /&gt;
&lt;br /&gt;Otóż jest kilka filozofii pisania stron. Pierwsza prostacka tworzenie &lt;span style=&quot;font-weight:bold;&quot;&gt;HTML/XHTML&lt;/span&gt; od początku. Na początku &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;html&gt;&lt;/span&gt; potem &amp;lt;head&gt;. W &amp;lt;head&gt; mamy różne metatagi takie jak kodowanie strony, kto to popełnił, mamy również gdzie są &lt;span style=&quot;font-weight:bold;&quot;&gt;CSS&lt;/span&gt;, tytuł parę &lt;span style=&quot;font-weight:bold;&quot;&gt;JS&lt;/span&gt; do AJAX&#39;a Google Analitics oraz inne dziwolągi. Potem mamy &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;body&gt;&lt;/span&gt;. W body mamy tabelki, &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;div&gt;&lt;/span&gt;, &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;strong&gt;&lt;/span&gt;, &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;b&gt;&lt;/span&gt; i inne dziwne rzeczy. Trzeba pamiętać żeby to wszystko pozamykać w odpowiedniej kolejności i tak dalej. Programowanie tego przypomina programowanie liniowe i jak okaże się że z jakiegoś powodu tytuł strony wynika nam z zawartości strony i nie możemy go ustalić w head, zostaje nam strzelić se w łeb.
&lt;br /&gt;Druga metoda to template. W nich umieszczone są różnego rodzaju zmienne, np. $tytuł i tam się objawi tytuł jak puścimy przez jakiś kombajn zwany CRM&#39;em, albo PEAR&#39;em. Można oczywiście robić pętelki typu coś się powtarza, ale moim skromnym zdaniem jakoś mi to nie podchodziło od samego początku.
&lt;br /&gt;
&lt;br /&gt;Moja zwariowana metoda (najwyżej ktoś mnie odwiezie do Tworek, wreszcie odpocznę) jest to wpakowanie do DOM. Co prawda opiera się na template, ale po co tworzyć całą stronę w DOOM. Kod będzie długi, a żaden grafik tego nie zrobi. Niech &lt;span style=&quot;font-weight:bold;&quot;&gt;DOM &lt;/span&gt;martwi się o zamykanie wszystkich tagów i poprawności zawartości i innymi zgodnościami RSS których normalny człowiek nie jest w stanie ogarnąć. Choćby w linkach powinny zmienne &lt;span style=&quot;font-weight:bold;&quot;&gt;GET&lt;/span&gt; dzielone &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;apm;&lt;/span&gt; a nie jak większość robi samym &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;&lt;/span&gt;.
&lt;br /&gt;Oto króciutki przykład o co mnie chodzi, dalej będę pastwił się w części drugiej. Mamy prosty &lt;span style=&quot;font-weight:bold;&quot;&gt;HTML&lt;/span&gt;.
&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&lt;br /&gt;&amp;lt;html&gt;
&lt;br /&gt; &amp;lt;head&gt;
&lt;br /&gt;  &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;br /&gt;  &amp;lt;title&gt;&amp;lt;/title&gt;
&lt;br /&gt; &amp;lt;/head&gt;
&lt;br /&gt; &amp;lt;body&gt;
&lt;br /&gt;  &amp;lt;h1&gt;To jest strona z tytułem&amp;lt;/h1&gt;
&lt;br /&gt;  Jak widać tytuł jest, a w templacie nie.
&lt;br /&gt; &amp;lt;/body&gt;
&lt;br /&gt;&amp;lt;/html&gt;
&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Jak widać &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;title&gt;&lt;/span&gt; jest puste. To straszne! Trzeba coś z tym zrobić! Spokojnie, o to prościutki skrypt pozujący idee mojego mądrzenia się na łamach bloga.
&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&lt;br /&gt;&amp;lt;?php
&lt;br /&gt;$dom = new DOMDocument(&#39;1.0&#39;, &#39;UTF-8&#39;);
&lt;br /&gt;$dom-&gt;validateOnParse = TRUE;
&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;To coś tworzy dokument DOM.  ValidateOnParse jest na true co by ładnie był HTML poukładany i nie walił wszystkiego w jednej linii.
&lt;br /&gt;Teraz trzeba załadować nasz wspaniały przykład HTML ku uciesze gawiedzi. Robi się to tak:
&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&lt;br /&gt;$dom-&gt;loadHTMLFile($plik);
&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Prawda że skomplikowane? Teraz trzeba wyłapać &lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;title&gt;&lt;/span&gt; i wrzucić tam nasz wspaniały tytuł. Oczywiście najprościej było by w title umieścić id i już, ale to nie przystoi prawdziwemu wojownikowi, więc zrobimy to tak:
&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&lt;br /&gt;$title = $dom-&gt;getElementsByTagName(&#39;title&#39;)-&gt;item(0);
&lt;br /&gt;$title-&gt;nodeValue = &#39;Oto wspaniały tytuł, który każdemu się spodoba.”
&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;To wszystko. Zaletą tego rozwiązania jest że tytuł można dodać, zmienić, dopisać w każdej chwili. Nie trzeba się martwić jak w pierwszym przykładzie innych rozwiązań, kiedy to się programuje a&#39;la liniowyo, że na początku tytuł, a potem reszta strony. Teraz można zrobić jak kto chce.
&lt;br /&gt;
&lt;br /&gt;Teraz najważniejszy fragment zabawy, mianowicie wyświetlenie zawartości &lt;span style=&quot;font-weight:bold;&quot;&gt;DOM&lt;/span&gt; jako &lt;span style=&quot;font-weight:bold;&quot;&gt;HTML&lt;/span&gt;:
&lt;br /&gt;
&lt;br /&gt;&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;
&lt;br /&gt;echo $dom-&gt;saveHTML();
&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;To wszystko. W dalszych częściach mojego mądrzenia się pokaże jak można robić inne rzeczy za pomocą tej biblioteki. Chciałem tylko ostrzec, ona jest dość mocno uzależniająca. ;)
&lt;br /&gt;
&lt;br /&gt;Także pomyśl jak potworzysz sobie z tego klasy własnej produkcji i pomysłu jakie będziesz miał ułatwione życie. Inne CRM pognasz precz i nie będziesz chciał o nich słyszeć.
&lt;br /&gt;
&lt;br /&gt;Na koniec zdradzę moje motto. Im mniej używasz gotowców, tym mniej masz włamań na stronę. Lepiej napisać coś samemu, na to nie ma gotowych pakietów do włamań przez serwisy w internecie.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/5633903057879069980/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/08/programowanie-obiektowe-w-php.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/5633903057879069980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/5633903057879069980'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/08/programowanie-obiektowe-w-php.html' title='Programowanie obiektowe w PHP.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-4321397216269114552</id><published>2011-06-01T15:03:00.002+02:00</published><updated>2011-06-01T19:23:17.820+02:00</updated><title type='text'>Testowe PESELe wygenerowane automatem</title><content type='html'>Podsyłam kilka PESEL&#39;i testowych. Tylko 9003 sztuki więc można szaleć.&lt;br /&gt;Są to wygenerowane automatycznie. Są niczyje. Chyba że ktoś go dostanie w 2499 roku jak nie później. ;)&lt;br /&gt;Link do pliku tekstowego jest &lt;a href=&quot;http://dev.sklepnet.com/pesele.txt&quot;&gt;TU&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Miłego testowania i powodzenia.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/4321397216269114552/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/06/testowe-pesele-wygenerowane-automatem.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/4321397216269114552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/4321397216269114552'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/06/testowe-pesele-wygenerowane-automatem.html' title='Testowe PESELe wygenerowane automatem'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-9104363606229307924</id><published>2011-05-03T09:57:00.003+02:00</published><updated>2011-05-03T10:09:01.585+02:00</updated><title type='text'>Sprawdzanie poprawności NIP</title><content type='html'>Kiedyś w napadzie szału musiałem napisać sprawdzanie NIP. Oczywiście w PHP. Bardzo mnie zdziwiło jak ludzie często pamiętają swój NIP z błędem. Przekonałem się o tym jak wdrożyłem to rozwiązanie na serwer. Oto i one:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;$nip = $_POST[&#39;nip&#39;]; //albo skadś tam wziąć zmienną&lt;br /&gt;if (strlen($nip) == 10) {&lt;br /&gt; $nip_waga = &#39;657234567&#39;;&lt;br /&gt; $nip_suma = 0;&lt;br /&gt; if (ereg (&#39;[0-9]{10,10}&#39;, $nip) ){&lt;br /&gt;  for ($a = 0; $a &lt;= 8; $a++) {&lt;br /&gt;   $nip_suma = $nip_suma + (substr ($nip, $a, 1) * substr ($nip_waga, $a, 1));&lt;br /&gt;  }&lt;br /&gt;  $nip_suma2 = $nip_suma - (intval($nip_suma/11) *11);&lt;br /&gt;  if ($nip_suma2 == substr ($nip, -1, 1)) {&lt;br /&gt;   echo &quot;Nip OK&quot;;&lt;br /&gt;  }&lt;br /&gt;  else  {&lt;br /&gt;   echo &#39;Nip do bani!&#39;;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;  echo &quot;Nip ma lipną długość.&quot;;&lt;br /&gt; }&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;Tradycji musi się stać zadość, żeby ten przykład zobaczyć. Jest on &lt;a href=&quot;http://dev.sklepnet.com/nip_checker.php&quot;&gt;tu&lt;/a&gt;.&lt;br /&gt;Oczywiście dane są nigdzie zapisywane, więc śmiało.&lt;br /&gt;&lt;br /&gt;Oczywiście musi być wersja Java Script. Praca z AJAX&#39;em, czystym... nie wiem czy userzy będą nazywali to relaks, jak komputer będzie pisał z upartością maniaka, że NIP który podają jest dobry, ale nie do końca i żeby wpisali ten poprawny.&lt;br /&gt;Oto wersja JS:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;if (nip.length == 10) {&lt;br /&gt; nip_waga = &#39;657234567&#39;;&lt;br /&gt; nip_suma = 0;&lt;br /&gt; for (a = 0; a &lt;= 8; a++) {&lt;br /&gt;  nip_suma = nip_suma + (nip.substr(a, 1) * nip_waga.substr(a, 1));&lt;br /&gt; }&lt;br /&gt; nip_suma2 = nip_suma - (parseInt(nip_suma/11) *11);&lt;br /&gt; if (nip_suma2 == nip.substr(-1, 1)) {&lt;br /&gt;  document.getElementById(&#39;wynik&#39;).innerHTML = &quot;Nip OK&quot;;&lt;br /&gt; }&lt;br /&gt; else  {&lt;br /&gt;  document.getElementById(&#39;wynik&#39;).innerHTML = &#39;Nip do bani!&#39;;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt; document.getElementById(&#39;wynik&#39;).innerHTML = &#39;Nip ma lipną długość.&#39;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;Wersja do klikania jest &lt;a href=&quot;http://dev.sklepnet.com/nip_checker.html&quot;&gt;tu&lt;/a&gt;.&lt;br /&gt;W NIP ostatnia cyfra jest sumą kontrolną. Wystarczy 9 odpowiednio pomnożyć, modulo i porównać z ostatnią dziesiątą. Od tej pory źle wpisujący NIP będą karceni.&lt;br /&gt;Jak mnie nawiedzi, wygrzebię jeszcze do sprawdzania poprawności numeru konta bankowego. Dla wstępu napiszę że pełny numer konta zaczyna się on dwóch znaków kraju. W Polsce od PL. Da się to zrobić, kwestia samozaparcia. ;)</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/9104363606229307924/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/05/sprawdzanie-poprawnosci-nip.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/9104363606229307924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/9104363606229307924'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/05/sprawdzanie-poprawnosci-nip.html' title='Sprawdzanie poprawności NIP'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-3066106918712212952</id><published>2011-03-23T10:49:00.003+01:00</published><updated>2011-03-23T10:55:04.554+01:00</updated><title type='text'>Jak można skomplikować skrypt (cz.2)</title><content type='html'>Kto to w ogóle powymyślał nad silnikiem PHP? Tacy programiści którzy stwierdzili po co czytać miliard książek, dokumentacji, chodzić na drogie szkolenia, jak wystarczy przeczytać kilka moich zdań skleconych powiedzmy że po polsku żeby zorientować się w czym rzecz.&lt;br /&gt;Na początek nie podoba mi się możliwość zmiany zmiennych w klasie. Omijając elegancką funkcję która nam to robi. Nie mówię o wywołanie tekstu też ma wiele do życzenia. Kto to będzie pamiętał że w tej klasie tekst znajduje się w zmiennej &lt;span style=&quot;font-weight:bold;&quot;&gt;text&lt;/span&gt;. Więc od początku.&lt;br /&gt;&lt;br /&gt;W poprzedniej części zrobiłem klasę &lt;span style=&quot;font-weight:bold;&quot;&gt;tekst&lt;/span&gt; i w środku funkcje &lt;span style=&quot;font-weight:bold;&quot;&gt;tekst&lt;/span&gt;. To jest właśnie &lt;span style=&quot;font-weight:bold;&quot;&gt;__construct&lt;/span&gt;  z PHP 4 (dla tych co znają C++ konstrukcja siekierą wyrąbana właśnie stąd). W napadzie szału zmienisz nazwę klasy i trzeba wszystko zmieniać. To bez sensu. Dlatego funkcja tekst będzie nazywała się &lt;span style=&quot;font-weight:bold;&quot;&gt;__construct()&lt;/span&gt;.&lt;br /&gt;Po po drugie po co pisać jakieś funkcje zmieniające zmienne skoro można to zrobić bez nich. To trzeba zmienić. Dlatego panowie od PHP wymyślili hasła public i private. Kiedy użyjesz private &lt;span style=&quot;font-weight:bold;&quot;&gt;$text&lt;/span&gt; już jej nie zmienisz, nie wyświetlisz nic. Ona jest dostępna tylko i wyłącznie w klasie. Wadą tego rozwiązania jest obowiązek napisania funkcji wyświetlającą ją, ale co to dla prawdziwego wojownika. Różni ludzie różnie nazywają ta funkcję np. &lt;span style=&quot;font-style:italic;&quot;&gt;save&lt;/span&gt;, &lt;span style=&quot;font-style:italic;&quot;&gt;print&lt;/span&gt;, &lt;span style=&quot;font-style:italic;&quot;&gt;echo&lt;/span&gt;... kto to spamięta. Na szczęście panowie od PHP nie zasypują gruszek w popiele i wymyślili coś takiego jak &lt;span style=&quot;font-weight:bold;&quot;&gt;__toString()&lt;/span&gt; (też C++). Teraz wystarczy zrobić &lt;span style=&quot;font-weight:bold;&quot;&gt;echo $tekst&lt;/span&gt; i klasa wyświetli się jak zwykły tekst. Oto przykład.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; private $imie = &#39;Ala&#39;;&lt;br /&gt; private $czynnosc = &#39;ma&#39;;&lt;br /&gt; private $zwierz = &#39;psa&#39;;&lt;br /&gt; private $text = &#39;&#39;;&lt;br /&gt; &lt;br /&gt; public function __construct() {&lt;br /&gt;    $this-&gt;text = &quot;{$this-&gt;imie} {$this-&gt;czynnosc} {$this-&gt;zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt; public function zmiana($imie= NULL, $czynnosc = NULL, $zwierz = NULL) {&lt;br /&gt;  $this-&gt;imie = $imie==NULL ? $this-&gt;imie : $imie;&lt;br /&gt;  $this-&gt;czynnosc = $czynnosc==NULL ? $this-&gt;czynnosc : $czynnosc;&lt;br /&gt;  $this-&gt;zwierz = $zwierz==NULL ? $this-&gt;zwierz : $zwierz;&lt;br /&gt;  $this-&gt;__construct();&lt;br /&gt; }&lt;br /&gt; public function __toString(){&lt;br /&gt;  return $this-&gt;text;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;$tekst-&gt;zmiana (&#39;Ola&#39;);&lt;br /&gt;echo $tekst;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;Jak widzimy wszystkie zmienne są prywatne, wszystkie funkcje są publiczne, zmienna &lt;span style=&quot;font-weight:bold;&quot;&gt;$tekst&lt;/span&gt; sama się uzupełnia odpowiednim tekstem, oraz wyświetla się ją też prosto. Czy da się to jeszcze skomplikować? Ależ oczywiście że tak. Napiszmy teraz funkcje która będzie dodawać wykrzyknik. Zrobimy ją prywatną, co by byle kto nie dodawał wykrzykników ile wlezie. Oto i on.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; private $imie = &#39;Ala&#39;;&lt;br /&gt; private $czynnosc = &#39;ma&#39;;&lt;br /&gt; private $zwierz = &#39;psa&#39;;&lt;br /&gt; private $text = &#39;&#39;;&lt;br /&gt; &lt;br /&gt; public function __construct() {&lt;br /&gt;    $this-&gt;text = &quot;{$this-&gt;imie} {$this-&gt;czynnosc} {$this-&gt;zwierz}&quot;;&lt;br /&gt;    $this-&gt;wykrzyknik();&lt;br /&gt; }&lt;br /&gt; public function zmiana($imie= NULL, $czynnosc = NULL, $zwierz = NULL) {&lt;br /&gt;  $this-&gt;imie = $imie==NULL ? $this-&gt;imie : $imie;&lt;br /&gt;  $this-&gt;czynnosc = $czynnosc==NULL ? $this-&gt;czynnosc : $czynnosc;&lt;br /&gt;  $this-&gt;zwierz = $zwierz==NULL ? $this-&gt;zwierz : $zwierz;&lt;br /&gt;  $this-&gt;__construct();&lt;br /&gt; }&lt;br /&gt; public function __toString(){&lt;br /&gt;  return $this-&gt;text;&lt;br /&gt; }&lt;br /&gt; private function wykrzyknik() {&lt;br /&gt;  $this-&gt;text .=&#39;!&#39;;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;$tekst-&gt;zmiana (&#39;Ola&#39;);&lt;br /&gt;echo $tekst;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Teraz prosta rzecz jest wystarczająco złożona. Prywatne zmienne nie pozwalają nam na swobodne zmiany przez kogoś, publiczne funkcje które służą do zmian tekstu w sposób kontrolowany, prywatna funkcja która dodaje wykrzyknik i nie może być wywołana celem siania zamętu.&lt;br /&gt;Czy da się jeszcze to skomplikować? Ależ oczywiście. Jest jeszcze &lt;span style=&quot;font-weight:bold;&quot;&gt;__destruct&lt;/span&gt;,  &lt;span style=&quot;font-weight:bold;&quot;&gt;__unset&lt;/span&gt;, &lt;span style=&quot;font-weight:bold;&quot;&gt;__call&lt;/span&gt;, &lt;span style=&quot;font-weight:bold;&quot;&gt;__clone&lt;/span&gt;... ale to kiedy indziej.&lt;br /&gt;Kiedyś pisząc zadanie w zawodach, gdzie główną wygraną była praca specjalnie nie użyłem konstrukcji jak w ostatnim przykładzie z nadzieją że facet się zorientuje że se jaja robię, nie zorientował się. Za to Ty możesz wykorzystać ten przykład i możesz mieć moją fuchę. ;)</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/3066106918712212952/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/03/jak-mozna-skomplikowac-skrypt-cz2.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/3066106918712212952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/3066106918712212952'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/03/jak-mozna-skomplikowac-skrypt-cz2.html' title='Jak można skomplikować skrypt (cz.2)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-8204478418990003649</id><published>2011-03-22T20:10:00.003+01:00</published><updated>2011-03-22T20:15:07.748+01:00</updated><title type='text'>Jak można skomplikować skrypt</title><content type='html'>Jak można skomplikować se skrypt&lt;br /&gt;&lt;br /&gt;W sumie to banalna sprawa, wystarczy przejrzeć niektóre przykłady, ale ja to zrobię w sposób kreatywny. Czyli jak działa coś oczywistego dla doświadczonych. Więc zaczynajmy.&lt;br /&gt;Mamy prosty przykład:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;echo &#39;Ala ma psa!&#39;;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Banalne, ale gdyby ten ciąg znakowy dać jako zmienną.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;$text = &#39;Ala ma psa!&#39;;&lt;br /&gt;echo $text;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;W sumie można zaszaleć i zdefiniować stałą.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;define (&#39;TEKST&#39;, &#39;Ala ma psa!&#39;);&lt;br /&gt;echo TEXT;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;W sumie fajne, ale gdyby pokusić się o... funkcje? Czemu nie, tylko czemu nie dowalić z grubej rury i nie zrobić całej klasy? A co tam, procesory są coraz szybsze...&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; var $text = &#39;Ala ma psa!&#39;;&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;echo $tekst-&gt;text;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ale skoro mamy już klasę to czemu nie zrobić żeby można było zmieniać ową Alę na kogo innego. Ola będzie dyskryminowana. Zmieńmy to.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; var $text = &#39;Ala ma psa!&#39;;&lt;br /&gt; function zmiana($imie) {&lt;br /&gt;  $this-&gt;text = &quot;{$imie} ma psa!&quot;;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;$tekst-&gt;zmiana(&#39;Ola&#39;);&lt;br /&gt;echo $tekst-&gt;text;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ktoś zapyta na grzyba to jakieś &lt;span style=&quot;font-weight:bold;&quot;&gt;$this&lt;/span&gt;. Niby proste pytanie. Chodzi o zmienne klasy, a nie funkcji. Jakbyśmy użyli &lt;span style=&quot;font-weight:bold;&quot;&gt;$text&lt;/span&gt;, była by to zmienna wewnątrz funkcji, jak tak operujemy zmienną klasy. Nie zmienia to faktu że nadal mam niedosyt. Przecież Ola ma kota? Zróbmy to więc tak.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; var $zwierz = &#39;psa&#39;;&lt;br /&gt; var $imie = &#39;Ala&#39;;&lt;br /&gt; var $text = &quot;Ala ma psa!&quot;;&lt;br /&gt; function zmiana_imie($imie) {&lt;br /&gt;  $this-&gt;imie = $imie;&lt;br /&gt;  $this-&gt;text = &quot;{$imie} ma {$this-&gt;zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt; function zmiana_zwierz($zwierz) {&lt;br /&gt;  $this-&gt;zwierz = $zwierz;&lt;br /&gt;  $this-&gt;text = &quot;{$this-&gt;imie} ma {$zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;$tekst-&gt;zmiana_imie(&#39;Ola&#39;);&lt;br /&gt;$tekst-&gt;zmiana_zwierz(&#39;kota&#39;);&lt;br /&gt;echo $tekst-&gt;text;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Specjalnie użyłem tych samych nazw zmiennych, żeby pokazać że są one izolowane. Nie zmienia faktu że czuje jakiś... niedosyt. Czemu to w klasie nie mogę wpisać zmiennych i żeby samo sie układało? Więc dajmy czadu.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; var $imie = &#39;Ala&#39;;&lt;br /&gt; var $czynnosc = &#39;ma&#39;;&lt;br /&gt; var $zwierz = &#39;psa&#39;;&lt;br /&gt; var $text = &#39;&#39;;&lt;br /&gt; function tekst() {&lt;br /&gt;    $this-&gt;text = &quot;{$this-&gt;imie} {$this-&gt;czynnosc} {$this-&gt;zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt; function zmiana_imie($imie) {&lt;br /&gt;  $this-&gt;imie = $imie;&lt;br /&gt;  $this-&gt;text = &quot;{$imie} {$this-&gt;czynnosc} {$this-&gt;zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt; function zmiana_czynnosc($czynnosc) {&lt;br /&gt;  $this-&gt;czynnosc = $czynnosc;&lt;br /&gt;  $this-&gt;text = &quot;{$this-&gt;imie} {$czynnosc} {$this-&gt;zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt; function zmiana_zwierz($zwierz) {&lt;br /&gt;  $this-&gt;zwierz = $zwierz;&lt;br /&gt;  $this-&gt;text = &quot;{$this-&gt;imie} {$this-&gt;czynnosc} {$zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;$tekst-&gt;zmiana_imie(&#39;Ola&#39;);&lt;br /&gt;$tekst-&gt;zmiana_czynnosc(&#39;głaszcze&#39;);&lt;br /&gt;$tekst-&gt;zmiana_zwierz(&#39;konia&#39;);&lt;br /&gt;echo $tekst-&gt;text;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Na pierwszą myśl przyszło mi nie głaszcze i nie Ola. ;)&lt;br /&gt;Dodałem jeszcze jedną funkcje żeby automatycznie się uruchamiała i robiła nam piękny tekst jak nikt nie wywoła sam funkcji nie wyświetlał pustego.&lt;br /&gt;Czy można bardziej zamotać? Zamotać da się, ale za to będzie mniej lini.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class tekst{&lt;br /&gt; var $imie = &#39;Ala&#39;;&lt;br /&gt; var $czynnosc = &#39;ma&#39;;&lt;br /&gt; var $zwierz = &#39;psa&#39;;&lt;br /&gt; var $text = &#39;&#39;;&lt;br /&gt; function tekst() {&lt;br /&gt;    $this-&gt;text = &quot;{$this-&gt;imie} {$this-&gt;czynnosc} {$this-&gt;zwierz}!&quot;;&lt;br /&gt; }&lt;br /&gt; function zmiana($imie= NULL, $czynnosc = NULL, $zwierz = NULL) {&lt;br /&gt;  $this-&gt;imie = $imie==NULL ? $this-&gt;imie : $imie;&lt;br /&gt;  $this-&gt;czynnosc = $czynnosc==NULL ? $this-&gt;czynnosc : $czynnosc;&lt;br /&gt;  $this-&gt;zwierz = $zwierz==NULL ? $this-&gt;zwierz : $zwierz;&lt;br /&gt;  $this-&gt;tekst();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$tekst = new tekst;&lt;br /&gt;$tekst-&gt;zmiana (&#39;Ola&#39;);&lt;br /&gt;echo $tekst-&gt;text;&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Teraz jest jedna funkcja zmieniająca wszystko. Jeżeli będzie jeden parametr, drugi i trzeci będzie NULL i wstawi się wartość domyślna. Poza tym w funkcji zmiana jest wywoływana funkcja tekst, co by jej nie pisać dwa razy. Jeżeli nie wywołamy funkcji zmiana, będzie wartość domyślna.&lt;br /&gt;&lt;br /&gt;Ciąg dalszy nastąpi matactwa klasy, tak jej zostawić nie można.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/8204478418990003649/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/03/jak-mozna-skomplikowac-skrypt.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/8204478418990003649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/8204478418990003649'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/03/jak-mozna-skomplikowac-skrypt.html' title='Jak można skomplikować skrypt'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-8869536004548124117</id><published>2011-03-17T00:07:00.003+01:00</published><updated>2011-05-02T00:34:21.998+02:00</updated><title type='text'>Sprawdzanie poprawności PESEL.</title><content type='html'>Często gęsto człowiek boryka się czy dany PESEL jest prawidłowy. Oto prosty przykład jak można sprawdzić czy delikwent aby nie konfabuluje w dziedzinie PESEL.&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;&lt;br /&gt;&amp;lt;html&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt;  &amp;lt;title&gt;Pesel checker&amp;lt;/title&gt;&lt;br /&gt;  &amp;lt;meta name=&quot;AUTHOR&quot; content=&quot;plx&quot;&gt;&lt;br /&gt;  &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;&lt;br /&gt;&amp;lt;/head&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;strong&gt;Sprawdzacz peseli&amp;lt;/strong&gt;&amp;lt;br&gt;&lt;br /&gt;&amp;lt;form action=&quot;pesel_check.php&quot; method=&quot;POST&quot; enctype=&quot;application/x-www-form-urlencoded&quot;&gt;&lt;br /&gt;  &amp;lt;input type=&quot;text&quot; name=&quot;pesel&quot;&gt; &amp;lt;input type=&quot;submit&quot; value=&quot;check&quot;&gt;&lt;br /&gt;&amp;lt;/form&gt;&amp;lt;br&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;if (isset($_POST[&#39;pesel&#39;])) {&lt;br /&gt;        $pesel = trim($_POST[&#39;pesel&#39;]);&lt;br /&gt;        $pesel_waga = &#39;13791379131&#39;;&lt;br /&gt;        $pesel_suma = 0;&lt;br /&gt;        if (strlen($pesel) == 11) {&lt;br /&gt;                for ($a = 0; $a &amp;lt;= 10; $a++)&lt;br /&gt;                        $pesel_suma = $pesel_suma + (substr ($pesel, $a, 1) * substr ($pesel_waga, $a, 1));&lt;br /&gt;                if (substr ($pesel_suma, -1, 1) == &#39;0&#39;)&lt;br /&gt;                        echo &quot;Pesel prawidłowy.&quot;;&lt;br /&gt;                else&lt;br /&gt;                        echo &quot;Pesel jest nieprawidłowy.&quot;;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        echo &quot;Pesel ma złą długość.&quot;;&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Jak działa, dostępny jest &lt;a href=&quot;http://dev.sklepnet.com/pesel_check.php&quot;&gt;TU&lt;/a&gt;.&lt;br /&gt;Dla tych co uważają że serwer nie powinien zajmować się takimi bzdetami i niech sprawdza w JS po stronie klienta pamięta, że zawsze znajdzie się ktoś kto wyłączy JS, albo spreparuje własne dane i wyśle, więc i tak serwer musi sprawdzać poprawność danych.&lt;br /&gt;&lt;br /&gt;Oto prosty przykład jak to samo można przenieść do JS.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;&lt;br /&gt;&amp;lt;html&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt;  &amp;lt;title&gt;Pesel checker&amp;lt;/title&gt;&lt;br /&gt;  &amp;lt;meta name=&quot;AUTHOR&quot; content=&quot;plx&quot;&gt;&lt;br /&gt;  &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;&lt;br /&gt;  &amp;lt;script type=&quot;text/javascript&quot;&gt;&lt;br /&gt;  function pesel_check(pesel) {&lt;br /&gt;          var pesel_waga = &#39;13791379131&#39;;&lt;br /&gt;          var pesel_suma = 0;&lt;br /&gt;          if (pesel.length = 11) {&lt;br /&gt;          for (a = 0; a &amp;lt;= 10; a++)&lt;br /&gt;              pesel_suma = pesel_suma + (pesel.substr(a, 1) * pesel_waga.substr(a, 1));&lt;br /&gt;          pesel_suma_str = pesel_suma.toString();&lt;br /&gt;&lt;br /&gt;          if (pesel_suma_str.substr(-1, 1) == &#39;0&#39;)&lt;br /&gt;              document.getElementById(&#39;wynik&#39;).innerHTML = &#39;Pesel prawidłowy.&#39;;&lt;br /&gt;          else&lt;br /&gt;           document.getElementById(&#39;wynik&#39;).innerHTML = &#39;Pesel jest nieprawidłowy.&#39;;&lt;br /&gt;&lt;br /&gt;          }&lt;br /&gt;  }&lt;br /&gt;  &amp;lt;/script&gt;&lt;br /&gt;&amp;lt;/head&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;strong&gt;Sprawdzacz peseli&amp;lt;/strong&gt;&amp;lt;br&gt;&lt;br /&gt;  &amp;lt;input type=&quot;text&quot; name=&quot;pesel&quot; onchange=&quot;pesel_check(this.value);&quot;&gt;&lt;br /&gt;&amp;lt;br&gt;&lt;br /&gt;&amp;lt;div id=&quot;wynik&quot;&gt;Tu będzie wynik, albo i nie.&amp;lt;/div&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Można go przetestować &lt;a href=&quot;http://dev.sklepnet.com/pesel_check_2.php&quot;&gt;TU&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Te przykłady są na tyle proste i oczywiste, że każdy bez większych kłopotów użyje sobie gdzie chce i jak chce.&lt;br /&gt;&lt;br /&gt;Powodzenia.&lt;br /&gt;&lt;br /&gt;PS. Możecie śmiało sprawdzać, wyniki nigdzie nie są zapisywane zgodnie z ustawą o ochronie danych osobowych, bla bla bla. Niech nikogo nie zmyli. Sam PESEL jest daną osobową.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/8869536004548124117/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/03/sprawdzanie-poprawnosci-pesel.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/8869536004548124117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/8869536004548124117'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/03/sprawdzanie-poprawnosci-pesel.html' title='Sprawdzanie poprawności PESEL.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-653869298377927932</id><published>2011-03-15T10:38:00.006+01:00</published><updated>2011-03-15T10:56:55.570+01:00</updated><title type='text'>Sklep w osCommerce</title><content type='html'>Postaram się opisać bolączki jakie mogą Cię spotkać podczas używania wyżej wymienionego skryptu i nie zamierzam być delikatny w dziedzinie dziur. Jest ich tylko od cholery. Nie przejmuj się. Mogło być gorzej.&lt;br /&gt;&lt;br /&gt;Zakładam że masz już zainstalowane i skonfigurowany sklep. Instalacja jest banalna, więc nie będę jej opisywał. Poza tym pełno jest stron z mniej czy bardziej szczegółowym opisem.&lt;br /&gt;&lt;br /&gt;O ile znalazłeś na forach na forach że musisz wyrzucić pliki do „Eksplorator Plików”, oraz „Definiowanie Języków”, bo znajduje się tam krytyczna dziura pozwalająca rozwalić Ci cały serwis. Jednym z objawów włamu jest wpis w logi:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&quot;GET /admin/includes/languages/english/modules/newsletters/sh.php&lt;br /&gt;?call=proxy&amp;data=http://www.google.com/search?num=100%26hl=en%26safe=off%&lt;br /&gt;26client=opera%26hs=moz%26rls=en%26q=test%26lr=lang_en%26aq=f%26aqi=%26aql&lt;br /&gt;=%26oq=%26gs_rfai=%26tbs=clue:1%26 HTTP/1.1&quot; 404 335 &quot;http://domena.com&lt;br /&gt;/admin/includes/languages/english/modules/newsletters/sh.php?call=proxy&amp;data&lt;br /&gt;=http://www.google.com/search?num=100%26hl=en%26safe=off%26client=opera%26hs=moz%&lt;br /&gt;26rls=en%26q=test%26lr=lang_en%26aq=f%26aqi=%26aql=%26oq=%26gs_rfai=%26tbs=&lt;br /&gt;clue:1%26&quot; &quot;Opera/9.80 (Windows NT 5.1; U; en) Presto/2.6.30 Version/10.62&quot;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Swoją drogą, zawsze wpis jest Opera. Ciekawe czemu?&lt;br /&gt;Tu już biedny robot nie ma dojścia do tego pliku, bo jakiś cham wykasował, ale to jest plik który Ci napsuje krwi i może być wszędzie. Drugi objaw jest .htaccess z dziwnymi wpisami. Powywalaj je, a gdzie były powstawiaj oryginalne.&lt;br /&gt;&lt;br /&gt;Naprawę tych plików daruj se. Ona nie jest jedna. Jeszcze nie namierzyłem który plik, ale pozwala założyć admina przez niepowołane osoby. Moja rada jest prostsza. Zmień katalog &lt;span style=&quot;font-style:italic;&quot;&gt;admin &lt;/span&gt;na jakikolwiek, byle nie &lt;span style=&quot;font-style:italic;&quot;&gt;administrator &lt;/span&gt;i &lt;span style=&quot;font-style:italic;&quot;&gt;administrators&lt;/span&gt;. Na przykład &lt;span style=&quot;font-style:italic;&quot;&gt;zarzadzanie&lt;/span&gt;, &lt;span style=&quot;font-style:italic;&quot;&gt;adminowanie&lt;/span&gt;, ustawnictwo, a nawet &lt;span style=&quot;font-style:italic;&quot;&gt;zarzondzanie&lt;/span&gt;. Wiem, &lt;span style=&quot;font-weight:bold;&quot;&gt;zarządzanie &lt;/span&gt;piszę się przez &lt;span style=&quot;font-weight:bold;&quot;&gt;ą&lt;/span&gt;, ale włamywacze mogą tego nie wiedzieć. Im bardziej „szalona” nazwa katalogu, tym lepiej.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Zmieniłem i co dalej? &lt;/span&gt;&lt;br /&gt;W&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;twoja_szalona_nazwa&gt;/includes/configure.php znajduje się klucz do sukcesu. Mianowicie:&lt;br /&gt;define(&#39;DIR_WS_ADMIN&#39;, &#39;/admin/&#39;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;zamień na:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;define(&#39;DIR_WS_ADMIN&#39;, &#39;/&amp;lt;twoja_szalona_nazwa&gt;/&#39;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;define(&#39;DIR_FS_ADMIN&#39;, &#39;/&amp;lt;katalog_twojego_sklepu&gt;\AdmiN&#39;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;zmień na:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;define(&#39;DIR_FS_ADMIN&#39;, &#39;/&amp;lt;katalog_twojego_sklepu&gt;\&amp;lt;twoja_szalona_nazwa&gt;&#39;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Możesz spać spokojne. Na razie. Jeżeli znajdę jakąś inną dziurę, która jest w sklepie, nie omieszkam tego napisać.&lt;br /&gt;&lt;br /&gt;Moim drugim usprawnieniem jeszcze przed naprawą wyżej wymienionych plików jest zmiana katalogu &lt;span style=&quot;font-style:italic;&quot;&gt;images&lt;/span&gt;. W pliku konfiguracyjnym admina zmieniłem z:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;define(&#39;DIR_FS_CATALOG_IMAGES&#39;, DIR_FS_CATALOG . &#39;images/&#39;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;na&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;define(&#39;DIR_FS_CATALOG_IMAGES&#39;, DIR_FS_CATALOG . &#39;obrazunie/&#39;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;W pliku konfiguracyjnym sklepu zostawiłem po staremu. Powiecie że nie działa bo nie ma ani jednego obrazka. I tak ma być. Tu trochę jadu dla programistów. Co za poroniony pomysł wrzucać obrazki layoutu ze zdjęciami produktów? &lt;br /&gt;Tak tego zostawić nie można więc potrzebujesz mały wpis do .htaccess:&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;Options +FollowSymLinks&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteRule images/(.*\.(png|gif|jpg)) obrazunie/$1 [L]&lt;br /&gt;RewriteRule obrazunie/(.*\.(sh|txt|php)) tych.php/$1 [L]&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;W pliku &lt;span style=&quot;font-weight:bold;&quot;&gt;tych.php&lt;/span&gt; napisz co myślisz o wszelkich włamaniach, oraz rodzinach włamywaczy, oraz co Cię dziś zdenerwowało. Ogólnie ulżyj se. ;) Bynajmniej tych to nie jest skrót od Tychów, tam są dwa wyrazy. ;)</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/653869298377927932/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2011/03/sklep-w-oscommerce.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/653869298377927932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/653869298377927932'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2011/03/sklep-w-oscommerce.html' title='Sklep w osCommerce'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-7637934762634565171</id><published>2010-04-12T09:50:00.024+02:00</published><updated>2010-04-30T01:20:22.685+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="mysqli"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="prepare statement"/><title type='text'>Funkcja mysqli</title><content type='html'>Oto najprostsza metoda podłączenie się do MySQL&#39;a i zadanie pytania i otrzymanie stosownych odpowiedzi.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;$link = mysql_connect(&quot;localhost&quot;, &quot;franek&quot;, &quot;franek12&quot;);&lt;br /&gt;mysql_select_db(&quot;franek&quot;);&lt;br /&gt;$wynik = mysql_query(&quot;SELECT * FROM tabela WHERE id={$_GET[&#39;id&#39;]}&quot;);&lt;br /&gt;$rekord = mysql_fetch_array($wynik, MYSQL_NUM);&lt;br /&gt;echo &quot;Wynik {$wynik[0]}&quot;;&lt;br /&gt;mysql_close($link);&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ten wzór pokutuje od zawsze. Co jest w mim źle? Szybciej co jest w nim dobrze. Działać będzie działać, ale czemu można tu się włamać.&lt;br /&gt;Pierwszym najważniejszym błędem jest &lt;span style=&quot;font-weight:bold;&quot;&gt;id={$_GET[&#39;id&#39;]}&lt;/span&gt;.&lt;br /&gt;Zawsze można skazić dane tak, żeby naszego spodziewanego ID od 0 do nieskończoności jest wrzucenie czegoś co wywali nam bazę w kosmos, albo i jeszcze dalej. Druga rzecz, nigdy nie nazywaj zmiennej tak jak nazwa w bazie. Po co ułatwiać innym włamywanie się? Nigdy nie używaj &lt;span style=&quot;font-weight:bold;&quot;&gt;*&lt;/span&gt; w zapytaniach. Załóżmy że zmieni Ci się liczba kolumn i co wtedy?&lt;br /&gt;&lt;br /&gt;Teraz mnie więcej wiadomo co źle, teraz weźmy się jak to zrobić dobrze. O ile dobrze istnieje. Powiedzmy poprawnie.&lt;br /&gt; &lt;br /&gt;Zacznijmy od podłączenia do bazy danych. &lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;$link = @mysqli_connect(&#39;localhost&#39;, &#39;użytkownik&#39;, &#39;hasło&#39;, &#39;nazwa_bazy_danych&#39;);&lt;br /&gt;&lt;br /&gt;if (!$link) {&lt;br /&gt;    die(&#39;Błąd połączenia: &#39; . mysqli_connect_errno());&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dodam tu swoje 5 groszy, żeby użytkownik był inny niż nazwa bazy. Pełnią szczęścia był by jeden użytkownik z okrojonymi prawami dla serwisu, a drugi do administrowania bazą.&lt;br /&gt;Szczytem finezji było przekierowanie na inną stronę pod tytułem &quot;Serwis się popsuł&quot;, a błąd zapisać w logach Apache, albo gdzie indziej. Byle nie w bazie, która jak wiadomo z jakiś przyczyn jest niedostępna. Można wysyłać błąd na komórkę, albo e-mailem. To już musi być bardziej zaawansowana procedura, zwłaszcza przy serwisie często odwiedzanym. Wtedy przy każdym kliknięciu administrator dostanie SMS, albo e-mail. W efekcie skrzynka zapcha się mu po 20 minutach, a telefon lub jego właściciel zwariuje o minute później.&lt;br /&gt;&lt;br /&gt;Przy &lt;span style=&quot;font-style:italic;&quot;&gt;mysqli_connect&lt;/span&gt; jest umieszczony &lt;span style=&quot;font-style:italic;&quot;&gt;@&lt;/span&gt;. Jeżeli w php.ini jest ustawione wyświetlanie błędów w skrypcie, &lt;span style=&quot;font-style:italic;&quot;&gt;@&lt;/span&gt; zapobiega temu.&lt;br /&gt;&lt;br /&gt;Bardziej elegancką wersją tego samego jest zmajstrowanie sobie klasy. Brzmi bardzo groźnie, ale nie taki diabeł straszny...&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;$klasa = @new mysqli(&#39;localhost&#39;, &#39;użytkownik&#39;, &#39;hasło&#39;, &#39;nazwa_bazy_danych&#39;);&lt;br /&gt;&lt;br /&gt;if ($klasa-&gt;connect_error) {&lt;br /&gt;    die(&#39;Connect Error: &#39; . $klasa-&gt;connect_error);&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Na pierwszy rzut oka wygląda tak samo. Nie do końca.&lt;br /&gt;Dla tych co nie wiedzą co to jest klasa szybkie objaśnienie. Klasa jest zbiorem funkcji tworząca obiekt z własnymi zmiennymi, które są niewidoczne na zewnątrz. Nie ma problemu kiedy się użyje tej samej zmiennej w różnych klasach.&lt;br /&gt;&lt;br /&gt;To co z tym obiektem dalej? W zasadzie można zrobić jakiegoś SELECT&#39;a w bazie, wyglądać będzie to tak:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$wynik = FALSE;&lt;br /&gt;$objekt = FALSE;&lt;br /&gt;&lt;br /&gt;$baza = new mysqli(&quot;localhost&quot;, &quot;użytkownik&quot;, &quot;hasło&quot;, &quot;baza&quot;);&lt;br /&gt;if (mysqli_connect_errno()) die(&quot;Błąd bazy.&quot;);&lt;br /&gt;$baza-&gt;set_charset(&#39;utf8&#39;);&lt;br /&gt;$typ_pracownika = $baza-&gt;real_escape_string($_GET[&#39;kto&#39;]); &lt;br /&gt;$pytanie = &quot;SELECT `imie`, `nazwisko` FROM `pracownicy` WHERE `typ`=&#39;{$typ_pracownika}&#39;&quot;;&lt;br /&gt;&lt;br /&gt;if ($wynik == $baza-&gt;query($pytanie)) {&lt;br /&gt;    while ($objekt = $wynik-&gt;fetch_object()) {&lt;br /&gt;        printf (&quot;Imię: %s nazwisko: %s &amp;lt;br&gt;\n&quot;, $obj-&gt;imie, $obj-&gt;nazwisko);&lt;br /&gt;    }&lt;br /&gt;    $pytanie-&gt;close();&lt;br /&gt;}&lt;br /&gt;$pytanie-&gt;close();&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;$wynik&lt;/span&gt; i &lt;span style=&quot;font-weight:bold;&quot;&gt;$obiekt&lt;/span&gt; ma specjalne na początku wpisane &lt;span style=&quot;font-weight:bold;&quot;&gt;FALSE&lt;/span&gt;, w razie jak by ktoś kombinował z przemyceniem danych.&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;set_charset&lt;/span&gt; jest tylko i wyłącznie po to, co by klient z bazą gadał UTF-8, a nie LATIN1. Po kilku insertach z wyrazami &quot;gżegżółka&quot; można ciut zblednąć widząc w PHPMySQLAdmin&#39;ie krzaczki w miejscu polskich liter.&lt;br /&gt;Nie używam w zapytaniu *, żeby panować nad pytaniem. Ktoś zmieni nazwę kolumny i pół roku szukania i narzekania &quot;&lt;span style=&quot;font-style:italic;&quot;&gt;czemu nie wyświetla się! Działało jeszcze wczoraj!&lt;/span&gt;&quot; tak będzie błąd &quot;&lt;span style=&quot;font-style:italic;&quot;&gt;nieznana nazwa&lt;/span&gt;&quot;.&lt;br /&gt;Porada dla początkujących w MySQL. Wszystkie nazwy kolumn aliasów tabel baz danych powinny być w &lt;span style=&quot;font-weight:bold;&quot;&gt;` `&lt;/span&gt;, a wartości w &lt;span style=&quot;font-weight:bold;&quot;&gt;&#39; &#39;&lt;/span&gt;. Po pierwsze czytelniejszy SQL, po drugie jest jasność dla interpretera (na posty typu bez tego też działa, nie odpisuje).&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;real_escape_string&lt;/span&gt; jest elegancką funkcją wstawiającą m.i. &lt;span style=&quot;font-weight:bold;&quot;&gt;/&lt;/span&gt; przed &lt;span style=&quot;font-weight:bold;&quot;&gt;&#39;&lt;/span&gt;, co by nam ktoś nie skaził danych.Zawsze można powiedzieć że w niektórych MySQL ta funkcja ma luki. W sumie to fakt, nigdy nie wiadomo na jakim będzie to serwerze działało i jaką wersją bazy. Może wtedy wykorzystać &lt;span style=&quot;font-weight:bold;&quot;&gt;STR_REPLACE&lt;/span&gt;, wpakować tablice co na co ma wymienić... albo użyć coś bardziej pokrętnego, czyli &lt;span style=&quot;font-weight:bold;&quot;&gt;PREPARE STATEMENT&lt;/span&gt;. A oto i on!&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;$baza = new mysqli(&quot;localhost&quot;, &quot;użytkownik&quot;, &quot;hasło&quot;, &quot;baza&quot;);&lt;br /&gt;if (mysqli_connect_errno()) die(&quot;Błąd bazy.&quot;);&lt;br /&gt;$baza-&gt;set_charset(&#39;utf8&#39;);&lt;br /&gt;$baza = $db-&gt;prepare(&quot;SELECT `imie`, `nazwisko` FROM `ludzie` WHERE `ksywa` = ? LIMIT 1&quot;);&lt;br /&gt;$baza-&gt;bind_param(&#39;s&#39;, $_GET[&#39;nick&#39;]);&lt;br /&gt;$baza-&gt;execute();&lt;br /&gt;$baza-&gt;bind_result($f_name, $s_name);&lt;br /&gt;$baza-&gt;fetch(); &lt;br /&gt;$baza-&gt;close();&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To jest przykład wyrwany z jakiegoś dawnego wiekopomnego dzieła, jak mnie jeszcze źli ludzie nie terroryzowali Java. &lt;br /&gt;W SQL tam gdzie jest pierwszy znak zapytania (w tym przypadku i ostatni) będziemy wstawiali zmienną. Czemu nie w &#39;&#39;? Nie potrzeba. &lt;span style=&quot;font-weight:bold;&quot;&gt;bind_param&lt;/span&gt; podstawia elegancko coś wysłane do skryptu metodą GET, a &lt;span style=&quot;font-weight:bold;&quot;&gt;s&lt;/span&gt; sygnalizuje że to jest &lt;span style=&quot;font-weight:bold;&quot;&gt;STRING&lt;/span&gt;. Jak wstawimy &lt;span style=&quot;font-weight:bold;&quot;&gt;I&lt;/span&gt; będzie &lt;span style=&quot;font-weight:bold;&quot;&gt;INTEGER&lt;/span&gt;. jeszcze jest &lt;span style=&quot;font-weight:bold;&quot;&gt;d&lt;/span&gt; jak &lt;span style=&quot;font-weight:bold;&quot;&gt;double&lt;/span&gt; i &lt;span style=&quot;font-weight:bold;&quot;&gt;b&lt;/span&gt;jak &lt;span style=&quot;font-weight:bold;&quot;&gt;BLOB&lt;/span&gt;. Duży binarny obiekt (np. kompromitujące kogoś zdjęcie). Jak ktoś ma dwa znaki zapytania w zapytaniu lub więcej musi w pierwszym parametrze nawstawiać literki co to za zwierz, a dalej po przecinku w odpowiedniej kolejności powpisywać wartości. Na przykład:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-size:12px; background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$baza-&gt;bind_param(&#39;iss&#39;, $id, $imie, $nazwisko);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I jest szczęśliwy że działa.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Execute&lt;/span&gt; wiadomo.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;bind_result&lt;/span&gt; wrzuca w poszczególne zmienne wartości z zapytania.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;fetch&lt;/span&gt; przechwytuje. W tym przypadku spodziewamy się jednego osobnika. Po pierwsze &lt;span style=&quot;font-weight:bold;&quot;&gt;NICK&lt;/span&gt; który teoretycznie powinien być unikalny, po drugie żeby baza za nas nie musiała kombinować jak nie ma klauzuli unikalności z jakiś przyczyn, jak znajdzie jednego delikwenta, niech dalej się nie męczy.&lt;br /&gt;Jeżeli jednak chcemy mieć więcej rekordów niż jeden umieszczamy &lt;span style=&quot;font-weight:bold;&quot;&gt;fetch&lt;/span&gt; w pętli.&lt;br /&gt;&lt;br /&gt;Teraz można już coś z bazą robić. Jest tam parę zgrzytów i można by było zrobić lepiej, ale ktoś może mnie tez poprawiać, w napadzie szału wyśmiać gdzieś na blogu.&lt;br /&gt;&lt;br /&gt;PS. Ci co szukają w wyszukiwarce przykładów do CV, albo są po rozmowie kwalifikacyjnej i muszą teraz błysnąć intelektem w jakimś przykładzie przez siebie stworzonym mam ostrzeżenie. Zmieniajcie choć nazwy zmiennych. Przyszły pracodawca na pewno to znajdzie w w sieci, albo przypadkowo zna te przykłady od dawna. ;)</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/7637934762634565171/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2010/04/funkcja-mysqli.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7637934762634565171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7637934762634565171'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2010/04/funkcja-mysqli.html' title='Funkcja mysqli'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-3638658187251054160</id><published>2010-04-05T22:16:00.000+02:00</published><updated>2010-04-05T22:16:44.162+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP funkcja echo"/><title type='text'>Funkcja ECHO</title><content type='html'>Ostatnio odkryłem funkcje ECHO. Działa rewelacyjnie. Piszę:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;i&gt;echo &quot;Ala ma psa&quot;;&lt;br /&gt;
echo &#39;Ala ma kota&#39;;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
I tu się zaczynają schody, wyższość świąt Bożego Narodzenia, nad świętami Wielkiej nocy. W &quot; &quot; działa wolniej i nie można używać, za to w &#39; &#39; nie można używać zmiennych takich jak&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;i&gt;echo &quot;Ala ma {$ilosc} kotów&quot;;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Za to używając pojedynczych trzeba używać składni: &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #cccccc; border: 1px solid black;&quot;&gt;&lt;i&gt;echo &#39;Ala ma &#39;.$ilosc.&#39; kotów&#39;;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Oczywiście wiadoma sprawa, w cudzysłowach jest zaledwie miliard wolniejszy niż w apostrofach.&lt;br /&gt;
&lt;br /&gt;
Dobra, dość tych mitów.&lt;br /&gt;
W cudzysłowach faktycznie działa wolniej.&amp;nbsp; Problem w tym, że różnica jest w błędzie statystycznym i nie ma czym se głowy zawracać. Jedna ważna rzecz, trzeba zmienne pisać w klamrach. Wiem że działa bez, ale czasem zdarzają się dziwne rzeczy, zwłaszcza jak używa się tablic do wyświetlenia.&lt;br /&gt;
&lt;br /&gt;
Jest jeszcze jedna zdobycz techniki:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #cccccc; border: 1px solid black;&quot;&gt;echo &amp;lt;&amp;lt;&amp;lt;EOF&lt;br /&gt;
Ala ma {$ilosc} kotów.&lt;br /&gt;
Ola &quot;miała&quot; {$psy[&#39;ola&#39;]} psów.&lt;br /&gt;
echo &quot;to mój przykład z PHP&quot;; &lt;br /&gt;
EOF;&lt;/div&gt;&lt;br /&gt;
Działa w sposób banalny, widzi &amp;lt;&amp;lt;&amp;lt;, po tym jest jakiś ciąg znaczków. W tym przypadku &lt;b&gt;&lt;i&gt;EOF&lt;/i&gt;&lt;/b&gt;. Jeżeli ktoś mi zada pytanie dlaczego EOF (End of File), to powiem że nie wiem. Zamiast &lt;i&gt;&lt;b&gt;EOF&lt;/b&gt;&lt;/i&gt; można użyć dowolny ciąg znaków. Chodzi o to, żeby interpreter wiedział kiedy zakończyć wyświetlanie. Dobrze może być:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #cccccc; border: 1px solid black;&quot;&gt;echo &amp;lt;&amp;lt;&amp;lt;NIENAWIDZE_KACZEK&lt;br /&gt;
Ala ma {$ilosc} kotów.&lt;br /&gt;
Ola &quot;miała&quot; {$psy[&#39;ola&#39;]} psów.&lt;br /&gt;
echo &quot;to mój przykład z PHP&quot;; &lt;br /&gt;
NIENAWIDZE_KACZEK;&lt;/div&gt;&lt;br /&gt;
Ważne żeby na początku i na końcu będzie ten sam ciąg. W środku może być dokładnie wszystko. No może z wyjątkiem równań różniczkowych.&lt;br /&gt;
&lt;br /&gt;
Kiedy robi się aplikację, w której liczy się każdy takt zegara (coś, co jest znane tylko na demo scenie), można wydziwiać która metoda jest lepsza. &lt;br /&gt;
W tej chwili jest ważne co jest wygodniejsze w tej chwili w danym miejscu.</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/3638658187251054160/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2010/04/funkcja-echo.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/3638658187251054160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/3638658187251054160'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2010/04/funkcja-echo.html' title='Funkcja ECHO'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4173337481551559793.post-7559023545432734435</id><published>2010-03-30T00:01:00.001+02:00</published><updated>2010-04-01T23:50:11.859+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="php porady kod błędy"/><title type='text'>Pierwszy tekst</title><content type='html'>Jak domyślam się iż&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;&amp;lt;?php&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;echo &quot;Witaj świecie&quot;;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;?&amp;gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
każdy zna. Jeżeli nie, ten blog nie jest dla niego.&lt;br /&gt;
Zawsze chciałem zadać zadanie, żeby tę jedną linie napisać tak, żeby maksymalnie rozbudować kod. &lt;br /&gt;
&lt;br /&gt;
Wiem, szaleństwo. Niestety jak patrze w różne kody czasem mam wrażenie że tę tendencje ma większość programistów.&amp;nbsp; Może dlatego postanowiłem wziąć brzytwę Ockhama i wycinać co jest zbędne i niepotrzebne.&lt;br /&gt;
&lt;br /&gt;
Często popełnianą herezją jest&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;$zmienna = $_POST[&#39;zmienna&#39;];&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;echo $zmienna;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
jak by nie można od razu&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;echo $_POST[&#39;zmienna&#39;];&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Obie metody są niebezpieczne, zawsze znajdzie się jakiś hakier i wyśle postem:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;&amp;lt;div style=&quot;position: absolute; background-color: red; color: white; border: 1px black solid;&quot;&amp;gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;shakwał tą strone&amp;lt;br&amp;gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;pytek frytek&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;lt;/div&amp;gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Po pierwsze zcrackował, po drugie drugie takich spławia się punkcją&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #ccc; border: 1px black solid&quot;&gt;&lt;i&gt;echo htmlentities($_POST[&#39;zmienna&#39;]);&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Amen.&lt;br /&gt;
&lt;br /&gt;
Nie jest to eleganckie rozwiązanie, ale zapobiega wrzucaniom jakiś tagów, złośliwych JS, oraz innego dziadostwa.&lt;br /&gt;
Istotą rzeczy jest, żeby nie wierzyć poprawności danych przychodzących na serwer. Zawsze znajdzie się jakiś gieniuś, albo inna tragedia i będzie próbowało przemycić skażone dane, albo &quot;świadomy użytkownik&quot; dorwał się do komputera.&lt;br /&gt;
&lt;br /&gt;
Oczywiście przykłady były banalne, w rzeczywistości były bardziej zawiłe, ale szkielet był mniej więcej taki jak w tych prościutkich przykładach. Nie &lt;i&gt;echo&lt;/i&gt; z &lt;b&gt;&lt;i&gt;post&lt;/i&gt;&lt;/b&gt;, tylko z bazy, do której wrzucił inny skrypt nie sprawdzając kontentu. &lt;br /&gt;
&lt;br /&gt;
To na tyle w dziedzinie mądrzenia się. Jak spodoba się, to będę pisał dalej, jeżeli nie, to zobaczę. ;)</content><link rel='replies' type='application/atom+xml' href='http://plxus.blogspot.com/feeds/7559023545432734435/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plxus.blogspot.com/2010/03/pierwszy-tekst.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7559023545432734435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4173337481551559793/posts/default/7559023545432734435'/><link rel='alternate' type='text/html' href='http://plxus.blogspot.com/2010/03/pierwszy-tekst.html' title='Pierwszy tekst'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/00896431358148034394</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>