Ошибка при падении базы MySQL + VBulletin

12
Web-Silver
На сайте с 02.05.2007
Offline
247
1230

Добрый день!

На главной странице сайта и на всех внутренних страницах подгружаются последние 5 тем с форума VBulletin такой конструкции:

<?
$base="*****";
$user="*****";
$pass="*****";
$host="*****";
$link = mysql_connect ($host, $user, $pass) or die ("Не могу соединиться");
mysql_select_db( $base, $link) or die ("Не могу выбрать базу");
$query = "SELECT threadid, title FROM thread LEFT JOIN user ON (thread.lastposter=user.username) ORDER BY dateline DESC LIMIT 5";
$result = mysql_query ($query, $link);
?>
<?
while ($row = mysql_fetch_array($result))
{
echo "<div><a href='forum/showthread.php?threadid=".$row['threadid']."'>".$row['title']."</a></div>";
}
?>

При падении всей БД MySQL у хостера или проблемами с мускулом, происходит интересная картина: сайт грузится только для этого места в коде страницы, выводится ошибка от мускула, а дальше загрузки не происходит страницы. Таким образом, при падении мускула, сайт просто не грузится вообще (т.к. этот код находится выше основного контента).

Вопрос: с этим можно как-то бороться по принципу "База данных не работает" или "Не могу соединиться" (как в коде выше)?

Заранее благодарен за ответы!

P.S. Проверка в коде выше как-будто есть, но она не работает...

[Удален]
#1

<?php

$link = mysql_connect ($host, $user, $pass) or echo ("Не могу соединиться");
mysql_select_db( $base, $link) or echo ("Не могу выбрать базу");
$query = "SELECT threadid, title FROM thread LEFT JOIN user ON (thread.lastposter=user.username) ORDER BY dateline DESC LIMIT 5";
$result = @mysql_query ($query, $link);
?>
<?
if($result)
while ($row = mysql_fetch_array($result))
{
echo "<div><a href='forum/showthread.php?threadid=".$row['threadid']."'>".$row['title']."</a></div>";
} ?>
Web-Silver
На сайте с 02.05.2007
Offline
247
#2

nikitian, огромное спасибо! Этот код рабочий? Можно без проблем применять? ;)

[Удален]
#3

Вроде рабочий - там изменений-то совсем мало. Проверьте, я писал из головы.

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#4

Нее, лучше то не использовать. Просто сделайте вот так (оно надёжнее + лучше)


<?
$base="*****";
$user="*****";
$pass="*****";
$host="*****";

$error = false;

if (!$link = @mysql_connect($host, $user, $pass) {
$error = true;
} else {
if (!@mysql_select_db($base, $link)) {
$error = true;
} else {
$query = "SELECT `threadid`, `title` FROM `thread` LEFT JOIN `user` ON (`thread`.`lastposter`=`user`.`username`) ORDER BY `dateline` DESC LIMIT 5";

if (!$result = @mysql_query ($query, $link)) {
$error = true;
}
}
}

if (!$error) {
$template = '';
while ($row = mysql_fetch_array($result)) {
$template .= "<div><a href='forum/showthread.php?threadid=".$row['threadid']."'>".$row['title']."</a></div>";
}
} else {
$template = "<center>Извините, просмотр последних тем пока что не доступен.</center>";
}

echo $template;

?>

Progr@mmer\. добавил 01.03.2008 в 23:30

Или даже так:


<?
$base="*****";
$user="*****";
$pass="*****";
$host="*****";

$error = false;
$query = "SELECT `threadid`, `title` FROM `thread` LEFT JOIN `user` ON (`thread`.`lastposter`=`user`.`username`) ORDER BY `dateline` DESC LIMIT 5";

$link = @mysql_connect($host, $user, $pass);
@mysql_select_db($base, $link);
if (!$result = @mysql_query($query, $link)) {
$error = true;
}


if (!$error) {
$template = '';
while ($row = mysql_fetch_array($result)) {
$template .= "<div><a href='forum/showthread.php?threadid=".$row['threadid']."'>".$row['title']."</a></div>";
}
} else {
$template = "<center>Извините, просмотр последних тем пока что не доступен.</center>";
}

echo $template;

?>

Не тестил, лучше сам проверь :)

Вашей девушке не хватает романтики? Черпните её на сайте «Я Люблю Романтику» (http://iloveromantics.ru/). Романтический форум (http://forum.iloveromantics.ru/) для отдыха от нудной работы.
[Удален]
#5

Progr@mmer\., про надёжность вопрос спорный (используемые механизмы одни), имхо то же, вид сбоку. :)

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#6

У твоего примера нет @ у БД-функций, что чревато лишними ошибками :)

VA
На сайте с 10.04.2006
Offline
73
#7

Гм.. а так не проще?

<?

$base="*****";
$user="*****";
$pass="*****";
$host="*****";
if($link = @mysql_connect ($host, $user, $pass)){
mysql_select_db( $base, $link) or die ("Не могу выбрать базу");
$query = "SELECT threadid, title FROM thread LEFT JOIN user ON (thread.lastposter=user.username) ORDER BY dateline DESC LIMIT 5";
$result = mysql_query ($query, $link);

while ($row = mysql_fetch_array($result))
{
echo "<div><a href='forum/showthread.php?threadid=".$row['threadid']."'>".$row['title']."</a></div>";
}
}else{
echo "<div>Просмотр последних тем временно не доступен.</div>";
}
?>

P.S. Web-Silver, если у хостера часто падает база - правкой кода проблему не решить, ибо форум жалко.

Виктор Симон. (http://webxl.ru)
Web-Silver
На сайте с 02.05.2007
Offline
247
#8

Что-то я запутался... Какой вариант брать? :)

Shtogrin
На сайте с 02.11.2006
Offline
95
#9

Web-Silver, Если база нужна для главного сайта, то вы не только не сможете вывести последние сообщения форума, но и сгенерировать саму страницу главного сайта.

Если база для главного сайта не нужна, то берите код в котором нет die(...), как раз он завершает выполнение скрипта.

www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
VA
На сайте с 10.04.2006
Offline
73
#10

Первый не стоит - там действительно поползут ошибки, если только они не отключены на уровне настроек PHP.

Второй (глядя на код) вроде должен работать (т.е. алгоритм сам рабочий, если опечатки нет в коде, то работать будет).

Третий (мой) - также работает, но он прозрачнее и на 0,0000001% менее грузно, чем второй :)

Я бы третий рекомендовал 🚬

Добавлено:

Shtogrin:

Если база для главного сайта не нужна, то берите код в котором нет die(...), как раз он завершает выполнение скрипта.

В этом варианте есть один die но он не завершит выполнение скрипта, если база будет лежать, поскольку обрабатывает иное событие :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий