76

Re: Как увеличить количество строк/знаков?

Доброго времени суток.
Воз можно я что-то пропустил.

Вот код с кнопкой отправить:
function html_ocenka_form()
{
    $userstable = "material";

    #запрос на выборку данных из таблицы;
    $result = mysql_query( "SELECT * FROM $userstable ORDER BY id DESC" );
    $temp_array = mysql_fetch_array( $result );

    $text_out = '
<!-- Форма оценки  -->
<table>
    <tr>
      <td align="left">
        <form action="" method="POST" class="sl">
          <input name="id" type="hidden" value="'.$temp_array['id'].'" class="form" />
          <input name="act" type="hidden" value="add" class="form" />
          <input name="cnt" type="hidden" value="ocenka" class="form" />
          <center>Оцените статью:</center><br>';
          for( $i = -5; $i <= 5; $i++ )
              {
                  $text_out .= '
          <input name="an" type="radio" size="12" value="'.$i.'" class="form" /> '.$i;
              }
          $text_out .= '
          <br>
          <br>
          <center>
          <input type="submit" value="Оценить" class="form" /><br>'.
                  //anchor( "ocenka", 1, 1, 1, $temp_array['id'], "list" ).'Просмотр результатов по этой оценке.</a>
          '</center>
        </form>
      </td>
    </tr>
</table>
<!-- END Форма оценка  -->';

  return( $text_out );
  }
Возможно в этом коде у Вас получится увидеть то чего я пока не вижу.

Заранее спасибо за ответ.

77

Re: Как увеличить количество строк/знаков?

Victor2008
Вам надо выбрать только одну строку из БД, ту, которая относится к статье, поэтому запрос:
$result = mysql_query( "SELECT * FROM $userstable ORDER BY id DESC" );
Надо переделать во что-то вроде:
$result = mysql_query( "SELECT * FROM $userstable WHERE `id` = $id" );
Где переменная $id должна содержать идентификатор статьи (поле id в БД).

78

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо что за уточнение.

Вы знаете попробовал внести изменения, и вот что получилось: когда была строка:
$result = mysql_query( "SELECT * FROM $userstable ORDER BY id DESC" );
то сразу после нажатия на кнопку "Оценить" выбранная оценка записывалась только для одной статьи, а оценивались несколько и все баллы записываясь приплюсовывались только к одной, в другие же оуенка просто незаписывалась.

Когда Вы предложили заменить строку на:
$result = mysql_query( "SELECT * FROM $userstable WHERE `id` = $id" );
если при первом случае оценка заптсывалась и после нажатия на кнопку "Оценить" при загрузке старницы с словами "Ваша оценка за такую-то статью принята" и в кавычках писался заколовок статьи которую оценили.
ТО теперь после внесения предложенных Вами изменений ни оценка не добавляется для выбранной статьи, ни заголовок статьи которую оценили тоже не пишется на следующей странице которая загружается сразу после нажаитя на кнопку "Оценить".

На какие строки мне нужно еще посмотреть, навсякий случай выкладываю Вам строки в которых идет обращение к базе:
Эта из формы ценки....
$result = mysql_query( "SELECT * FROM $userstable WHERE `id` = $id" );
$temp_array = mysql_fetch_array( $result );

Эта из абзаца ocenka_add()....
Запрос на данные из базы
$result = MYSQL_QUERY( "SELECT * FROM $userstable WHERE `id` = '$id'" );

Эта из того же абзаца только пару строк ниже....
для добавления собственно самого балла
mysql_query("UPDATE $userstable SET `count` = " . $count . ', `rating` = ' . $rating . ' WHERE `id` = ' . $id )
....
Тут же рядом строка:
$text_out = '<h3>Спасибо!<br> Ваша оценка статьи «'.$temp_array['zagol'].'» принята.</h3>';

Дальше абзац ocenka_list ...который на странице с "Ваша оценка статьи принята" показывает общее число оценки
$result = MYSQL_QUERY( "SELECT * FROM $userstable WHERE id='$id'" )
or die (mysql_error());

