1
0
mirror of https://github.com/php/doc-pl.git synced 2026-03-23 22:52:11 +01:00

Translate some pages of the FAQ section

I was going to translate more but it turns out the FAQ is very outdated,
so let's start with other priorities first.
This commit is contained in:
Maciej Sobaczewski
2024-10-27 22:10:11 +01:00
parent 84adff610c
commit 2d7d5e82e2
3 changed files with 1057 additions and 0 deletions

489
faq/build.xml Normal file
View File

@@ -0,0 +1,489 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b8e1b1357def73f310c9f7405035b3acc0cb1eaf Maintainer: sobak Status: wip -->
<!-- TODO: Dokończyć jak komuś będzie się nudzić :) zacząłem tłumaczyć, ale ten plik jest starożytny, nikt z tego nie skorzysta -->
<chapter xml:id="faq.build" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Problemy z kompilacją</title>
<titleabbrev>Problemy z kompilacją</titleabbrev>
<para>
Ta sekcja zbiera najczęstsze błędy, które występują
w trakcie kompilacji.
</para>
<qandaset>
<qandaentry xml:id="faq.build.configure">
<question>
<para>
Pobrałem najnowszą wersję PHP używając anonimowej usługi Git,
ale nie widzę skryptu configure!
</para>
</question>
<answer>
<para>
Musisz mieć zainstalowaną paczkę GNU autoconf, aby móc
wygenerować skrypt configure z pliku <filename>configure.in</filename>. Uruchom
<command>./buildconf</command> w głównym katalogu po pobraniu
źródeł z serwera Git. Ponadto, o ile nie uruchomisz <command>configure</command>
z flagą <literal>--enable-maintainer-mode</literal>, skrypt
configure nie zostanie przebudowany automatycznie kiedy plik
<filename>configure.in</filename> zostanie zaktualizowany, więc upewnij się, że robisz to
ręcznie, kiedy zauważysz, że plik <filename>configure.in</filename> się zmienił. Jednym z objawów
takiej sytuacji jest znajdowanie fragmentów takich jak @VARIABLE@ w pliku Makefile
po uruchomieniu configure lub <filename>config.status</filename>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.configuring">
<question>
<para>
Mam problem w skonfigurowaniu PHP, aby działał z Apache.
Błąd mówi, że nie można znaleźć <filename>httpd.h</filename>, ale jest tam, gdzie powiedziałem, że jest!
</para>
</question>
<answer>
<para>
Musisz podać skryptowi configure/setup lokalizację
głównego katalogu źródeł Apache. Oznacza to,
że chcesz podać <option
role="configure">--with-apache=/sciezka/do/apache</option>
a <emphasis>nie</emphasis> <option
role="configure">--with-apache=/sciezka/do/apache/src</option>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.lex">
<question>
<para>
Podczas konfiguracji PHP (<literal>./configure</literal>) napotkałeś na
błąd podobny do tego:
</para>
<para>
<screen>
checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up
</screen>
</para>
</question>
<answer>
<para>
Upewnij się, że przeczytałeś instrukcje <link linkend="install.unix">instalacji</link>
dokładnie i zwróć uwagę, że potrzebujesz mieć zainstalowane zarówno
paczki flex i bison, aby skompilować PHP. W zależności od Twojego środowiska
paczki bison i flex zainstalujesz ze źródeł lub z paczek, takich jak RPM.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.apache-sharedcore">
<question>
<para>
Kiedy próbuję wystartować Apache, otrzymuję następujący komunikat:
</para>
<para>
<screen>
fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found
</screen>
</para> </question>
<answer>
<para>
Ten błąd zazwyczaj pojawia się gdy główny program Apache
został skompilowany jako biblioteka DSO do użycia współdzielonego. Spróbuj
zrekonfigurować Apache, upewnij się, że używasz przynajmniej
następujących flag:
</para>
<para>
<screen>
--enable-shared=max --enable-rule=SHARED_CORE
</screen>
</para>
<para>
Po więcej informacji przeczytaj plik
<filename>INSTALL</filename> w głównym katalogu źródeł
Apache lub stronę manuala Apache
<link xlink:href="&url.apachedso;">poświęconą DSO</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.not-found">
<question>
<para>
Kiedy uruchamiam configure, komunikat mówi, że nie udało się znaleźć
plików include lub biblioteki dla GD, gbm lub innej paczki!
</para>
</question>
<answer>
<para>
Możesz sprawić, że skrypt configure będzie szukał plików nagłówków i bibliotek
w niestandardowych lokalizacjach używając dodatkowych flag do przekazania
do preprocesora C oraz linkera, takich jak:
<programlisting>
<![CDATA[
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
]]>
</programlisting>
Jeśli używasz powłoki w wariancie csh (po co?), będzie to:
<programlisting>
<![CDATA[
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.yytname">
<question>
<para>
Podczas kompilacji pliku <filename>language-parser.tab.c</filename> otrzymuję błędy
mówiące <literal>yytname undeclared</literal>.
</para>
</question>
<answer>
<para>
Musisz zaktualizować Twoją wersję Bisona. Możesz znaleźć najnowszą wersję
pod adresem <link xlink:href="&url.bison;">&url.bison;</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.link">
<question>
<para>
Kiedy uruchamiam <command>make</command>, wydaje się, że działa w porządku, ale potem następuje błąd
podczas próby linkowania finalnej aplikacji, mówiący, że nie udało się znaleźć jakichś plików.
</para>
</question>
<answer>
<para>
Niektóre stare wersje make, niepoprawnie umieszczają skompilowane
wersje plików z katalogu functions w tym samym katalogu.
Spróbuj uruchomić <command>cp *.o functions</command> a potem
uruchom <command>make</command> ponownie i zobacz, czy to pomogło. Jeśli tak, to powinieneś
naprawdę zaktualizować wersję GNU make.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.undefined">
<question>
<para>
Podczas linkowania PHP, pojawia się błąd o niezdefiniowanych referencjach.
</para>
</question>
<answer>
<para>
Spójrz na linię linkowania i upewnij się, że wszystkie potrzebne
biblioteki zostały dołączone na jej końcu. Często zdarza się pominięcie
'-ldl' i bibliotek wymaganych dla obsługi bazy danych,
którą wybrałeś.
</para>
<para>
Niektórzy użytkownicy zgłaszali też, że musieli dodać '-ldl' bezpośrednio
po <filename>libphp4.a</filename> podczas linkowania z Apache.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.not-running">
<question>
<para>
Przeszedłem przez wszystkie kroki instalacji modułu Apache w wersji na
Unix, ale moje skrypty PHP pokazują się w przeglądarce lub pokazuje się
okno zapisu pliku.
</para>
</question>
<answer>
<para>
To oznacza, że moduł PHP nie jest wywoływany z jakiegoś powodu.
Przed poproszeniem o pomoc należy sprawdzić trzy rzeczy:
<itemizedlist>
<listitem>
<simpara>
Upewnij się, że plik httpd, którą uruchamiasz jest faktycznie
nowym plikiem binarnym httpd, kóry właśnie skompilowałeś. Aby to zrobić uruchom:
<literal>/path/to/binary/httpd -l</literal>
</simpara>
<simpara>
Jeżeli nie widzisz <filename>mod_php4.c</filename> wymienionego, to
nie uruchamiasz poprawnego pliku binarnego. Znajdź i zainstaluj
poprawny plik binarny.
</simpara>
</listitem>
<listitem>
<simpara>
Upewnij się, że dodałeś poprawny typ Mime do jednego z Twoich plików
<literal>Apache .conf</literal>. Powinno to być:
<literal>AddType application/x-httpd-php .php</literal>
</simpara>
<simpara>
Upewnij się też, że ta linia AddType nie jest ukryta wewnątrz
bloku &lt;Virtualhost&gt; lub &lt;Directory&gt;, który
zapobiegłby użyciu jej dla lokalizacji Twojego skryptu testowego.
</simpara>
</listitem>
<listitem>
<simpara>
W końcu, domyślna lokalizacja plików konfiguracyjnych Apache
zmieniła się między Apache 1.2 i Apache 1.3. Powinieneś sprawdzić
i upewnić się, że plik konfiguracyjny, w którym dodajesz linię z
AddLine jest faktycznie odczytywany. Możesz umieścić oczywisty błąd składniowy
wewnątrz pliku &httpd.conf; lub inną zmianę, która
powie Ci, czy odczytywany jest poprawny plik.
</simpara>
</listitem>
</itemizedlist>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.activate-module">
<question>
<para>
It says to use: <literal>--activate-module=src/modules/php4/libphp4.a</literal>,
but that file doesn't exist, so I changed it to
<literal>--activate-module=src/modules/php4/libmodphp4.a</literal> and it
doesn't work!? What's going on?
</para>
</question>
<answer>
<para>
Note that the <filename>libphp4.a</filename> file is not supposed to exist. The
apache process will create it!
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.ansi">
<question>
<para>
When I try to build Apache with PHP as a static module using
<literal>--activate-module=src/modules/php4/libphp4.a</literal>
it tells me that my compiler is not ANSI compliant.
</para>
</question>
<answer>
<para>
This is a misleading error message from Apache that has been fixed
in more recent versions.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.apxs">
<question>
<para>
When I try to build PHP using <option
role="configure">--with-apxs</option> I get strange error messages.
</para>
</question>
<answer>
<para>
There are three things to check here. First, for some reason
when Apache builds the apxs Perl script, it sometimes ends up
getting built without the proper compiler and flags variables.
Find your apxs script (try the command <command>which apxs</command>),
it's sometimes found in <filename>/usr/local/apache/bin/apxs</filename>
or <filename>/usr/sbin/apxs</filename>.
Open it and check for lines similar to these:
<programlisting>
<![CDATA[
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
]]>
</programlisting>
If this is what you see, you have found your problem. They may
contain just spaces or other incorrect values, such as 'q()'. Change
these lines to say:
<programlisting>
<![CDATA[
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared); # substituted via Makefile.tmpl
]]>
</programlisting>
The second possible problem should only be an issue on Red Hat 6.1
and 6.2. The apxs script Red Hat ships is broken. Look for this line:
<programlisting>
<![CDATA[
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
]]>
</programlisting>
If you see the above line, change it to this:
<programlisting>
<![CDATA[
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
]]>
</programlisting>
Last, if you reconfigure/reinstall Apache, add a <command>make clean</command>
to the process after <command>./configure</command> and before <command>make</command>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.microtime">
<question>
<para>
During <command>make</command>, I get errors in microtime,
and a lot of <literal>RUSAGE_</literal> stuff.
</para>
</question>
<answer>
<para>
During the <command>make</command> portion of installation,
if you encounter problems that look similar to this:
<programlisting>
<![CDATA[
microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1
]]>
</programlisting>
</para>
<para>
Your system is broken. You need to fix your <filename>/usr/include</filename> files by
installing a glibc-devel package that matches your glibc. This has
absolutely nothing to do with PHP. To prove this to yourself, try this
simple test:
<programlisting>
<![CDATA[
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
]]>
</programlisting>
If that spews out errors, you know your include files are messed up.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.mysql.tempnam">
<question>
<para>
When compiling PHP with MySQL, configure runs fine but during
<literal>make</literal> I get an error similar to the following:
<emphasis>ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function
my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the
use of tempnam' is dangerous, better use mkstemp'</emphasis>,
what's wrong?
</para>
</question>
<answer>
<para>
First, it's important to realize that this is a <literal>
Warning</literal> and not a fatal error. Because this is
often the last output seen during <literal>make</literal>,
it may seem like a fatal error but it's not. Of course, if
you set your compiler to die on Warnings, it will. Also
keep in mind that MySQL support is enabled by default.
</para>
<note>
<para>
As of PHP 4.3.2, you'll also see the following text after
the build (make) completes:
</para>
<para>
<screen>
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
</screen>
</para>
</note>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.upgrade">
<question>
<para>
I want to upgrade my PHP. Where can I find the <command>./configure</command>
line that was used to build my current PHP installation?
</para>
</question>
<answer>
<para>
Either you look at config.nice file, in the source tree of your current PHP
installation or, if this is not available, you simply run a
<programlisting role="php">
<![CDATA[
<?php phpinfo(); ?>
]]>
</programlisting>
script. On top of the output the <command>./configure</command> line, that was used
to build this PHP installation is shown.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.gdlibs">
<question>
<para>
When building PHP with the GD library it either gives strange compile errors
or segfaults on execution.
</para>
</question>
<answer>
<para>
Make sure your GD library and PHP are linked against the same depending
libraries (e.g. libpng).
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.installation.needgnu">
<question>
<para>
When compiling PHP I seemingly get random errors, like it hangs.
I'm using Solaris if that matters.
</para>
</question>
<answer>
<para>
Using non-GNU utilities while compiling PHP may cause problems. Be
sure to use GNU tools in order to be certain that compiling PHP will
work. For example, on Solaris, using either the SunOS BSD-compatible
or Solaris versions of <literal>sed</literal> will not work, but using
the GNU or Sun POSIX (xpg4) versions of <literal>sed</literal> will
work. Links: <link xlink:href="&url.sed;">GNU sed</link>,
<link xlink:href="&url.flex;">GNU flex</link>, and
<link xlink:href="&url.bison;">GNU bison</link>.
</para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

194
faq/passwords.xml Normal file
View File

@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: sobak Status: ready -->
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Bezpieczne haszowanie haseł</title>
<titleabbrev>Haszowanie haseł</titleabbrev>
<simpara>
Ta sekcja wyjaśnia powody, dla których należy używać funkcji haszujących
(skrótu) do zabezpieczania haseł, a także jak zrobić to efektywnie.
</simpara>
<qandaset>
<qandaentry xml:id="faq.passwords.hashing">
<question>
<simpara>
Czemu hasła podawane przez użytkowników powinny być haszowane?
</simpara>
</question>
<answer>
<simpara>
Haszowanie haseł jest jedną z podstawowych metod zapewniania bezpieczeństwa, która
musi być uwzględniona na etapie projektowania aplikacji lub usługi, która przyjmuje hasła
od użytkowników. Bez haszowania dowolne przechowywane hasła mogą
mogą paść ofiarą kradzieży w wypadku naruszenia źródła danych, a
potem natychmiast użyte nie tylko do zaatakowania aplikacji lub usługi, ale także
kont użytkowników w innych usługach, jeżeli nie używają oni
unikalnych haseł.
</simpara>
<simpara>
Stosując funkcję skrótu do haseł użytkowników przed ich zapisaniem,
odgadnięcie oryginalnego hasła przez atakującego staje się niemal niewykonalne,
a my wciąż będziemy mogli porównywać wynikowy hasz do oryginalnego hasła.
</simpara>
<simpara>
Należy jednak zauważyć, że haszowanie haseł chroni jedynie przed
ich wykradnięciem z miejsca przechowywania danych, ale już nie przed
przechwyceniem przez złośliwy kod wstrzyknięty do samej aplikacji
lub usługi.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.fasthash">
<question>
<simpara>
Dlaczego popularne funkcje haszujące jak <function>md5</function> czy
<function>sha1</function> nie nadają się do haszowania haseł?
</simpara>
</question>
<answer>
<simpara>
Algorytmy haszujące takie jak MD5, SHA1 czy SHA256 zostały zaprojektowane
tak, by były bardzo szybkie i wydajne. Przy użyciu nowoczesnych technik i sprzętu,
trywialne stały się ataki typu <quote>brute force</quote> na wyniku działania tych funkcji
tak, aby odgadnąć oryginalne dane wejściowe.
</simpara>
<simpara>
Ze względu na to, jak szybko dzisiejsze komputery potrafią <quote>odwrócić</quote> te algorytmy
haszujące, wielu profesjonalistów z zakresu bezpieczeństwa nie poleca ich
stosowania do haszowania haseł.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.bestpractice">
<question>
<simpara>
Jak powinny być haszowane hasła, jeśli popularne funkcje skrótu nie
nadają się do tego?
</simpara>
</question>
<answer>
<simpara>
Podczas haszowania haseł dwa najważniejsze aspekty to
koszt obliczeniowy oraz sól. Im bardziej kosztowny obliczeniowo
jest algorytm haszujący, tym dłużej zajmie aby poddać wynik jego działania
atakowi brute force.
</simpara>
<simpara>
PHP udostępnia
<link linkend="book.password">wbudowane API do haszowania haseł</link>, które
bezpiecznie obsługuje zarówno <link linkend="function.password-hash">haszowanie</link>
oraz <link linkend="function.password-verify">weryfikację haseł</link>
w poprawny sposób.
</simpara>
<simpara>
Do haszowania haseł sugeruje się użycie algorytmu Blowfish, który
jest także domyślnym algorytmem używanym przez API do haszowania haseł, jako że
jest on zdecydowanie bardziej kosztowny obliczeniowo niż MD5 lub SHA1, a przy tym
wciąż jest skalowalny.
</simpara>
<simpara>
Do haszowania haseł może nadać się także funkcja <function>crypt</function>,
ale sugeruje się jej wykorzystanie tylko w celu osiągnięcia kompatybilności
z innymi systemami.
Zamiast tego zdecydowanie zaleca się użycie
<link linkend="book.password">wbudowanego API haszowania haseł</link>,
gdy tylko jest to możliwe.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.salt">
<question>
<simpara>
Czym jest sól?
</simpara>
</question>
<answer>
<simpara>
Sól kryptograficzna to dane, które są stosowane podczas procesu haszowania,
aby uniemożliwić wyszukanie wyniku działania algorytmu na
listach wcześniej obliczonych par haszy i ich danych wejściowych,
znanych jako tęczowe tablice.
</simpara>
<simpara>
W prostych słowach, sól to trochę dodatkowych danych, które powodują,
że hasze stają się znacznie trudniejsze do złamania. Istnieje wiele
usług online, które posiadają rozbudowane listy wcześniej obliczonych haszy
oraz oryginalnych danych wejściowych dla tych haszy. użycie soli powoduje,
że znalezienie wynikowego hasza na takich listach jest mało prawdopodobne
lub wręcz niemożliwe.
</simpara>
<simpara>
<function>password_hash</function> stworzy losową sól, jeśli nie została
ona podana. Ogólnie rzecz biorąc jest to najprostsze i najbezpieczniejsze
podejście.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.password.storing-salts">
<question>
<simpara>
Jak przechowywana jest sól?
</simpara>
</question>
<answer>
<simpara>
Jeśli użyta została funkcja <function>password_hash</function> lub
<function>crypt</function>, zwrócona przez nią wartość zawiera także
sól jako element wygenerowanego hasza. Ta wartość powinna być zapisana w
niezmienionej postaci w bazie danych, gdyż zawiera informacje o tym,
jaka funkcja haszująca została wykorzystana do jej stworzenia i można taką
wartość przekazać bezpośrednio do <function>password_verify</function> podczas
weryfikacji hasła.
</simpara>
<warning>
<simpara>
Aby uniknąć ataków opartych o czas do sprawdzenia haseł powinna być
zawsze wykorzystywana funkcja <function>password_verify</function>,
a nie ponowne obliczenie hasza i porównanie wyników.
</simpara>
</warning>
<simpara>
Poniższy diagram pokazuje format wartości zwracanej przez
<function>crypt</function> oraz <function>password_hash</function>. Jak
widać jest ona samodzielna, zawiera wszystkie informacje
na temat algorytmu oraz soli wymaganej do późniejszej weryfikacji hasła.
</simpara>
<para>
<mediaobject>
<alt>
Elementy wartości zwracanej przez funkcje password_hash oraz crypt to
kolejno: wybrany algorytm, opcje algorytmu, wykorzystana sól
oraz zahaszowane hasło.
</alt>
<imageobject>
<imagedata fileref="en/faq/figures/crypt-text-rendered.svg" width="690" depth="192" format="SVG" />
</imageobject>
</mediaobject>
</para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

374
faq/using.xml Normal file
View File

@@ -0,0 +1,374 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 0a3a57fae02391db80baeba98c9a071dc2760889 Maintainer: sobak Status: ready -->
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Użycie PHP</title>
<titleabbrev>Użycie PHP</titleabbrev>
<para>
Ta sekcja zbiera wiele powszechnych błędów, które możesz napotkać
podczas pisania skryptów PHP.
</para>
<qandaset>
<qandaentry xml:id="faq.using.parameterorder">
<!-- TODO: Mention named arguments -->
<question>
<para>
Nie mogę zapamiętać kolejności parametrów funkcji PHP, jest losowa?
</para>
</question>
<answer>
<para>
PHP jest klejem, który łączy setki bibliotek zewnętrznych, więc czasami
faktycznie powstaje bałagan. Jednak istnieje prosta i pomocna reguła:
</para>
<para>
Parametry w <link linkend="book.array">funkcjach tablic</link> mają kolejność
as "<emphasis>needle, haystack</emphasis>" (igła, stóg siana), podczas
gdy w <link linkend="book.strings">funkcjach ciągów znaków</link> jest na odwrót,
a więc "<emphasis>haystack, needle</emphasis>".
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.anyform">
<question>
<para>
Chciałbym napisać ogólny skrypt PHP, który może obsłużyć dane przychodzące
z dowolnego formularza. Skąd mam wiedzieć jakie zmienne metody POST są dostępne?
</para>
</question>
<answer>
<para>
PHP oferuje wiele <link linkend="language.variables.predefined">
zmiennych predefiniowanych</link>, takich jak superglobalna zmienna <varname>$_POST</varname>.
Możesz przejść pętlą po <varname>$_POST</varname>
jako że jest to tablica asocjacyjna wszystkich wartości wysłanych tą metodą. Przykładowo,
przeiterujmy się po wszystkich z nich używając &foreach;,
sprawdzając puste wartości konstrukcją <function>empty</function>
i wyświetlmy je.
<programlisting role="php">
<![CDATA[
<?php
$puste = $post = array();
foreach ($_POST as $nazwaZmiennej => $wartoscZmiennej) {
if (empty($wartoscZmiennej)) {
$puste[$nazwaZmiennej] = $wartoscZmiennej;
} else {
$post[$nazwaZmiennej] = $wartoscZmiennej;
}
}
print "<pre>";
if (empty($puste)) {
print "Żadna z wartości wysłanych przez POST nie jest pusta, wysłano:\n";
var_dump($post);
} else {
print "Mamy " . count($empty) . " pustych wartości\n";
print "Wysłano:\n"; var_dump($post);
print "Puste:\n"; var_dump($empty);
exit;
}
?>
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.addslashes">
<!-- TODO Probably should mention not doing this... -->
<question>
<para>
Muszę przekonwertować wszystkie apostrofy (') do odwrotnego slasha,
po którym jest apostrof (\'). Jak mogę to zrobić wyrażeniem
regularnym? Chciałbym też zamienić " na \" i
\ na \\.
</para>
</question>
<answer>
<para>
Zakładając, że robisz to na potrzeby bazy danych, skorzystaj z mechanizmu escape'owania
dostarczonego razem z bazą danych. Przykładowo użyj
<function>mysql_real_escape_string</function> dla MySQL i
<function>pg_escape_string</function> dla PostgreSQL. Istnieją
też ogólne funkcje <function>addslashes</function> i
<function>stripslashes</function>, które były
stosowane bardziej powszechnie w starym kodzie PHP.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.wrong-order">
<question>
<para>
Przy takim kodzie wynik jest wyświetlany w złej
kolejności:
<programlisting role="php">
<![CDATA[
<?php
function funkcja($argument)
{
echo $argument + 10;
}
$zmienna = 10;
echo "funkcja($zmienna) = " . funkcja($zmienna);
?>
]]>
</programlisting>
o co chodzi?
</para>
</question>
<answer>
<para>
Aby móc użyć wyniku funkcji w wyrażeniu (takim
jak konkatenacja z innymi ciągami znaków, musisz zwrócić wartość
używając <function>return</function>, a nie
wyświetlić ją.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.newlines">
<question>
<para>
Hej, co stało się z moimi przełamaniami linii?
<programlisting role="php">
<![CDATA[
<pre>
<?php echo "To powinna być pierwsza linia."; ?>
<?php echo "To powinno się pokazać po pierwszej linii powyżej."; ?>
</pre>
]]>
</programlisting>
</para>
</question>
<answer>
<para>
W PHP zakończeniem bloku kodu jest "?&gt;" albo
"?&gt;\n" (gdzie \n oznacza nową linię). Tak więc w przykładzie powyżej,
wyświetlone zdania będą w jednej linii, ponieważ PHP pomija
nowe linie po zakończeniu bloku. To oznacza, że musisz
dodać dodatkową nową linię po każdym bloku kodu PHP, aby
wynik wyświetlił się w nowej linii.
</para>
<para>
Dlaczego PHP tak robi? Ponieważ kiedy formatowany jest normalny HTML,
to zachowanie zazwyczaj ułatwia życie, gdyż zazwyczaj nie chciałbyś tej nowej linii,
ale musiałbyś stworzyć ekstremalnie długie linie kodu PHP lub uczynić
wynikowe źródło strony nieczytelnym, aby móc osiągnąć taki efekt.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.headers-sent">
<question>
<para>
Dostaję komunikat 'Warning: Cannot send session cookie - headers already
sent...' lub 'Cannot add header information - headers already sent...'.
</para>
</question>
<answer>
<para>
Funkcje <function>header</function>, <function>setcookie</function>,
i <link linkend="ref.session">funkcje
sesji</link> muszą dodać nagłówki do strumienia wyjścia, ale nagłówki mogą
być wysłane tylko przez jakąkolwiek inną treścią. Skrypt nie może tworzyć żadnego wyjścia
przed użyciem tych funkcji, takiego jak kod HTML. Funkcja
<function>headers_sent</function> pozwala sprawdzić, czy Twój skrypt wysłał już
nagłówki. Możesz też zobaczyć dokumentację <link linkend="ref.outcontrol">funkcji
kontroli wyjścia</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.header">
<question>
<para>
Muszę uzyskać bezpośredni dostęp do informacji z nagłówków.
Jak mogę to zrobić?
</para>
</question>
<answer>
<para>
Funkcja <function>getallheaders</function> pozwala to zrobić jeśli
uruchamiasz kod PHP jako moduł apache. Tak więc następujący fragment
kodu pokaże Ci wszystkie nagłówki żądania:
<programlisting role="php">
<![CDATA[
<?php
$naglowki = getallheaders();
foreach ($naglowki as $name => $content) {
echo "naglowki[$name] = $content<br />\n";
}
?>
]]>
</programlisting>
</para>
<para>
Zobacz też
<function>apache_lookup_uri</function>,
<function>apache_response_headers</function> oraz
<function>fsockopen</function>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.authentication">
<question>
<para>
Kiedy próbuję użyć autentykacji z IIS, otrzymuję błąd "No Input file specified".
</para>
</question>
<answer>
<para>
Winny tutaj jest model bezpieczeństwa IIS. To jest wspólny
problem wszystkich programów CGI uruchamianych pod IIS. Obejściem
jest stworzenie zwykłego pliku HTML (nie parsowanego przez PHP) jako
strony wejściowej do autentykowanego katalogu. Następnie użyj tagu META
aby przekierować do strony PHP lub umieść link do strony PHP. PHP rozpozna
wtedy poprawnie próbę autentykacji. Nie powinno mieć to wpływu na inne
serwery NT. Aby uzyskać więcej informacji, zobacz:
<link xlink:href="&url.iis;">&url.iis;</link> oraz sekcję manuala
poświęconą <link linkend="features.http-auth">Autentykacji HTTP
</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.iis.sharing">
<question>
<para>
Windows: nie mogę uzyskać dostępu do plików udostępnionych na innym komputerze przez IIS
</para>
</question>
<answer>
<para>
Musisz zmienić <literal>Go to Internet Information
Services</literal>. Znajdź swój plik PHP i przejdź do jego właściwości.
Następnie przejdź do karty <literal>File Security</literal>, <literal>Edit -&lt;
Anonymous access and authentication control</literal>.
</para>
<para>
Możesz naprawić ten problem odznaczając <literal>Anonymous
Access</literal> i pozostawiając <literal>Integrated Window
Authentication</literal> zaznaczone lub zaznaczając <literal>Anonymous
Access</literal> i zmieniając użytkownika, jako że może nie mieć poprawnego
dostępu.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.mixml">
<question>
<para>
W jaki sposób mogę mieszać XML i PHP? Dostaję błąd
związany z moimi tagami &lt;?xml!
</para>
</question>
<answer>
<para>
Aby osadzić &lt;?xml bezpośrednio w kodzie PHP, będziesz musiał wyłączyć
krótkie znaczniki, ustawiając dyrektywę
<link linkend="ini.short-open-tag">short_open_tags</link> na
<literal>0</literal>. Nie możesz zmienić tej dyrektywy przy użyciu
<function>ini_set</function>. Niezależnie od tego czy
<link linkend="ini.short-open-tag">short_open_tags</link> jest włączone
czy nie, możesz też użyć kodu <literal>&lt;?php echo '&lt;?xml'; ?&gt;</literal>.
Domyślna wartość dla tej dyrektywy to <literal>On</literal>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.variables">
<question>
<para>
Gdzie mogę znaleźć pełną listę zmiennych dostępnych w PHP?
</para>
</question>
<answer>
<para>
Przeczytaj stronę podręcznika na temat <link linkend="language.variables.predefined">
zmiennych predefiniowanych</link>, jako że zawiera ona częściową listę predefiniowanych
zmiennych dostępnych dla Twojego skryptu. Pełna lista dostępnych
zmiennych (i więcej informacji) może być wyświetlona po wywołaniu
funkcji <function>phpinfo</function>. Przeczytaj też sekcję podręcznika o
section on <link linkend="language.variables.external">zmiennych
spoza PHP</link>, jako że opisuje ona najczęstsze scenariusze związane
z zewnętrznymi zmiennymi, taki jak formularze HTML, ciasteczka i adresy URL.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.freepdf">
<question>
<para>
Jak mogę wygenerować pliki PDF bez używania komercyjnych
bibliotek używających nie-wolnych licencji, takich jak
PDFLib? Szukam czegoś, co jest
darmowe i nie wymaga zewnętrznych bibliotek PDF.
</para>
</question>
<answer>
<para>
Istnieje kilka alternatyw napisanych PHP, takich jak
<link xlink:href="&url.pdf.fpdf;">FPDF</link> i
<link xlink:href="&url.pdf.tcpdf;">TCPDF</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.shorthandbytes">
<question>
<para>
Kilka z dyrektyw konfiguracyjnych PHP może przyjąć skrócone wartości bajtów,
a nie tylko wartości typu <type>int</type>. Jakie są dostępne skrócone
wartości dla bajtów?
</para>
</question>
<answer>
<para>
Dostępne opcje to K (dla kilobajtów), M (dla megabajtów) i G (dla
gigabajtów), a wszystkie z nich mogą być zapisane wielkimi bądź małymi literami.
Każda inna wartość jest interpretowana jak bajty. <literal>1M</literal> jest równe jednemu megabajtowi lub
<literal>1048576</literal> bajtom. <literal>1K</literal> jest równe jednemu
kilobajtowi lub <literal>1024</literal> bajtom. Ta skrócona notacja może
być użyta w &php.ini; oraz w funkcji <function>ini_set</function>.
Wartości numeryczne są rzutowane na typ <type>int</type>,
na przykład <literal>0.5M</literal> jest interpretowane jak <literal>0</literal>.
</para>
<note>
<title>kilobajty a kibibajty</title>
<para>
Notacja PHP opisuje jeden kilobajt jako odpowiadający 1024 bajtom, podczas gdy
standard <acronym>IEC</acronym> definiuje to jako kibibajt.
Podsumowując: k oraz K = 1024 bajty.
</para>
</note>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->