Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не могу разобраться в коде

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Coder1994
Отправлено: 25 Декабря, 2010 - 12:45:55
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




Это бот умника для чата.
Вот код:
PHP:
скопировать код в буфер обмена
  1. <?
  2. $set['umnik_help'] = '10';
  3. $set['umnik_new'] = '30';
  4. $set['umnik_time'] = '60';
  5. $umnik_last = $mysqli->query("SELECT * FROM `chat_posts` WHERE `room_id` = '$room[id]' AND `umnik_st` <> '0' ORDER BY id DESC");
  6. $umnik_last = $umnik_last->fetch_assoc();
  7.  
  8. if ($umnik_last!=NULL && $umnik_last['umnik_st']!=4 && $umnik_last['umnik_st']!=0)
  9. {
  10.         $umnik_vopros = $mysqli->query("SELECT * FROM `chat_quests` WHERE `id` = '$umnik_last[quests]' LIMIT 1");
  11.         $umnik_vopros = $umnik_vopros->fetch_assoc();
  12.         $umnik_post = $mysqli->query("SELECT * FROM `chat_posts` WHERE `room_id` = '$_GET[id]' AND `text` like '%$umnik_vopros[otvet]%' AND `umnik_st` = '0' AND `time` >= '".($time-$umnik_last['time'])."' ORDER BY `id` ASC LIMIT 1");
  13.         $umnik_post = $umnik_post->fetch_assoc();
  14.         if($umnik_post!=NULL){
  15.                 $us = get_user($umnik_post['autor']);
  16.                 $add_credits=0;
  17.                 if ($umnik_last['umnik_st']==1){$add_credits=0.5;$pods='не используя подсказок';}
  18.                 if ($umnik_last['umnik_st']==2){$add_credits=0.1;$pods='используя одну подсказку';}
  19.                 if ($umnik_last['umnik_st']==3){$add_credits=0.05;$pods='используя обе посказки';}
  20.                 $msg="[b]$us[nick][/b] дал верный ответ на вопрос: [b]$umnik_vopros[vopros][/b] $pods.<br />\nЕго балланс увеличен на $add_credits кредитов.<br />\nСледующий вопрос будет через $set[umnik_new] секунд.";
  21.                 $mysqli->query("INSERT INTO `chat_posts` (`autor`, `umnik_st`, `time`, `text`, `room_id`, `quests`) values('0', '4', '$time', '$msg', '$_GET[id]', '$umnik_vopros[id]')");
  22.                 $mysqli->query("UPDATE `users` SET `credits` = '".($us['credits']+$add_credits)."' WHERE `id` = '$us[id]' LIMIT 1");
  23.         }
  24. }
  25.  
  26. $umnik_last1 = $mysqli->query("SELECT * FROM `chat_posts` WHERE `room_id` = '$_GET[id]' AND `umnik_st` = '1' ORDER BY id DESC");
  27. $umnik_last1 = $umnik_last1->fetch_assoc();
  28.  
  29. if ($umnik_last1!=NULL && $umnik_last['umnik_st']!=4 && $umnik_last1['time']<time()-$set['umnik_time'])
  30. {
  31.         $umnik_vopros = $mysqli->query("SELECT * FROM `chat_quests` WHERE `id` = '$umnik_last1[quests]' LIMIT 1");
  32.         $umnik_vopros = $umnik_vopros->fetch_assoc();
  33.         $msg="На вопрос никто не ответил.<br />\nПравильный ответ: $umnik_vopros[otvet].<br />\nСледующий вопрос через $set[umnik_new] секунд.";
  34.         $mysqli->query("INSERT INTO `chat_posts` (`autor`, `umnik_st`, `time`, `text`, `room_id`, `quests`) values('0', '4', '$time', '$msg', '$_GET[id]', '$umnik_vopros[id]')");
  35. }
  36.  
  37. $umnik_last = $mysqli->query("SELECT * FROM `chat_posts` WHERE `room_id` = '$_GET[id]' AND `umnik_st` <> '0' ORDER BY id DESC");
  38. $umnik_last = $umnik_last->fetch_assoc();
  39.  
  40. if ($umnik_last==NULL || $umnik_last['umnik_st']==4 && $umnik_last['time']<time()-$set['umnik_new'])
  41. {
  42.         // задается вопрос
  43.         $k_vopr = $mysqli->query("SELECT * FROM `chat_quests`");
  44.         $k_vopr = $k_vopr->num_rows;
  45.         $umnik_vopros = $mysqli->query("SELECT * FROM `chat_quests` LIMIT ".rand(0,$k_vopr).", 1");
  46.         $umnik_vopros = $umnik_vopros->fetch_assoc();
  47.         $msg="[b]Вопрос:[/b] \"$umnik_vopros[vopros]\"<br />\n[b]Ответ:[/b] слово из ".mb_strlen($umnik_vopros['otvet'])." букв.";
  48.         $mysqli->query("INSERT INTO `chat_posts` (`autor`,`umnik_st`, `time`, `text`, `room_id`, `quests`) values('0', '1', '$time', '$msg', '$_GET[id]', '$umnik_vopros[id]')");
  49. }
  50.  
  51. if ($umnik_last!=NULL && $umnik_last['umnik_st']==1 && $umnik_last['time']<$time-$set['umnik_help'])
  52. {
  53.         $umnik_vopros = $mysqli->query("SELECT * FROM `chat_quests` WHERE `id` = '$umnik_last[quests]' LIMIT 1");
  54.         $umnik_vopros = $umnik_vopros->fetch_assoc();
  55.     $_SESSION['rand'] = rand(0, mb_strlen($umnik_vopros['otvet']) - 1);
  56.     $help = '';
  57.         for ($i=0;$i<$_SESSION['rand'];$i++ ) {
  58.         $help.='*';
  59.         }
  60.         if (function_exists('iconv_substr'))
  61.                 $help.=iconv_substr($umnik_vopros['otvet'], $_SESSION['rand'], 1, 'utf-8');
  62.         else
  63.                 $help.=substr($umnik_vopros['otvet'], $_SESSION['rand'], 2);
  64.  
  65.         for ($i=0;$i<mb_strlen($umnik_vopros['otvet'])-$_SESSION['rand'];$i++ ) {
  66.         $help.='*';
  67.         }
  68.  
  69.         $msg="[b]Вопрос:[/b] \"$umnik_vopros[vopros]\"<br />\n[b]Первая подсказка:[/b] $help (".mb_strlen($umnik_vopros['otvet'])." букв)";
  70.         $mysqli->query("INSERT INTO `chat_posts` (`autor`,`umnik_st`, `time`, `text`, `room_id`, `quests`) values('0', '2', '$time', '$msg', '$_GET[id]', '$umnik_vopros[id]')");
  71. }
  72.  
  73. if ($umnik_last!=NULL && $umnik_last['umnik_st']==2 && $umnik_last['time']<time()-$set['umnik_help'])
  74. {
  75.         $umnik_vopros = $mysqli->query("SELECT * FROM `chat_quests` WHERE `id` = '$umnik_last[quests]' LIMIT 1");
  76.         $umnik_vopros = $umnik_vopros->fetch_assoc();
  77.         $help = '';
  78.  
  79.         for ($i=0;$i<$_SESSION['rand'];$i++ ) {
  80.         $help.='*';
  81.         }
  82.  
  83.         if (function_exists('iconv_substr'))
  84.                 $help.=iconv_substr($umnik_vopros['otvet'], $_SESSION['rand']+1, 2, 'utf-8');
  85.         else
  86.                 $help.=substr($umnik_vopros['otvet'], $_SESSION['rand']+1, 4);
  87.  
  88.         for ($i=0;$i<mb_strlen($umnik_vopros['otvet'])-$_SESSION['rand']-2;$i++) {
  89.         $help.='*';
  90.         }
  91.  
  92.         $msg="[b]Вопрос:[/b] \"$umnik_vopros[vopros]\"<br />\n[b]Вторая подсказка:[/b] $help (".mb_strlen($umnik_vopros['otvet'])." букв)";
  93.         $mysqli->query("INSERT INTO `chat_posts` (`autor`,`umnik_st`, `time`, `text`, `room_id`, `quests`) values('0', '3', '$time', '$msg', '$_GET[id]', '$umnik_vopros[id]')");
  94. }
  95.  
  96. ?>