Выкладываю код запроса для базы, возможно что-то упущенно мной?
Заранее спасибо за ответ.

Сообщение добавлено Thu Apr 23 15:17:43 2009
Да, еще пожалуйста наипшите что означает в строках:
$result = mysql_query( "SELECT * FROM $userstable ORDER BY id DESC" );
и
$result = mysql_query( "SELECT * FROM $userstable WHERE `id` = $id" );

так понимаю что WHERE - это указание ГДЕ id конкретная статья, а что тогда ORDER BY id DESC?

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

79

Re: Как увеличить количество строк/знаков?

Victor2008
Так мне сложно разобраться. Отошлите все файлы скрипта и структуру используемых таблиц БД на hanut@php-myadmin.ru.

80 (изменено: Hanut, 2009-04-24 15:34:12)

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо что откликнулись.

Вы знаете попытался отослать Вам письмо, но сервер выдал ошибку:
Адрес hanut@php-myadmin.ru. не существует или заблокирован. Письмо не было послано. Исправьте ошибку и отправьте письмо еще раз.

Сообщение добавлено Fri Apr 24 14:21:59 2009
...попробовал еще несколько раз отправить письмо но результат тот же.

Сообщение добавлено Fri Apr 24 14:23:59 2009
...наконец-то получилось, письмо отправил Вам.
(в адресе забыл убрать в конце точку)

Письмо пришло.

81

Re: Как увеличить количество строк/знаков?

Не знаю как передается идентификатор статьи, но полагаю, что через GET, поэтому добавлена строка: $id = $_GET['id'];
Это если ссылка на страницу статьи имеет вид: http://domain_name/script.php?id=1

<?php

function ocenka_add() {
    global $userstable, $id;

    $result = mysql_query( "SELECT * FROM $userstable WHERE `id` = $id" );

   if ($temp_array = mysql_fetch_assoc($result))
      {
       $count  = $temp_array['count'] + 1;
       $rating = $temp_array['rating'] + $_POST['an'];

       mysql_query("UPDATE $userstable SET `count` = " . $count . ', `rating` = ' . $rating . ' WHERE `id` = ' . $id );
      }

   $text_out = '<h3>Спасибо!<br> Ваша оценка статьи "'.$temp_array['zagol'].'" принята.</h3>';
   return( $text_out );
 }

function ocenka_list() {
    global $userstable, $id;

   $result = mysql_query( "SELECT * FROM $userstable WHERE `id` = $id" ) or die (mysql_error());
   $temp_array = mysql_fetch_array( $result );
   
   // Переменная содержит текущий рейтинг статьи
   $rating = (is_null($temp_array['count'])) ? 0 : round($temp_array['rating'] / $temp_array['count']);

   $text_out = '<h6>Результат оценки "'.$temp_array[ 'zagol' ].'" на текущий момент:</h6>
                          <table width="400" border="0" cellspacing="1" cellpadding="2" align="center" background="">';

   $text_out .= '
                 <tr>
                   <td colspan="2" class="minilogo">
                     Всего голосов: '.$temp_array[ "rating" ].'
                   </td>
                 </tr>
                 <tr>
                   <td>
                   <center><a href="http://'.$_SERVER["HTTP_HOST"].'">На главную</a></canter>
                   </td>
                 </tr>
                </table><br>';

 return( $text_out );
 }

################### HTML_OPROS_FORM() ####################

function html_ocenka_form() {
   global $id;

   $text_out = '
<!-- Форма оценки  -->
<table>
   <tr>
     <td align="left">
       <form action="" method="POST" class="sl">
         <input name="id" type="hidden" value="'.$id.'" class="form" />
         <input name="act" type="hidden" value="add" class="form" />
         <center>Оцените статью:</center><br>';
         for( $i = -5; $i <= 5; $i++ )
             {
                 $text_out .= '
         <input name="an" type="radio" value="'.$i.'" class="form" /> '.$i;
             }
         $text_out .= '
         <br>
         <br>
         <center>
         <input type="submit" value="Оценить" class="form" /><br>
         </center>
       </form>
     </td>
   </tr>
</table>
<!-- END Форма оценка  -->';

 return( $text_out );
 }

