• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

getreal

Ler dados de uma base de dados do phpBB3

16 mensagens neste tópico

Isto é muito simples. Eu sei um pouco de PHP mas não sei praticamente nada de MySQL (ou é SQL?). O que eu quero ler é os títulos 10 últimos posts e quem os respectivos autores. Será que alguém me consegue dar uma mãozinha? Eu vou aprender MySQL no meu curso, mas é praticamente a meio de 2009...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

terás que escrever um pedido em SQL.

Qualquer coisa como:

SELECT post.title, user.name post.date FROM post, user WHERE user.id=post.user_id ORDER BY post.date DESC

Os nomes não serão exactamente estes, mas é basicamente isto que tens que fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então sabendo que a tabela relativa aos posts é phpbb3_posts, que a tabela relativa aos users é phpbb3_users, que o titulo da mensagem é o campo post_subject, que a data do post é post_time, que o id do user é user_id e que o username é username, isto ficaria assim?

SELECT phpbb3_posts.post_subject, phpbb3_users.username phpbb3_posts.post_time FROM phpbb3_posts, phpbb3_users WHERE phpbb3_users.user_id=phpbb3_posts.user_id ORDER BY phpbb3_posts.post_time DESC

EDIT:

Agora estive a tentar as coisas com o phpMyAdmin e ele lá me ajudou. Aquele código está mal, mas este parece dar bem ao executar lá no phpMyAdmin:

SELECT phpbb3_posts.post_subject, phpbb3_users.username, phpbb3_posts.post_time
FROM phpbb3_posts, phpbb3_users
WHERE phpbb3_users.user_id = phpbb3_posts.poster_id
ORDER BY phpbb3_posts.post_time DESC

Agora uma pergunta: ele mete

LIMIT 0 , 30

e eu para meter a aparecer só 10, ponho

LIMIT 0 , 10

?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, obrigado. Vou tentar meter isto na minha página em PHP como deve ser. Se tiver mais dúvidas volto aqui. Mais uma vez, obrigado.

Pronto... Isto decidiu não funcionar... Para verem como não funciona testem aqui: http://tuga-gaming.war-fusion.com/tugagaming/index.php

Em vez de funcionar aparece um bonito Resource id #4. Alguém sabe o que isto quer dizer?

Está aqui o código relativo à parte que me interessa, ou seja, os últimos posts do meu fórum.

index.php:

<?php
include './mysql/config.php';
include './mysql/opendb.php';

$query = 'SELECT phpbb3_posts.post_subject, phpbb3_users.username, phpbb3_posts.post_time FROM phpbb3_posts, phpbb3_users WHERE phpbb3_users.user_id = phpbb3_posts.poster_id ORDER BY phpbb3_posts.post_time DESC LIMIT 0 , 10';
$result = mysql_query($query);
echo $result;

include './mysql/closedb.php';
?>

config.php (alterei tudo por questões de segurança):

<?php
$dbhost = '127.0.0.1';
$dbuser = 'o_meu_utilizador';
$dbpass = 'a_minha_pass';
$dbname = 'a_minha_tabela';
?>

opendb.php:

<?php
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Erro ao ligar à base de dados.');
mysql_select_db($dbname);
?>

closedb.php:

<?php
mysql_close($conn);
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
$query = 'SELECT phpbb3_posts.post_subject, phpbb3_users.username,
phpbb3_posts.post_time FROM phpbb3_posts, phpbb3_users WHERE
phpbb3_users.user_id = phpbb3_posts.poster_id ORDER BY phpbb3_posts.post_time
DESC LIMIT 0 , 10';
$result = mysql_query($query);
echo $result;

O mysql_query() devolve um 'resource'. Esse 'resource' representa o conjunto (pode ser vazio) de linhas que o comando SQL devolve, e não é imprimível. Depois de teres o resource tens que lá ir buscar as linhas. Quando é provável que o SELECT retorne mais que uma linha, a maneira mais comum de o fazer é com mysql_fetch_array() (ou outras funções do mesmo género).

