-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathusing.xml
390 lines (372 loc) · 13.5 KB
/
using.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: aab33d644359aba597e810e2fc0c0caa0d347c9c Maintainer: wiesemann Status: ready -->
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>PHP verwenden</title>
<titleabbrev>PHP verwenden</titleabbrev>
<para>
Diese Rubrik behandelt viele Fehler, die möglicherweise beim Schreiben von
PHP-Skripten auftreten.
</para>
<qandaset>
<qandaentry xml:id="faq.using.parameterorder">
<!-- TODO: Mention named arguments -->
<question>
<para>
Ich kann mir die Reihenfolge der Parameter von PHP-Funktionen nicht
merken - gibt es ein Schema?
</para>
</question>
<answer>
<para>
PHP besteht aus Hunderten externer Bibliotheken, so dass dies manchmal
etwas durcheinander erscheint. Eine einfache Regel ist aber wie folgt:
</para>
<para>
Parameter von <link linkend="book.array">Array-Funktionen</link> sind
als "<emphasis>needle, haystack</emphasis>" (Nadel, Heuhaufen) geordnet,
während die Parameter von <link
linkend="book.strings">String-Funktionen</link> genau andersrum geordnet
sind, also als "<emphasis>haystack, needle</emphasis>" (Heuhaufen,
Nadel).
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.anyform">
<question>
<para>
Ich möchte ein PHP-Skript schreiben, das Daten von beliebigen Formularen
verarbeiten kann. Woher weiß ich, welche Variablen über die POST-Methode
verfügbar sind?
</para>
</question>
<answer>
<para>
PHP bietet viele <link
linkend="language.variables.predefined">vordefinierte Variablen</link>,
wie das superglobale <varname>$_POST</varname>. Sie können
<varname>$_POST</varname> mit einer Schleife durchlaufen, da es sich um
ein assoziatives Array mit allen über die POST-Methode übertragenen
Variablen handelt. Als Beispiel verwenden wir die &foreach;-Schleife, um
(mit der Funktion <function>empty</function>) auf leere Werte zu prüfen,
und geben diese Werte aus.
<programlisting role="php">
<![CDATA[
<?php
$empty = $post = array();
foreach ($_POST as $varname => $varvalue) {
if (empty($varvalue)) {
$empty[$varname] = $varvalue;
} else {
$post[$varname] = $varvalue;
}
}
print "<pre>";
if (empty($empty)) {
print "Keiner der POST-Werte ist leer. Die Werte sind:\n";
var_dump($post);
} else {
print "Wir haben " . count($empty) . " leere Werte:\n";
print "Alle Werte:\n"; var_dump($post);
print "Leer:\n"; var_dump($empty);
exit;
}
?>
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.addslashes">
<!-- TODO Probably should mention not doing this... -->
<question>
<para>
Ich möchte alle einfachen Anführungszeichen (') in einen Backslash
gefolgt von einem einfachen Anführungszeichen (\') ersetzen lassen. Wie
kann ich das mit einem regulären Ausdruck machen? Ich möchte außerdem "
zu \" und \ zu \\ konvertieren.
</para>
</question>
<answer>
<para>
Falls Sie dies für eine Datenbank tun möchten, sollten Sie den
Maskierungsmechanismus nutzen, der für diese Datenbank vorgesehen ist.
Z. B. sollten Sie <function>mysql_real_escape_string</function> unter
MySQL und <function>pg_escape_string</function> unter PostgreSQL nutzen.
Es gibt außerdem die generische Funktionen
<function>addslashes</function> und <function>stripslashes</function>,
die häufig in älterem PHP-Code genutzt werden.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.wrong-order">
<question>
<para>
Wenn ich den folgenden Code ausführe, wird die Ausgabe in der falschen
Reihenfolge ausgegeben:
<programlisting role="php">
<![CDATA[
<?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
]]>
</programlisting>
Woran liegt das?
</para>
</question>
<answer>
<para>
Um das Ergebnis Ihrer Funktion in einem Ausdruck verwenden zu können (um
es z. B. wie im obigen Beispiel mit dem anderen String zu verbinden),
müssen Sie den Wert mit <function>return</function> zurückgeben und ihn
nicht mit <function>echo</function> ausgeben.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.newlines">
<question>
<para>
Wo sind meine Zeilenumbrüche geblieben?
<programlisting role="php">
<![CDATA[
<pre>
<?php echo "Das soll die erste Zeile sein."; ?>
<?php echo "Das soll nach dem obigen Zeilenumbruch erscheinen."; ?>
</pre>
]]>
</programlisting>
</para>
</question>
<answer>
<para>
In PHP können Code-Blöcke entweder mit "?>" oder mit "?>\n" enden
(\n steht für Zeilenumbruch). Im obigen Beispiel sind die ausgegebenen
Zeilen daher in einer Zeile, denn PHP lässt die Zeilenumbrüche nach den
Block-Ende-Zeichen weg. Wenn Sie möchten, dass PHP einen Zeilenumbruch
ausgibt, müssen Sie nach jedem Code-Block einen zusätzlichen
Zeilenumbruch einfügen.
</para>
<para>
Warum macht PHP das so? Wenn Sie normales HTML formatieren, erleichert
PHP Ihnen die Arbeit, da Sie meist diesen Zeilenumbruch gar nicht haben
möchten. Würde PHP diesen Zeilenumbruch ausgeben, müssten Sie sehr lange
Zeilen schreiben und Ihren Code damit unlesbar machen.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.headers-sent">
<question>
<para>
Ich bekomme die Meldung 'Warning: Cannot send session cookie - headers
already sent...' oder 'Cannot add header information - headers already
sent...'.
</para>
</question>
<answer>
<para>
Die Funktionen <function>header</function>,
<function>setcookie</function> und die <link
linkend="ref.session">Session-Funktionen</link> müssen dem Output-Stream
Header hinzufügen. Header können aber nur gesendet werden, wenn Sie vor
allen anderen Daten gesendet werden. Vor dem Aufruf dieser Funktionen
darf also keine Ausgabe (wie z. B. HTML-Code) stattfinden. Die Funktion
<function>headers_sent</function> prüft, ob Ihr Skript bereits Header
gesendet hat. Nützlich sind in diesem Zusammenhang auch die <link
linkend="ref.outcontrol">Funktionen zur Ausgabesteuerung</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.header">
<question>
<para>
Wie kann ich auf Informationen aus dem Request-Header zugreifen?
</para>
</question>
<answer>
<para>
Wenn Sie PHP als Apache-Modul laufen lassen, liefert Ihnen die Funktion
<function>getallheaders</function> die gewünschten Informationen. Der
folgende Code gibt alle Request-Header aus:
<programlisting role="php">
<![CDATA[
<?php
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br />\n";
}
?>
]]>
</programlisting>
</para>
<para>
Siehe auch <function>apache_lookup_uri</function>,
<function>apache_response_headers</function> und
<function>fsockopen</function>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.authentication">
<question>
<para>
Wenn ich versuche, Authentifizierung mit IIS zu nutzen, bekomme ich die
Meldung 'No Input file specified'.
</para>
</question>
<answer>
<para>
Das Sicherheitsmodell des IIS ist hier fehlerhaft. Dies ist ein Problem,
das bei allen CGI-Programmen auftritt, die unter dem IIS laufen. Als
Workaround können Sie eine leere HTML-Datei, die nicht von PHP geparst
wird, als Eingangsseite in ein per Authentifizierung geschütztes
Verzeichnis legen. Anschließend leiten Sie den Browser durch ein
META-Tag auf die PHP-Seite weiter oder sie setzen einen Link auf die
PHP-Seite. PHP erkennt dann die Authentifizierung korrekt. Auch auf
anderen NT-Web-Servern sollte dieses Problem nicht auftauchen. Weitere
Informationen finden Sie auch hier:
<link xlink:href="&url.iis;">&url.iis;</link>. Lesen Sie auch den
Manual-Abschnitt zur
<link linkend="features.http-auth">HTTP-Authentifizierung mit PHP</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.iis.sharing">
<question>
<para>
Windows: Ich kann keine auf einem anderen Rechner freigegebenen Dateien
aufrufen, wenn ich den IIS verwende.
</para>
</question>
<answer>
<para>
Sie müssen die <literal>Go to Internet Information Services</literal>
ändern. Suchen Sie Ihre PHP-Datei und rufen Sie deren Eigenschaften auf.
Wechseln Sie auf das Register <literal>File Security</literal>, klicken
Sie dort auf <literal>Edit -< Anonymous access and authentication
control</literal>.
</para>
<para>
Sie können das Problem beheben, indem Sie entweder den Haken bei
<literal>Anonymous Access</literal> entfernen und ihn bei
<literal>Integrated Window Authentication</literal> belassen, oder indem
Sie <literal>Anonymous Access</literal> ankreuzen und dann die
Berechtigungen der Benutzer, die keinen Zugriff bekommen sollen,
anpassen.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.mixml">
<question>
<para>
Wie kann ich XML und PHP mischen? PHP beschwert sich über meine
<?xml-Tags!
</para>
</question>
<answer>
<para>
Um <?xml in Ihren PHP-Code einzufügen müssen Sie die Kurzform der
öffnenden PHP-Tags abschalten, indem Sie in Ihrer &php.ini; <link
linkend="ini.short-open-tag">short_tags</link> auf <literal>0</literal>
setzen. Sie können diese Direktive nicht mit der Funktion
<function>ini_set</function> setzen. Sie können unabhängig davon, ob
<link linkend="ini.short-open-tag">short_open_tags</link> aktiviert oder
deaktiviert ist, z. B. <literal><?php echo '<?xml'; ?></literal>
verwenden. Der Standardwert für diese Direktive ist
<literal>On</literal>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.variables">
<question>
<para>
Wo kann ich eine komplette Liste der mir zur Verfügung stehenden
Variablen finden?
</para>
</question>
<answer>
<para>
Lesen Sie die Manual-Seite zu <link
linkend="language.variables.predefined">vordefinierten Variablen</link>,
die eine (unvollständige) Liste der vordefinierten Variablen enthält,
die Ihren Skripten zur Verfügung stehen. Eine komplette Liste der
verfügbaren Variablen (und viele weitere Informationen) können Sie
sehen, wenn Sie die Funktion <function>phpinfo</function> aufrufen.
Beachten Sie auch den Abschnitt zu <link
linkend="language.variables.external">Variablen außerhalb von
PHP</link>, der verschiedene Szenarien für externen Variablen wie
HTML-Formulare, Cookies oder den URL beschreibt.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.freepdf">
<question>
<para>
Wie kann ich PDF-Dateien generieren, ohne die nicht-freie und
kommerzielle Bibliothek PDFLib zu verwenden? Ich suche etwas, das frei
ist und keine externen PDF-Bibliotheken benötigt.
</para>
</question>
<answer>
<para>
Es gibt einige in PHP geschriebene Alternativen wie
<link xlink:href="&url.pdf.fpdf;">FPDF</link> und
<link xlink:href="&url.pdf.tcpdf;">TCPDF</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.shorthandbytes">
<question>
<para>
Einige PHP-Direktiven akzeptieren nicht nur &integer;-Byte-Werte,
sondern auch abgekürzte Byte-Werte. Welche Abkürzungen gibt es?
</para>
</question>
<answer>
<para>
Die verfügbaren Abkürzungen sind K (für Kilobytes), M (für Megabytes)
und G (für Gigabytes), Groß-/Kleinschreibung spielt dabei keine Rolle.
Alle anderen Werte werden als Byte-Werte erkannt. <literal>1M</literal>
entspricht z. B. einem Megabyte oder <literal>1048576</literal> Bytes.
<literal>1K</literal> entspricht einem Kilobyte oder
<literal>1024</literal> Bytes. Diese abgekürzte Schreibweise kann in der
&php.ini; und in der Funktion <function>ini_get</function> verwendet
werden. Es ist zu beachten, dass der numerische Wert nach
<type>int</type> umgewandelt wird; beispielsweise wird
<literal>0.5M</literal> als <literal>0</literal> interpretiert.
</para>
<note>
<title>Kilobyte versus Kibibyte</title>
<para>
Die PHP-Notation beschreibt ein Kilobyte als Entsprechung von 1024
Bytes, während der <acronym>IEC</acronym>-Standard dies als Kibibyte
bezeichnet. Zusammenfassung: k und K = 1024 Bytes.
</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
-->