$hostname = "localhost";
$username = "root";
$password = "password";
$dbName   = "dbName";
$userstable = "material";

@mysql_connect( $hostname, $username, $password, $dbName );
@mysql_select_db($dbName) or die(mysql_error());
$id = $_GET['id'];

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Оценка</title>
</head>
<body>
<?php
    if (isset($_POST['act'], $_POST['id'], $_POST['an']) && $_POST['act'] = 'act') {
        $id = $_POST['id'];
        ocenka_add();
    }
    ocenka_list();
    html_ocenka_form();
?>
</body>
</html>

82

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спсибо большое за оказанную помощ.

С небольшими дработками, рейтинг заработал.

83

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

У меня новая задача. Нужно написать "звездочки" рейтинга.

Есть код который добавляет звездочки по мере увеличения рейтинга статьи:
В моем случае перечень оценок такой: -5 -4 -3 -2 -1 0 1 2 3 4 5

<td background="./image/star.gif" width="'.( ( $temp_array[ "rating".$i ] == "0" ) ? "0" : $echo_proc ).'%" class="minilogo"></td> <!-- красные звездочки -->

<td background="./image/star2.gif" width="'.( ( $temp_array[ "rating".$i ] == "0" ) ? "100" : ( 100 - $echo_proc ) ).'%" class="minilogo"></td><!-- белые звездочки -->

НО эти звездочки отображают оценку со знаком + , а поскольку у меня так же есть и отрицательные оценки, то какой код нужно добавить чтобы добавлялись отрицательные оценки и увеличивалось число синих звездочек которые отображались бы рядом с красными звездочками?

Заранее благодарен за помощ.

84

Re: Как увеличить количество строк/знаков?

Проверяйте условие на: если меньше нуля.
$temp_array[ "rating".$i ] <= 0

Как $echo_proc у вас вычисляется я не знаю.

85

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо что откликнулись.

В моем случае выглядит так:
$result = MYSQL_QUERY( "SELECT * FROM $userstable WHERE id='$id'" )
or die (mysql_error());
$temp_array = mysql_fetch_array( $result );

$echo_proc = ( ( $temp_array[ "rating".$i ] == 0 ) ? "0" : round( ( ( $temp_array[ "rating".$i ] * 100 ) / $temp_an ) ) );

далее:
$text_out .= '
                   <td background="./image/star.gif"...

Вы знаете уже пробовал:
<td background="./image/star.gif" width="'.( ( $temp_array[ "rating".$i ] <= "0" )...
он так не реагирует(возможно нетак что-то сделал).

Буду благодарен за помощ.

86

Re: Как увеличить количество строк/знаков?

Какой диапазон значений возвращает $temp_array[ "rating".$i ]? Что такое $temp_an?

87

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

$temp_an = 0;

Скажите, а где можно посмотреть диапазон значений которые возвращает $temp_array[ "rating".$i ]??

Возможно что-то еще не увидел.
Буду благодарен за помощ.

88

Re: Как увеличить количество строк/знаков?

Victor2008 сказал:

Скажите, а где можно посмотреть диапазон значений которые возвращает $temp_array[ "rating".$i ]??

В таблице находящейся в переменной $userstable.

Victor2008 сказал:

$temp_an = 0;

Этого не может быть, ведь тогда получается деление на ноль.
$echo_proc = ( ( $temp_array[ "rating".$i ] == 0 ) ? "0" : round( ( ( $temp_array[ "rating".$i ] * 100 ) / $temp_an ) ) );

89

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо что ответили.

Простите, но я несовсем понял где нужно смотреть и что нужно смотреть:
"В таблице находящейся в переменной $userstable."

