-
Notifications
You must be signed in to change notification settings - Fork 106
/
Copy pathusing.xml
376 lines (358 loc) · 13 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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: aab33d644359aba597e810e2fc0c0caa0d347c9c Maintainer: ae Status: ready --><!-- CREDITS: marcelgsantos,lcobucci,ae,geekcom,adiel -->
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Utilizando o PHP</title>
<titleabbrev>Utilizando o PHP</titleabbrev>
<para>
Esta seção reúne vários erros comuns que você pode encontrar
enquanto estiver escrevendo scripts PHP.
</para>
<qandaset>
<qandaentry xml:id="faq.using.parameterorder">
<!-- TODO: Mention named arguments -->
<question>
<para>
Não consigo me lembrar da ordem dos parâmetros das funções PHP. Eles são aleatórios?
</para>
</question>
<answer>
<para>
O PHP é uma "cola" que reúne centenas de bibliotecas externas, então às vezes
isso fica desorganizado. No entanto, uma regra simples é a seguinte:
</para>
<para>
Os parâmetros de <link linkend="book.array">funções de Array</link> são ordenados como
"<emphasis>needle, haystack</emphasis>" ao passo que
<link linkend="book.strings">funções de String</link> são o contrário,
logo "<emphasis>haystack, needle</emphasis>".
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.anyform">
<question>
<para>
Eu gostaria de escrever um script PHP genérico que fosse capaz de manipular
dados provenientes de qualquer formulário. Como eu sei quais variáveis do método POST estão disponíveis?
</para>
</question>
<answer>
<para>
O PHP disponibiliza muitas <link linkend="language.variables.predefined">
variáveis predefinidas</link>, como a superglobal <varname>$_POST</varname>.
Você pode iterar através de <varname>$_POST</varname>, já que ele é um array
associativo com todos os valores enviados com o método POST. Por exemplo, vamos
iterar através de POST com &foreach;,
verificar se há valores vazios com <function>empty</function>
e imprimi-los na tela.
<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 "Nenhum dos valores enviados com POST estão vazios, enviado:\n";
var_dump($post);
} else {
print "Temos " . count($empty) . " valores vazios\n";
print "Enviado:\n"; var_dump($post);
print "Vazio:\n"; var_dump($empty);
exit;
}
?>
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.addslashes">
<!-- TODO Probably should mention not doing this... -->
<question>
<para>
Preciso converter todas as aspas simples (') para uma barra invertida
seguida por uma aspa simples (\'). Como eu posso fazer isso utilizando
expressões regulares? Gostaria de converter também " para \" e
\ para \\.
</para>
</question>
<answer>
<para>
Considerando que isso seja para um banco de dados, utilize o mecanismo
de escape que vem com o banco de dados. Por exemplo, utilize
<function>mysql_real_escape_string</function> com MySQL e
<function>pg_escape_string</function> com PostgreSQL. Existem também as
funções genéricas <function>addslashes</function> e
<function>stripslashes</function>, que são mais comuns
com códigos PHP antigos.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.wrong-order">
<question>
<para>
Quando eu faço o seguinte, a saída é exibida na
ordem errada:
<programlisting role="php">
<![CDATA[
<?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
]]>
</programlisting>
o que está acontecendo?
</para>
</question>
<answer>
<para>
Para ser capaz de utilizar os resultados de suas funções em uma expressão (como
concatenar com uma string no exemplo acima), você precisa
utilizar <function>return</function> para retornar o valor
e não <function>echo</function>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.newlines">
<question>
<para>
Ei, o que aconteceu com as minhas novas linhas?
<programlisting role="php">
<![CDATA[
<pre>
<?php echo "Esta deve ser a primeira linha."; ?>
<?php echo "Esta deveria ser uma nova linha."; ?>
</pre>
]]>
</programlisting>
</para>
</question>
<answer>
<para>
No PHP, um bloco de código é fechado com "?>" ou
"?>\n" (onde \n significa uma nova linha). Logo, no exemplo anterior,
as sentenças serão exibidas na mesma linha porque o PHP omite
o caractere de nova linha após o final do bloco de código. Isso significa
que você precisa inserir uma nova linha depois de cada bloco de código PHP para
exibi-las em uma nova linha.
</para>
<para>
Por que o PHP faz isso? Porque quando está formatando HTML, isto
normalmente torna sua vida mais fácil porque não se quer esta nova linha,
senão você teria que criar linhas extremamente longas ou tornar
o código fonte ilegível para alcançar este efeito.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.headers-sent">
<question>
<para>
Recebi a mensagem 'Warning: Cannot send session cookie - headers already
sent...' ou 'Cannot add header information - headers already sent...'.
</para>
</question>
<answer>
<para>
As funções <function>header</function>, <function>setcookie</function>
e as <link linkend="ref.session">funções de sessão</link>
precisam adicionar os cabeçalhos ao stream de saída, mas os cabeçalhos
só podem ser enviados antes de qualquer outro conteúdo. Não pode haver nenhuma saída
antes de utilizar estas funções como HTML. A função
<function>headers_sent</function> irá verificar se o seu script já enviou
cabeçalhos e veja também as funções de <link linkend="ref.outcontrol">Controle
de Saída</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.header">
<question>
<para>
Preciso acessar informações no cabeçalho de requisição diretamente.
Como eu faço isso?
</para>
</question>
<answer>
<para>
A função <function>getallheaders</function> fará isso se você
estiver rodando o PHP como um módulo do Apache. Logo, o fragmento
de código abaixo sempre exibirá todos os cabeçalhos de requisição:
<programlisting role="php">
<![CDATA[
<?php
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br />\n";
}
?>
]]>
</programlisting>
</para>
<para>
Veja também
<function>apache_lookup_uri</function>,
<function>apache_response_headers</function> e
<function>fsockopen</function>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.authentication">
<question>
<para>
Quando eu tento utilizar autenticação com o IIS eu recebo a mensagem 'No Input file specified'.
</para>
</question>
<answer>
<para>
O modelo de segurança do IIS é o culpado aqui. Este é um problema
comum a todos os programas CGI rodando no IIS. A solução é
criar um arquivo HTML (não interpretado pelo PHP) como uma página de entrada
para o diretório autenticado. Então utilizar a tag META para redirecionar
para a página PHP ou fornecer um link para a página PHP. O PHP irá
então reconhecer a autenticação corretamente. Com o módulo ISAPI,
este não é um problema. Isto não deve afetar outros
servidores web NT. Para mais informações veja:
<link xlink:href="&url.iis;">&url.iis;</link> e a
seção do manual em <link linkend="features.http-auth">Autenticação HTTP
</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.iis.sharing">
<question>
<para>
Windows: Não consigo acessar arquivos compartilhados em outro computador utilizando IIS.
</para>
</question>
<answer>
<para>
Você terá que alterar o <literal>Go to Internet Information
Services</literal>. Localize o arquivo PHP e vá até as suas propriedades.
Vá até a aba <literal>File Security</literal>, <literal>Edit -<
Anonymous access and authentication control</literal>.
</para>
<para>
Pode-se corrigir o problema desabilitando <literal>Anonymous
Access</literal> e deixando <literal>Integrated Window
Authentication</literal> habilitado, ou habilitando <literal>Anonymous
Access</literal> e editando o usuário para que ele não possa ter o
direito de acesso.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.mixml">
<question>
<para>
Como faço para misturar XML e PHP? Ele reclama
das minhas tags <?xml!
</para>
</question>
<answer>
<para>
Para utilizar <?xml diretamente no seu código PHP, você terá que desabilitar
as short tags definindo a diretiva PHP
<link linkend="ini.short-open-tag">short_open_tags</link> como
<literal>0</literal>. Você não pode configurar esta diretiva com a função
<function>ini_set</function>. Independentemente de
<link linkend="ini.short-open-tag">short_open_tags</link> estar ativada ou
não, você pode fazer algo como: <literal><?php echo '<?xml'; ?></literal>.
O padrão para esta diretiva é <literal>On</literal>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.variables">
<question>
<para>
Onde posso encontrar uma lista completa das variáveis que estão disponíveis para mim
no PHP?
</para>
</question>
<answer>
<para>
Leia a página do manual <link linkend="language.variables.predefined">
variáveis predefinidas</link> dado que ele inclui uma lista parcial das variáveis
predefinidas disponíveis para o seu script. Uma lista completa das
variáveis disponíveis (e muito mais informação) pode ser vista chamando a função
<function>phpinfo</function>. Não deixe de ler a
seção do manual <link linkend="language.variables.external">variáveis de
fontes externas</link> uma vez que descreve cenários comuns para variáveis
externas como aquelas originadas de um formulário HTML, cookie ou da URL.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.freepdf">
<question>
<para>
Como posso gerar arquivos PDF sem utilizar bibliotecas não-livres e
comerciais como
PDFLib? Eu gostaria de alguma que fosse
livre e não precisasse de bibliotecas PDF externas.
</para>
</question>
<answer>
<para>
Existem algumas poucas alternativas escritas em PHP como
<link xlink:href="&url.pdf.fpdf;">FPDF</link> e
<link xlink:href="&url.pdf.tcpdf;">TCPDF</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.shorthandbytes">
<question>
<para>
Algumas diretivas PHP podem receber valores em bytes de forma abreviada (1K), ao contrário
de apenas valores <type>int</type>. Quais são todas as opções
disponíveis de bytes de forma abreviada?
</para>
</question>
<answer>
<para>
As opções disponíveis são K (para Kilobytes), M (para Megabytes) e G (para
Gigabytes), tanto em maiúsculas ou minúsculas.
Qualquer outra coisa é tratada como bytes. <literal>1M</literal> é igual a um Megabyte ou
<literal>1048576</literal> bytes. <literal>1K</literal> é igual a um Kilobyte ou
<literal>1024</literal> bytes. Essas notações abreviadas podem ser
utilizadas no &php.ini; e na função <function>ini_set</function>.
Importante observar que os valores são truncados para <type>int</type> apenas,
ou seja, <literal>0.5M</literal> será interpretado como <literal>0</literal>.
</para>
<note>
<title>kilobyte versus kibibyte</title>
<para>
A notação do PHP descreve um kilobyte equivalente a 1024 bytes, enquanto que
o padrão <acronym>IEC</acronym> considera que este deve ser um kibibyte.
Resumindo: k e 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
-->