Mostrando postagens com marcador PHP. Mostrar todas as postagens
Mostrando postagens com marcador PHP. Mostrar todas as postagens

quinta-feira, 21 de fevereiro de 2008

Erro no processamento de XML: declaração xml não está

Erro no processamento de XML: declaração xml não está no início da entidade externa

Probleminha bizonho esse!
Essa mensagem de erro estava retornando ao acessar a URL do RSS de um site. Pra piorar, lá pelas tantas observei que o XML gerado, pelo script PHP, funcionava no IE, contudo, no Mozila, não. No inicio imaginei logo que pudesse ser incompatibilidade com o Mozila, tipo alguma tag que estava usando buggava o bagulho ... Mas, que nada ....


Para resolver o problema:

Veja o código fonte do XML que o seu script de servidor (seja JSP, PHP, ASP, ou mesmo Delphi) gerou (chame a URL http://SeuXMLouRSS ... o Browser vai exibir a mensagem de erro e veja o fonte) e verifique se há espaços em branco ou outras coisas esquisitas antes da declaração:
  
"<?xml version=....".


Caso verdadeiro, se houver, o Firefox não vai conseguir interpretar o XML. A mensagem de erro é bem clara:

Posição: [tal ...]
Número da linha 1, Coluna 2:

Portanto, verifique que vai haver linhas em branco no fonte. No meu caso, o fonte estava assim:


.
.
//Aqui tem espaço em braco
<?xml version="1.0" encoding="ISO-8859-1" ?>




<rss version="2.0">
<channel>
.
.


Depois de uma pesquisa rápida no Google, num Fórum um louco mencionou a questão das linhas em branco. Quando consegui fazer com que o script PHP fizesse isso:



<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
<channel>
<title>Blablablah- Notícias</title>
<link>http://www.bleng.com.br</link>
.
.


Sucesso!! O bagulho funfou!!!
Veja como ficou o script PHP .....


<?
header("Content-type: application/xml"); echo "<?xml version=\"1.0\"
encoding=\"ISO-8859-1\" ?>\n";
include("../../Conn/ZN_Conexao.php");
$sql = "SELECT
blah, Bleng, Landjah
FROM
Wandjah
WHERE
blah = '2'
ORDER by bleng DESC
LIMIT 5";
$query = mysql_query($sql);

?>
.
.
.

Artigo completo (View Full Post)

quinta-feira, 15 de março de 2007

Delphi for PHP - Delphi? for PHP?

Olá a todos os queridos freqüentadores do nosso adorável blog xD

Como o título diz: Delphi? for PHP?

É... Este é um novo produto da empresa CodeGear que, segundo eles, vai revolucionar o desenvolvimento em PHP.

Quem desenvolve em PHP finalmente vai ter uma IDE realmente RAD. Pelo que vi no site tem até gerenciador de projetos e gerenciador de bancos de dados com recursos de arrastar e soltar.

Neste site eu encontrei algumas informações sobre o produto (além da página oficial, é claro) e até o preço de pré-venda: R$ 675,00 - até que não é caro.

Como sempre a galera do delphi tomando a dianteira. Eu também desenvolvo em PHP. Vou ver se baixo uma versão "Trial" (se houver alguma) e mandar pra galera o que eu acho da ferramenta.

Araços a todos e, como sempre, a seção de comentários é toda de vocês.

Artigo completo (View Full Post)

segunda-feira, 5 de março de 2007

Enviando o HTML para o navegador aos poucos

[Hoje sem o cumprimento padrão aos queridos freqüentadores do blog]

Neste post vou contar um pouco sobre um problema que eu tive e a solução que eu cheguei.

Eu desenvolvi um pequeno sistema onde é possível fazer consultas a diversas bases de dados com parâmetros diferentes e recuperar todos os resultados juntos, como se eles estivessem todos na mesma tabela do banco.

O problema que eu encontrei é que o servidor web não estava "querendo" processar a página quando a consulta retornava muitos registros. Também ninguém pode culpá-lo, pois ele sempre armazena todo o resultado em buffer antes de enviar para o navegador. Como o buffer chegava a um tamanho absurdo ele "deixava pra lá" hehe.

A solução que eu encontrei foi liberar o resultado aos poucos, assim o script não ia esperar acabar a execução toda para enviar os resultados para o navegador.

Ah Felipe, legal essa hein! É verdade, é muito legal mesmo :D

No PHP existe o método flush() que envia o conteudo armazenado até o momento de sua chamada para o servidor e o descarta logo após o envio.

Exemplo Felipe, exemplo!

<?
// aqui entra seu loop de registros
foreach ($registros as $linha) {
?>
<tr>
<td><?=$linha["nome"]?></td>
</tr>
<?
flush();

}
?>

No exemplo acima o script enviará o que está armazenado no buffer de saída do servidor para o navegador a cada registro. Este script está enviando o buffer de 1 em 1, mas você até pode encontrar melhores resultados deixando o buffer "encher" mais um pouco antes de enviar - 20 em 20, 50 em 50, etc, etc ,etc...

Ok então. Espero que isso possa ser útil para vocês e, como sempre, a seção de comentários espera :D

Artigo completo (View Full Post)

quinta-feira, 15 de fevereiro de 2007

Métodos? Variáveis?

Olá a todos. Este post traz algo legal: métodos chamados através de variáveis.

Métodos? Variáveis? Isso!

Primeiro vamos ver um método simples:

<?
function quadrado($numero) {
return $numero * $numero;
}
?>

Certo. método que retorna o quadrado do número informado.

Agora vamos chamar este método:

<?
$quadrado = quadrado(4);
// $quadrado será 16
?>


Assim é o padrão. vamos agora ver como chamamos este método através de variável.

O PHP permite a execução de uma variável como método desde que o conteúdo da variável corresponda a um método definido e ele tenha os parâmetros corretamente.

<?
$metodo = "quadrado";

$quadrado = $metodo(4);
// $quadrado será 16 do mesmo jeito
?>


Viu? Legal, né xD

Tá legal Felipe... mais uma coisa que só você vê utilidade... -_-

Hehe dessa vez vou mostrar uma utilidade:

Vocês já precisaram implementar uma rotina que chame um método dentro de um loop (passagem por registros de um record set por exemplo) e poder usar de forma genérica para que dê para usar a mesma rotina em situações diferentes? Então... Esta é a solução.

Hmmmmmmmm..... Tá..... ...... ...... Não entendi.

Ok, Ok. Exemplo:

Eu tenho um método que faz uma consulta no banco de dados e retorna resultados em um array multidimensional (para minha aplicação não ficar acoplada ao banco de dados). Se a consulta retornar resultados demais o buffer não agüenta e o script é abortado.

Então eu criei um método que executa o comando SQL, faz um loop no resultado e a cada passagem chama o método que foi definido no parâmetro e passa para este método o registro corrente para o método fazer o que deve fazer com o registro.

Com isso podemos definir métodos diferentes e executar ações diferentes para a mesma consulta. E sem precisar repetir os loops.

Hmmmmmmmm..........Tá quase.....

Ok, Ok.


Implementação do método chave (este fica na biblioteca principal):

<?
function executarMetodoDuranteSelecao($sql, $metodo) {
$resultado = mssql_query($sql);
while($registro = mssql_fetch_array($resultado)) {
$metodo($registro);
}
}
?>


Agora um método para uma consula específica (este fica no objeto de negócio):

<?
function consultarLivros($metodo) {
$sql = "select id, nome from livros";
executarMetodoDuranteSelecao($sql, $metodo)
}
?>


Finalmente a implementação no seu script:

<?

function mostrarLivro($registro) {
echo "<p><div>$registro[id]</div>";
echo "<div>$registro[descricao]</div></p>":
}


$instanciaObjNegocio->consultarLivros("mostrarLivro");
?>


Legal. Quando executar o método consultarLivros este vai enviar o comando SQL para o método da biblioteca executarMetodoDuranteSelecao que vai executar o comando SQL, fazer o loop e a cada passagem do loop executaro método definido na variável $metodo, que vai, a cada registro, mostrar duas div contendo os campos id e descricao.

Este assunto não é muito simples. Espero que eu tenha colocado de forma que todos possam entender. A seção de comentários é aberta para qualquer dúvida ou sugestão (nada de reclamações, por favor xD).

Abraços a todos.

Artigo completo (View Full Post)

quinta-feira, 8 de fevereiro de 2007

Seu site no celular

Olá. Este post traz algo interessante: Configurar o Servidor Web Apache para usar scripts PHP em páginas WML.

Para quem ainda não sabe WML é a linguagem de marcação para WAP.

O meu exemplo é usando o Debian GNU/Linux sarge, Apache 2 e PHP 4. Acredito que em todos os sistemas operacionais que suportam Apache/PHP isso funcione.

No arquivo de configuração do Apache (/etc/apache2/apache2.conf) adicione esta linha junto de outras semelhantes (você pode colocar esta linha no fim do arquivo também, mas sempre procure organização):

AddType application/x-httpd-php .wml


O significado desta linha é que o servidor interprete extensão wml como um script PHP e use o interpretador do PHP para processar a página antes dela ir para o cliente.

Extendendo um pouquinho do assunto vou mostrar a estrutura básica de um arquivo wml:

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "http://www.wapforum.org/DTD/wml13.dtd">
<wml>
<card>
Aqui entra o conteúdo WmL que aparece no navegador WAP
</card>
</wml>


Com essa configuração do servidor esta página padrão WML não vai funcionar. Por quê?! Simples: qual é a marcação de script PHP? Hein? Isso! <? ?>. Infelizmente a tag do xml usa o mesmo ponto de interrogação; então o interpretador do PHP acha que é uma abertura de bloco, mas desconhece este "xml" que vem logo depois. Como resolver isso, então? Simples: é só fazer isso como um echo dentro de tags PHP. E não se esqueça de \"escapar\" as aspas:

<?
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>";
?>


Pronto.

Eu próprio vou começar a fazer uns módulos do site aqui da empresa em WAP. Quando tiver algo pronto eu posto aqui no blog. Abraços a todos!

Artigo completo (View Full Post)

quinta-feira, 1 de fevereiro de 2007

Uma forma diferente de acessar dados em PHP

Quem desenvolve em PHP provavelmente já sacou que no quesito acesso a dados a linguagem é um tanto acoplada. Cada banco de dados tem seus próprios métodos (functions) para manipulação de dados.

Um exemplo de uma página que faz um select no banco de dados:

<?
$conn = mssql_connect("ip_servidor", "usuario", "senha");
mssql_select_db("banco", $conn);

$sql = "select * from tabela";
$qry = mssql_query($sql, $conn);

while ($linha = mssql_fetch_array($qry)) {
//trata o registro na variavel array $linha
}

...


mssql_close($conn);
?>

Neste caso estou usando o MS SQL Server (depois eu posto como acessar o MS SQL Server no Linux). Para outros bancos, como o MySQL, trocamos tudo que tem mssql por mysql (ex: mysql_connect, mysql_query, ...).

Perceba agora. Cada página PHP que acessar dados precisará desta estrutura. A parte da conexão até pode ser separada com um script de include, mas e o resto do código? Felipe, não estou entendendo... Ok eu explico: imagina se você trocar de banco de dados no meio do desenvolvimento? Tipo: o MySQL não tá legal e vamos usar o MS SQL Server agora. Ótimo! Genial! Tudo o que tenho que fazer é alterar 123 script no meu site. Obrigado!

Agora a proposta: encapsular estes métodos dentro de uma biblioteca para manter o sistema organizado e não acoplado. Na hora de trocar o banco é só trocar nos métodos da biblioteca. Inteligente, não... Modularização, meu caro... POO, meu caro...

observe o arquivo db.php

<?

class DB {
$conexao;

function DB() {
// construtor da classe abre conexão com o banco de dados
$this->conexao = mssql_connect("servidor", "usuario", "senha");
mssql_select_db("banco", $this->conexao);
}

function executarConsultaSelecao($sql) {
$i = 0;
$id = mssql_query($sql, $this->conexao);
if ($id == 1) {
$resultado = array();
}
else {
while ($linha = mssql_fetch_array($id)) {
$resultado[$i] = $linha;
$i++;
}
mssql_free_result($id);
}
return $resultado;
}

function executarComandoSQL($sql) {
$retorno = true;
mssql_query($sql, $conexao) or $retorno = false;
return $retorno;

}

function fecharConexao() {
mssql_close($this->conexao);
}

}

?>


Pronto esse é o básico. Vamos explicar os métodos.

No construtor da classe abrimos conexão com banco de dados. Sempre que criamos uma nova instância da classe isso acontece.

No método executarConsultaSelecao enviamos um comando SQL e a função retorna um array multidimensional com os registros retornados.

No método executarComandoSQL enviamos um comando SQL que não retorna dados (como insert, update, delete e SP que não retorna nada).

Agora aplicando no nosso script:

<?
include("db.php");
$db = new DB();

$resultado = $db->executarConsultaSelecao("select * from tabela");

foreach ($resultado as $linha) {
// $linha é cada registro retornado dentro do loop
}


$db->executarComandoSQL("insert into tabela(...) values (...)");

$db->fecharConexao();
?>


Na minha humilde opinião ficou muito mais bonito hehe. E a qualidade também é muito boa. E, quando trocar o banco de dados é só alterar os métodos da classe DB no arquivo db.php.

Este é o primeiro passo para uma série de boas práticas de desenvolvimento. Sempre que der tempo eu vou postando a forma que eu desenvolvo aqui. Abraços a todos e até mais!

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br