Далее:
ВЫ:
Этого не может быть, ведь тогда получается деление на ноль.
$echo_proc = ( ( $temp_array[ "rating".$i ] == 0 ) ? "0" : round( ( ( $temp_array[ "rating".$i ] * 100 ) / $temp_an ) ) );

В данном случае ситуация такова что в базе в ячейке COUNT(посетители посетившие статьи уже есть значение), а в RATING(суммарный балл оценки за статью).

Так вот Штука в том что код который:
<td background="./image/star.gif" width="'.( ( $temp_array[ "rating".$i ] == "0" ) ? "0" : $echo_proc ).'%" class="minilogo"></td> <!-- красные звездочки -->

<td background="./image/star2.gif" width="'.( ( $temp_array[ "rating".$i ] == "0" ) ? "100" : ( 100 - $echo_proc ) ).'%" class="minilogo"></td><!-- белые звездочки -->
отображает звездочки красного цвета в случае когда оценка в ячейке базы есть без знака минус(от 0-нуля и в сторону увеличения)
А вот если оценка за статю в ячейке уже есть со знаком минус (от 0 и увеличенная отрицательно значения от -1 и больше...-10...-13) тот же код отрицательную оценку уже не выдает, пробовал с Вашей поправкой $temp_array[ "rating".$i ] <= "0", к сожалению результата тоже не принес. К сожалению незнаю где смотреть диапазон значений выдаваемый $temp_array[ "rating".$i ]

Здесь как думаю возможно нужно просто вывести звездочки синего цвета означающие отрицательный знак оценки т.е. уже готовое обработанное число со знаком "-" и остальное пространство заполнить пустыми звездочками, к сожалению варианты со знаком "<" в коде недают. Возможно я что-то упускаю.

Буду благодарен за ответ.

90

Re: Как увеличить количество строк/знаков?

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

C:\mysql\bin>mysql -uroot -ppassword slava_sebastopol_ua < c:\anypath\line.sql
ERROR 1136 at line 1: Column count doesn't match value count at row 1

Что не так?
Пред этим работал с этой же таблицей и в процессе работы добавил три новых столбика count rating date. Раньше при старой базе этих колонок в таблице небыло. Может ли быть так что из-за этих дополнитоельных  count rating date, которых в дампе нет, дамп и нехочет заливаться в базу?

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

91

Re: Как увеличить количество строк/знаков?

Victor2008 сказал:

Может ли быть так что из-за этих дополнитоельных  count rating date, которых в дампе нет, дамп и нехочет заливаться в базу?

Так делать нельзя. Дамп должен вставляться на ту структуру таблиц, для которой был создан.

Victor2008 сказал:

Простите, но я несовсем понял где нужно смотреть и что нужно смотреть:
"В таблице находящейся в переменной $userstable."

В переменной $userstable вы прописываете в скрипте имя таблицы, с помощью phpMyAdmin посмотрите значения полей этой таблицы.

92

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо что обьяснили по поводу дампа, теперь понятно.

Вот параметры значения полей $userstable = "material";
Поле       Тип      Атрибуты      Null      По умолчанию      Дополнительно

id           int(11)                  Нет                            auto_increment
year         int(11)                Нет      0
month       int(11)               Нет        0
day         int(11)                 Нет      0
count         int(11)                Нет         0
rating     int(11)                 Нет      0
rubr         text                  Да      NULL
zagol        text                  Да      NULL
vrez        text                  Да      NULL
text         text                  Нет
podp       text                         Да      NULL
img        text                  Да      NULL
img_alt  text                         Да      NULL
counter  enum('first', 'staty', 'anons', 'vopros', 'sevaya', 'news', 'mol')            Нет      first

ну, вот вроде. Так?
Заранее благодарю за ответ.

93

Re: Как увеличить количество строк/знаков?