$query = 'SELECT phpbb3_posts.post_subject, phpbb3_users.username, phpbb3_posts.post_time
FROM phpbb3_posts, phpbb3_users WHERE phpbb3_users.user_id = phpbb3_posts.poster_id
ORDER BY phpbb3_posts.post_time DESC LIMIT 0 , 10';
$result = mysql_query($query) or die('Erro @ ' . __FILE__ . ':' . __LINE__);
while ($row = mysql_fetch_array($result)) {
  foreach ($row as $k) {
    echo $k, ' ';
  }
  echo "<br>\n";
}
mysql_free_result($result);

Se o SELECT só pode devolver uma linha, podes usar o mysql_result e evitar o ciclo while

$query = 'SELECT username FROM phpbb3_users WHERE phpbb3_users.user_id = 42';
$result = mysql_query($query) or die('Erro @ ' . __FILE__ . ':' . __LINE__);
echo mysql_result($resource, 0, 0);
mysql_free_result($result);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse código tem um pequeno bug. A função mysql_fetch_array(), por defeito devolve os resultados como um array associativo e como um array de indice numérico, logo ao enviares os elementos todos para o output vai enviar-te todos, ou seja, em duplicado.

Podes usar por exemplo a função mysql_fetch_row() em vez da função mysql_fetch_array(), a primeira só devolve os resultados num array numérico.

Desculpa pedrotuga, mas eu quero evitar as tabelas...

Na boa, o que for melhor para ti é o que deves usar :)

Só por curiosidade minha, por que motivo não queres que o resultado venha numa tabela HTML? é semanticamente mais correcto do que separá-lo por quebras de linha como tens.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah! ... em vez do mysql_fetch_array() usa o mysql_fetch_assoc() ou o mysql_fetch_row() ou ainda o mysql_fetch_array() mas com o parametro "result_type".

O mysql_fetch_array() do meu exemplo devolve 2 elementos por cada coluna da base de dados: um elemento com o nome da coluna e outro elemento com o número dessa coluna no SELECT.

O mysql_fetch_row() só devolve elementos com números.

O mysql_fetch_assoc() só devolve elementos com nomes.

E ainda ... o mysql_fetch_array() pode funcionar de qualquer das 3 maneiras.

/* $sql = "select 1 as IDTeste, 'pmg' as Nick"; */
$res_row = mysql_fetch_row($resource);
/* $res_row fica com
$res_row[0] == 1;
$res_row[1] == 'pmg';
*/

$res_assoc = mysql_fetch_assoc($resource);
/* $res_assoc fica com
$res_assoc['IDteste'] == 1;
$res_assoc['Nick'] == 'pmg';
*/

$res_array1 = mysql_fetch_array($resource);
/* $res_array1 fica com
$res_array1[0] == 1;
$res_array1[1] == 'pmg';
$res_array1['IDTeste'] == 1;
$res_array1['Nick'] == 'pmg';
*/

$res_array2 = mysql_fetch_array($resource, MYSQL_NUM);
/* $res_array2 fica com
$res_array2[0] == 1;
$res_array2[1] == 'pmg';
*/

$res_array3 = mysql_fetch_array($resource, MYSQL_ASSOC);
/* $res_array3 fica com
$res_array3['IDTeste'] == 1;
$res_array3['Nick'] == 'pmg';
*/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Só por curiosidade minha, por que motivo não queres que o resultado venha numa tabela HTML? é semanticamente mais correcto do que separá-lo por quebras de linha como tens.
Porque o meu design e feito quase todo em tabelas e não quero meter mais tabelas encadeadas, embora se recomende usar DIVs... Para utilizá-las é preciso posicionar tudo muito direitinho e dá muito trabalho (então quando se usa % para posicionamento, ui ui...).


Mudei o código (mais uma vez :biggrin:) para isto:

SELECT LEFT(post_subject, 30) FROM phpbb3_posts ORDER BY phpbb3_posts.post_id DESC LIMIT 0, 9


Porque raios aparece isto: � ? Eu já tentei por o PHP com codificação ASCII, UTF-8 sem BOM (insiste em ficar ASCII se o fizer) e em UFT-8. Continuam a aparecer os �! :mad:

Ups esqueci-me do link: http://tuga-gaming.war-fusion.com/tugagaming/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez a base de dados não esteja em utf-8 ou então o apache pode estar a correr sem suporte para esses caracteres, apostava mais na primeira.

EDIT: pode ser outra coisa, pode ser que esteja tudo bem, só que os dados foram inseridos de forma incorrecta, tipo usando um programa sem suporte para esses charsets.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O collation está em utf8_unicode_ci. Mas estás a falar da base de dados em geral certo? É que agora só estou a usar esse campo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

utf8_encode() ou utf8_decode() ao output, um deles deve resultar. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou procurar informações sobre isso no php.net. Obrigado pela dica.

O meu pequeno teste deu asneira... como integro isso com os títulos da base de dados? Eu nunca usei PHP "a sério". Só mesmo o básico.

CONSEGUI! Já sei onde era o problema. Obrigado pela a ajuda!!


Eu agora queria meter no echo que mostra o output daqueles títulos também um <a href> com esta query:

SELECT post_id FROM phpbb3_posts GROUP BY post_id   ORDER BY phpbb3_posts.post_id DESC LIMIT 0, 9

Já tentei e deu uma bela asneirada.

O echo que eu estou a falar é logo o primeiro:

<?php
$query = 'SELECT LEFT(post_subject, 30) FROM phpbb3_posts ORDER BY phpbb3_posts.post_id DESC LIMIT 0, 9';
$result = mysql_query($query) or die('Erro @ ' . __FILE__ . ':' . __LINE__);
while ($row = mysql_fetch_assoc($result)) {
  foreach ($row as $k) {
    echo ' ',utf8_encode($k), ' ';
  }
  echo "<br>\n";
}
mysql_free_result($result);
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem o bump que estou a fazer, mas não há mesmo ninguém que me possa ajudar?


Pronto, resolvi usar a um pouco a cabeça (:P) e lá consegui fazer o que queria. Eu vou dar o meu código para quem precisa de fazer algo como eu (ver os títulos das últimas mensagens e ter os links para as mesmas, no phpBB3).

include './config.php';
include './opendb.php';

$query = 'SELECT LEFT(post_subject, 30) FROM phpbb3_posts ORDER BY phpbb3_posts.post_id DESC LIMIT 0, 9';
$result = mysql_query($query) or die('Erro @ ' . __FILE__ . ':' . __LINE__);
$links = 'SELECT post_id FROM phpbb3_posts GROUP BY post_id ORDER BY phpbb3_posts.post_id DESC LIMIT 0, 9';
$reslinks = mysql_query($links) or die('Erro @ ' . __FILE__ . ':' . __LINE__);

while (($row = mysql_fetch_assoc($result)) and ($link = mysql_fetch_assoc($reslinks))) {
  foreach ($link as $l) {
    echo ' <a href="viewtopic.php?p=',utf8_encode($l),'#p',utf8_encode($l),'">';
  }
  foreach ($row as $k) {
    echo utf8_encode($k),'</a>';
  }
  echo "<br/>\n";
}
mysql_free_result($result);

include './closedb.php';

config.php

<?php
$dbhost = '127.0.0.1';
$dbuser = 'utilizador';
$dbpass = 'password';
$dbname = 'phpbb3';
?>

opendb.php

<?php
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Erro ao ligar à base de dados.');
mysql_select_db($dbname);
?>

closedb.php

<?php
mysql_close($conn);
?>


Só quero dizer obrigado a pedrotuga, pmg e a djthyrax. Sem a vossa ajuda não teria conseguido fazer isto. :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora