Files
archived-doc-pt-br/faq/using.xml
Leonardo Lara Rodrigues cea7c539dc sync with en rev
2026-02-20 12:30:30 -03:00

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 "?&gt;" ou
"?&gt;\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 -&lt;
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 &lt;?xml!
</para>
</question>
<answer>
<para>
Para utilizar &lt;?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>&lt;?php echo '&lt;?xml'; ?&gt;</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
-->