Victor2008
Не понимаю. Где же здесь поле $temp_array[ "rating".$i ]? Выбирать рейтинг надо из того поля в которое записывается, наверное. И как он записывается и куда? Я напрочь запутался.

94

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо за комментарий, попробую вот так:
поле
count         int(11)                Нет         0

записываются все посетившие (прочитавшие) статью допустим 8 человек

поле
rating     int(11)                 Нет      0

записываются приплюсованные оценки каждого пользователя, которые оценили статью баллом допуситм 5:
-5 -4 -3 -2 -1 0 1 2 3 4 5 -одним из этого перечня.

код который показывает эту пятерку(5) в виде звездочек:
<td background="./image/star.gif" width="'.( ( $temp_array[ "rating".$i ] == "0" ) ? "0" : $echo_proc ).'%" class="minilogo"></td> <!-- красные звездочки -->

Теперь в случае когда в поле:
rating     int(11)                 Нет      0
стоит оценка -5 нужно переписать код который отобразит звездочки синего цвета, так вот как записать код чтобы оценка -5 показала столько же синих звездочек как показывают красные звездочки оценку 5 закрашивая одну звездочку?

95

Re: Как увеличить количество строк/знаков?

да и еще
мне тут браузер после того как мной был помещен dump(общий размер 809 mb) в mysql выдал:

Fatal error: Maximum execution time of 30 seconds exceeded in c:\usr\home\slava.ua\www\php\function.php on line 133

это строка $res->MoveNext();

вобщем эта страница в браузере зависает и на белом фоне пишет такую ошибку, что это и как с этим бороться?

96

Re: Как увеличить количество строк/знаков?

Victor2008 сказал:

вобщем эта страница в браузере зависает и на белом фоне пишет такую ошибку, что это и как с этим бороться?

$res->MoveNext(); - $res - это ссылка на класс. Смотрите выше по коду где этот класс создается, есть ли он вообще и есть ли в нем функция MoveNext().

$echo_proc = ( ( $temp_array["rating"] == 0 ) ? "0" : round( ( ( $temp_array["rating"] * 100 ) / 5 ) ) );
echo '<td background="./image/star.gif" width="'.( ( $temp_array["rating"] <= 0 ) ? "0" : $echo_proc ).'%" class="minilogo"></td> <!-- красные звездочки -->';

echo '<td background="./image/star2.gif" width="'.( ( $temp_array["rating"] >= 0 ) ? "100" : ( 100 + $echo_proc ) ).'%" class="minilogo"></td><!-- белые звездочки -->';

97

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Большое спасибо за помощ, очень помогли, на днях буду испытывать отредактированный Вами код.