Проблема в том что, подсказки делаются неверно,идёт смещение символов, вот например:
3) [25 декабря 2010 года в 13:42:01]
Вопрос: "Мордовская свирель."
Ответ: слово из 5 букв.
Ответить
4) [25 декабря 2010 года в 13:42:13]
Вопрос: "Мордовская свирель."
Первая подсказка: н***** (5 букв)
Ответить
5) [25 декабря 2010 года в 13:42:24]
Вопрос: "Мордовская свирель."
Вторая подсказка: уд*** (5 букв)
Ответить
----
Верный ответ на этот вопрос - нудей.

Структура таблицы chat_posts:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `chat_posts` (
  2.   `id` int(8) NOT NULL AUTO_INCREMENT,
  3.   `room_id` int(2) NOT NULL,
  4.   `text` varchar(4096) NOT NULL,
  5.   `umnik_st` int(1) NOT NULL,
  6.   `quests` varchar(64) NOT NULL,
  7.   `time` int(20) NOT NULL,
  8.   `autor` int(8) NOT NULL,
  9.   PRIMARY KEY (`id`)
  10. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Структура таблицы chat_quests:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `chat_quests` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `vopros` varchar(1024) NOT NULL,
  4.   `otvet` varchar(32) NOT NULL,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11230 ;

(Добавление)
Народ, помощь ваша нужна!

(Отредактировано автором: 25 Декабря, 2010 - 12:49:14)

 
 Top
Okula
Отправлено: 25 Декабря, 2010 - 14:31:00
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




А помоему тип поля VARCHAR включает до 255 символов, а никак не 4096 и не 1024 (это я об структуре таблицы)
Для таких полей применяется тип поля TEXT
 
 Top
Coder1994
Отправлено: 25 Декабря, 2010 - 14:33:26
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




Okula пишет:
А помоему тип поля VARCHAR включает до 255 символов, а никак не 4096 и не 1024 (это я об структуре таблицы)
Для таких полей применяется тип поля TEXT

Нет. Он вполне включает и 20000 симолов. поле TEXT по-моему не дружит со спец.символами.
 
 Top
Мелкий Супермодератор
Отправлено: 25 Декабря, 2010 - 16:14:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Okula пишет:
А помоему тип поля VARCHAR включает до 255 символов

Это дефолтно. А указать можно весьма широкий диапазон. Но ман читать лениво, на сколько широкий диапазон...

Coder1994 пишет:
поле TEXT по-моему не дружит со спец.символами.

Вполне дружит. Ну можете blob сделать, ему и вовсе бинарные данные кормить можно.
По основному вопросу - нет желания разбирать код...

(Отредактировано автором: 25 Декабря, 2010 - 16:15:16)



-----
PostgreSQL DBA
 
 Top
Coder1994
Отправлено: 25 Декабря, 2010 - 16:17:35
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




Мелкий пишет:
Okula пишет:
А помоему тип поля VARCHAR включает до 255 символов

Это дефолтно. А указать можно весьма широкий диапазон. Но ман читать лениво, на сколько широкий диапазон...

Coder1994 пишет:
поле TEXT по-моему не дружит со спец.символами.

Вполне дружит. Ну можете blob сделать, ему и вовсе бинарные данные кормить можно.
По основному вопросу - нет желания разбирать код...

Я пытался разобраться,но запутался. Собственно говоря поэтому и прошу помочь. И можно ли его как-нибудь сократить?
 
 Top
JustUserR
Отправлено: 25 Декабря, 2010 - 17:25:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Coder1994 пишет:
Поле TEXT по-моему не дружит со спец.символами
Для осуществления сохранение в информационное поле типа TEXT элементом специальных символов - возможно предварителное приведение сохраняемых данныых в более высокий уровень элементного кодирования или выполнения их шифрования в виде base64


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Coder1994
Отправлено: 25 Декабря, 2010 - 17:32:31
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




Может кто-нибудь по делу поможет?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB