PHP-скрипт, дающий нулевой вывод из базы данных phpbb SQL

прежде всего: я полный новичок, когда дело доходит до PHP-скриптов, поэтому я просто взял этот скрипт с веб-сайта, и автор сказал, что он работает отлично.

 <?php
// How Many Topics you want to display?
$topicnumber = 5;
// Scrolling towards up or down?
$scroll = "up";
// Change this to your phpBB path
$urlPath = "/forum";

// Database Configuration (Where your phpBB config.php file is located)
include 'forum/config.php';

$table_topics = $table_prefix. "topics";
$table_forums = $table_prefix. "forums";
$table_posts = $table_prefix. "posts";
$table_users = $table_prefix. "users";
$link = mysql_connect("$dbhost", "$dbuser", "$dbpasswd") or die("Could not connect");
mysql_select_db("$dbname") or die("Could not select database");

$query = "SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id,
p.post_id, p.poster_id, p.post_time, u.user_id, u.username
FROM $table_topics t, $table_forums f, $table_posts p, $table_users u WHERE t.topic_id = p.topic_id AND f.forum_id = t.forum_id AND t.topic_status = 2 AND p.post_id = t.topic_last_post_id AND p.poster_id = u.user_id ORDER BY p.post_id DESC LIMIT $topicnumber";
$result = mysql_query($query) or die("Query failed");

echo "
";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "
";
}
print "

" .
$row["topic_title"] .
"    by: " .
$row["username"] .
"   
" .
date('F j, Y, g:i a', $row["post_time"]) .
"
";
mysql_free_result($result);
mysql_close($link);
?>

Хотя, когда я его использую, он выдает мне чертовски странный вывод: «до: 31 декабря 1969 года, 19:00». Вместо (единственная тема, которую он должен сейчас найти) «Test1 by: Cruciatum, 8 июля 2012 г., 22:00».

Кто может понять, что тут не так? (Он используется через iframe справа на этой странице: Веб-сайт)

PS: Предполагается, что он получит название темы, автора, дату и время последних 5 сообщений на моем форуме phpbb3.

PPS: вот код iframe

<!-- Recent posts -->
<div class="divx" style="position:absolute; top:170px; right:10px; width:200px; height:300px;">
<iframe height="300px" width="200px" scrolling="no" src="fetch.php">
</iframe>
</div>

person Yorrick    schedule 08.07.2012    source источник
comment
Скорее всего, запрос к базе данных выполнен успешно, но строк не найдено. Затем, когда он пытается записать выходные данные, все переменные пусты, а вызов date() получает нулевое входное значение, следовательно, возвращает отметку времени с нулевым значением, которая оказывается 31 декабря 1969 года в 19:00 в вашем часовом поясе.   -  person Michael Berkowski    schedule 09.07.2012
comment
использование случайного сценария, который вы не понимаете, опасно.   -  person    schedule 09.07.2012
comment
@ Дагон, я знаю, хотя я понимаю - в основном - что он делает, я привык программировать, просто не на PHP/SQL :›   -  person Yorrick    schedule 09.07.2012
comment
@Michael Ну, в БД должна быть (по крайней мере) 1 запись, которая должна давать значение запросу, поскольку у меня есть (атм) 1 тема, которая должна появиться.   -  person Yorrick    schedule 09.07.2012
comment
@Yorrick отфильтровывает forum_id=4. Если ваше сообщение находится на этом форуме, оно не вернется.   -  person Michael Berkowski    schedule 09.07.2012
comment
@Michael На данный момент существует только 1 форум, поэтому, если этот форум имеет forum_id 4, это было бы странно и очень неудачно, я бы сказал. Попробую вытащить этот фильтр. Как я и думал, ничего не изменилось. :(   -  person Yorrick    schedule 09.07.2012
comment
Я предполагаю, что в одной из тем таблиц, форумов, сообщений или пользователей нет строки - если в какой-либо из этих таблиц нет строки, относящейся к соответствующей теме, строки не вернутся.   -  person soupy1976    schedule 09.07.2012
comment
@ soupy1976 soupy1976 Что можно исправить, если это действительно так? Я собираюсь попросить других людей зарегистрироваться и создать темы, чтобы проверить, не является ли это ошибкой с кодом.   -  person Yorrick    schedule 09.07.2012
comment
Вам нужно будет либо (i) решить, почему строка не входит в эту таблицу, либо (ii) переписать SQL (возможно, используя LEFT OUTER JOIN), чтобы вернуть результат даже при отсутствии строки в какой бы это ни был стол   -  person soupy1976    schedule 09.07.2012
comment
На самом деле, я только что заметил, что в калузе WHERE у вас есть: «t.topic_status 2» — это наверняка должно быть «t.topic_status = 2»?   -  person soupy1976    schedule 09.07.2012
comment
Уже исправил это после публикации и все еще дает мне неправильный вывод.   -  person Yorrick    schedule 09.07.2012
comment
@ soupy1976 soupy1976 Теперь я помню, что из-за этого мой запрос не удался, а не неправильный вывод.   -  person Yorrick    schedule 09.07.2012
comment
давайте продолжим обсуждение в чате   -  person Yorrick    schedule 09.07.2012


Ответы (2)


Удалось исправить:

<?php
// How Many Topics you want to display?
$topicnumber = 5;
// Scrolling towards up or down?
$scroll = "up";
// Change this to your phpBB path
$urlPath = "/forum";

// Database Configuration (Where your phpBB config.php file is located)
include 'forum/config.php';

$table_topics = $table_prefix. "topics";
$table_forums = $table_prefix. "forums";
$table_posts = $table_prefix. "posts";
$table_users = $table_prefix. "users";
$link = mysql_connect("$dbhost", "$dbuser", "$dbpasswd") or die("Could not connect");
mysql_select_db("$dbname") or die("Could not select database");

$query = "SELECT t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id,
p.post_id, p.poster_id, p.post_time, u.user_id, u.username
FROM $table_topics as t, $table_forums as f, $table_posts as p, $table_users as u WHERE t.topic_id = p.topic_id AND f.forum_id = t.forum_id AND t.topic_status != 2 AND p.post_id = t.topic_last_post_id AND t.topic_last_poster_id = u.user_id ORDER BY p.post_id DESC LIMIT $topicnumber";
$result = mysql_query($query) or die("Query failed");

echo "";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "";

print "<a href=\"forum/viewtopic.php?f=" .$row["forum_id"] ."&t=" .$row["topic_id"] ."\"><font color=\"darkred\">" .$row["topic_title"] ."</font></a>       by: <a href=\"forum/memberlist.php?mode=viewprofile&u=" .$row["user_id"] ."\"><font color=\"darkred\">" .$row["username"] ."</font></a> 
" .date('F j, Y, g:i a', $row["post_time"]) ."<br/><br/>";
}

mysql_free_result($result);
mysql_close($link);
?>

Добавлены ссылки и прочее, пока я этим занимался :>

person Yorrick    schedule 09.07.2012

Типичный PHP-скрипт и типичные PHP-проблемы — ничего не проверяется.

  • проверить коды ошибок
  • проверить количество возвращаемых строк
  • проверьте SQL, отправляемый в таблицы
  • запустите SQL вручную и проверьте результат

Я уверен, что вы поймете тогда.

person Ondra Žižka    schedule 08.07.2012
comment
Сделал большую часть этого, но, как я уже сказал, я все еще новичок в отношении PHP/SQL. - person Yorrick; 09.07.2012
comment
PS: вернуло rows=0 Теперь, вместо того, чтобы зазнаваться, может быть, выручить человека? Какова вся идея этого сайта? - person Yorrick; 09.07.2012