Теперь по поводу $res->MoveNext(); В коде часть механизма такая:
сначала идетзапрос из базы:
$res = $conn->Execute( "SELECT rubr,.....);

for( $i = 0; $i < $res->RecordCount(); $i++ )
      {
потом идет:
$text_out .= '<tr>....'. и... и в конце </tr>';

потом этот клас:
$res->MoveNext();
}
$text_out = '<table border="1">'.$text_out.'</table>'.other_staty();
return( $text_out );

Возможно что ошибка:
Fatal error: Maximum execution time of 30 seconds exceeded in c:\usr\home\slava.ua\www\php\function.php on line 133
из-за того что база слишком перегружена 11,478,699 записей?

Самая забитая таблица в базе получилась:
phpbb_search_wordmatch   (с количеством записей 10,544,980 это таблица относится к phpBB форуму. Может из-за количества обращений к базе сама MySQL и виснет и поэтому и вылетает ошибка Fatal error: Maximum execution time of 30.....)??

Неочень хоршие люди поступили сломав форум(phpBB2), который модерировал мой предшественник, теперь когда загружается главная страница форума или ссылка на форум из админки, то загружается одна и таже ситуация, на черном фоне большими разноцветными буквами написано что форум сломан. Кроме этой страницы больше ничего незагружается. НО админка работает, на форум в темы и топики попасть нельзя, можно только сделать копию всего и т.д.

Можно как-то починить эту поломку? (т.е. возможно где-то переписать код или заменить како-либо файл? Может просто обновить версию форума или можно обойтись без обновления форума, ведь с новой версией добавятся новые ошибки?)

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

98

Re: Как увеличить количество строк/знаков?

Victor2008
Смотрите где в переменную $conn передается класс. Выглядеть должно как-то так: $conn = new className();
Именно класс с именем className и следует искать в самом коде или подключаемых к скрипту файлах.

Не могу сказать является ли большое количество записей причиной ошибки, но можно открыть эту таблицу в phpMyAdmin - если он откроет, то и скрипт должен.

Victor2008 сказал:

Можно как-то починить эту поломку? (т.е. возможно где-то переписать код или заменить како-либо файл? Может просто обновить версию форума или можно обойтись без обновления форума, ведь с новой версией добавятся новые ошибки?)

Самым правильным будет обновить форум. При корректном пошаговом обновлении ошибок быть не должно. Перед обновлением обязательно сделать копию, как файлов форума, так и БД. Самым правильным будет обновлять не текущую БД, а ее копию, чтобы всегда можно было легко вернуться в исходное состояние.

99

Re: Как увеличить количество строк/знаков?

Доброго времени суток.

Спасибо за дельный совет в управлении и поддержке форума. Вы знаете мне удалось найти поломку на форуме, далее форум действительно нужно обновить и он готов к работе, однако после случившегося мое начальство наотрез отказалось открывать форум. Мне был дан ответ что люди неадекватны.

Далее мной был опробован в работе отредактированный код:

$echo_proc = ( ( $temp_array["rating"] == 0 ) ? "0" : round( ( ( $temp_array["rating"] * 100 ) / 5 ) ) );
echo '<td background="./image/star.gif" width="'.( ( $temp_array["rating"] <= 0 ) ? "0" : $echo_proc ).'%" class="minilogo"></td> <!-- красные звездочки -->';

echo '<td background="./image/star2.gif" width="'.( ( $temp_array["rating"] >= 0 ) ? "100" : ( 100 + $echo_proc ) ).'%" class="minilogo"></td><!-- белые звездочки -->';

Все мои попытки уговорить работать код оказались тщетными. Однако, возможно неправельно, мной были внесены изменения в код которые имели вид:

echo '<td background="./image/star2.gif" width="'.( ( $temp_array["rating"] >= 0 ) ? "100" : ( -100 + $echo_proc ) ).'%" class="minilogo"></td><!-- белые звездочки -->';

Измениение в месте 100 изменено(возможно неправельно) на -100. В таком виде почему-то реакция есть и звездочки закрашиваются, но сразу половина и потом ни туда ни сюда. Мной была просмотрена книга PHP в подлиннике но четкого пояснения механизма который бы выводил из базы отрицательные математические знаки найдено небыло. Либо я не там искал, либо еще непрочината та книга где ответ на вопрос есть.

Касаемо этой ошибки:
$res->MoveNext();

Мне сказали что возможно это из-за перезагружености базы. Вобщем пои попытки поднять это все продолжаются.

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

100

Re: Как увеличить количество строк/знаков?

Victor2008
Для проверки делайте так:
1) Проверка всех звездочек. Следует менять 100, 80, 60% и т. д.
echo '<td background="./image/star.gif" width="100%" class="minilogo"></td> <!-- красные звездочки -->';
2) То же самое с белыми звездочками.
echo '<td background="./image/star2.gif" width="100%" class="minilogo"></td><!-- белые звездочки -->';
3) После строки:
$echo_proc = ( ( $temp_array["rating"] == 0 ) ? "0" : round( ( ( $temp_array["rating"] * 100 ) / 5 ) ) );
Добавьте:
exit($echo_proc);
Смотрите что выводит.
4) Если предыдущий шаг ничего не дал, то пробуйте так:
exit($temp_array["rating"]);

Ищите ошибку и пробуйте исправить.