mirror of
https://github.com/php/doc-pt_br.git
synced 2026-03-23 22:52:12 +01:00
385 lines
13 KiB
XML
385 lines
13 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: 1709768e97fce7848c62aa2bf988419527bd1e8e Maintainer: leonardolara Status: ready --><!-- CREDITS: marcelgsantos,lcobucci,ae,geekcom,adiel,leonardolara -->
|
|
<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">
|
|
<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>
|
|
<para>
|
|
A partir do PHP 8.0, <link linkend="functions.named-arguments">argumentos nomeados</link>
|
|
permitem a passagem de argumentos pelo nome do parâmetro, tornando a ordem dos parâmetros menos significante.
|
|
</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>.
|
|
É possível iterar por <varname>$_POST</varname>, já que ela é um array
|
|
associativo com todos os valores enviados com o método POST. Por exemplo, vamos
|
|
iterar por ela 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">
|
|
<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>
|
|
<para>
|
|
Escapar valor manualmente é passível de erros e depende do contexto.
|
|
Prefira o uso de APIs de banco de dados que suportem instruções preparadas e
|
|
vinculação de parâmetros em vez de construir consultas por concatenação
|
|
de strings escapadas.
|
|
</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 fluxo 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. Uma maneira de contornar é
|
|
criar um arquivo HTML puro (não interpretado pelo PHP) como a página de entrada
|
|
de um diretório autenticado. Então utilize a tag META para redirecionar
|
|
para a página PHP ou fornecer um atalho 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
|
|
-->
|