PHP.SU

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

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

> Найдено сообщений: 15
Ja_kazanova Отправлено: 14 Сентября, 2013 - 01:23:27 • Тема: Выражение для парсинга функций • Форум: Регулярные выражения

Ответов: 14
Просмотров: 787
Прочёл только первое сообщение. В голову приходит только посчитать скобки фигурные, разбить на пары их. Ну и если их число не чётное, генерировать ошибку. Именно так я и попытался бы решить эту задачу при надобности.
Чуть не забыл. Отсчет начинать после function.
P.S.
Позвольте поинтересоваться. А зачем Вам это понадобилось?
Ja_kazanova Отправлено: 14 Сентября, 2013 - 01:10:33 • Тема: Список матов • Форум: Прочее

Ответов: 1
Просмотров: 50
Доброго времени суток, уважаемые форумчане. В данный момент пишу анти мат. Надо бы списочек матов, так сказать подыскать. Возможно кто-то, уже сталкивался с аналогичной проблемой, пособите материалом. За ранее Вам благодарен. Большое человеческое спасибо)
Ja_kazanova Отправлено: 04 Сентября, 2013 - 18:16:11 • Тема: Рекурсия в __autoload • Форум: Объектно-ориентированное программирование

Ответов: 4
Просмотров: 1557
caballero пишет:
поименовал бы хоть по человечески
(Добавление)
уже обсуждалось
http://forum.php.su/topic.php?forum=75&topic=998

Благодарю но, видимо ты не так меня понял.
Вот так, работает.
PHP:
скопировать код в буфер обмена
  1.  
  2. function __autoload($class)
  3.         {
  4.                 if(!class_exists($class))
  5.                 {
  6.                         $class_name = preg_replace("#\_.*$#s", '', $class);
  7.                         if($class_name == 'ac' && is_file(AC_CLASS.$class.".php"))
  8.                          include_once(AC_CLASS.$class.".php");
  9.                         elseif($class_name == 'int' && file_exists(AC_INTERFACE.$class.".php"))
  10.                          include_once(AC_INTERFACE.$class.".php");
  11.                         elseif($class_name == 'mod' && file_exists(AC_MODULE.$class.".php"))
  12.                          include_once(AC_MODULE.$class.".php");
  13.                         elseif($class_name == 'ex' && file_exists(AC_EXCEPTION.$class.".php"))
  14.                          include_once(AC_EXCEPTION.$class.".php");
  15.                         elseif($class_name == 'trait' && file_exists(AC_TRAIT.$class.".php"))
  16.                          include_once(AC_TRAIT.$class.".php");
  17.                 }
  18.         }
  19.  

Исходя из выше представленного кода, делаем вывод. Функция __autload(class) автоматически срабатывает всякий раз при вызове того или иного метода класса передаваемого в качестве аргумента функции. То есть, загружать весь код в память не надо.
Ja_kazanova Отправлено: 04 Сентября, 2013 - 17:28:40 • Тема: Рекурсия в __autoload • Форум: Объектно-ориентированное программирование

Ответов: 4
Просмотров: 1557
Доброго времени суток, уважаемые форумчане.
Сегодня столкнулся с проблемой создания функции __autoload с рекурсивным поиском классов по вложенным директориям.
PHP:
скопировать код в буфер обмена
  1.  
  2.        
  3. function autoload($dir, $class)
  4.         {
  5.                 static $return = false;
  6.                 if(is_dir($dir) && $dire = scandir($dir))
  7.                 {
  8.                         foreach($dire as $file)
  9.                         {
  10.                                 if($file == '.' || $file == '..')
  11.                                  continue;
  12.                                 elseif(is_dir($dir.'/'.$file))
  13.                                  autoload($dir.'/'.$file, $class);
  14.                                 elseif(is_file($dir.'/'.$file) && substr(basename($file), 0, stripos(basename($file), '.')) == $class)
  15.                                  $return = $dir.'/'.$file;
  16.                         }
  17.                         unset($dire);
  18.                 }
  19.                 return $return;
  20.         }
  21.         function __autoload($class)
  22.         {
  23.                 $dir = substr(AC_PHP, 0, strlen(AC_PHP) - 1);
  24.                 if($require = autoload($dir, $class))
  25.                  include_once($require);
  26.         }
  27.  

При тесте функции autoload(dir, class) вне функции автозагрузки, всё работает и находит что, надо. Но, стоит лишь поместить вызов функции autoload(dir, class) в тело функции __autoload(class) как, в дуг откуда ни возьмись, появляется куча ошибок. Типа не найден тот и тот класс.
После, в теле функции __autoload(class) пишу следующие строки
PHP:
скопировать код в буфер обмена
  1.  
  2.         If(!function_exists(‘autoload’))
  3.          Exit(‘Таки нет’);
  4.         else exit(‘Таки да’);
  5.  

Вылезла строчка “Таки да”. Получается функция должна работать но, не работает.
В чем дело, не подскажите. За ранее благодарен Вам, спасибо
Ja_kazanova Отправлено: 23 Июня, 2013 - 18:50:55 • Тема: Ошибки и исключения в PHP • Форум: Программирование на PHP

Ответов: 5
Просмотров: 606
DelphinPRO пишет:
у ошибок и исключений разное назначение, хоть и выглядит что они работают одинаково (в глазах новичков). Думаю вам стоит подтянуть свои знания в области исключений.

Я задавал подобный вопрос год назад

Видимо или я не так спросил, или Вы меня не так поняли. Вопрос в эффективности.
Как Вы считаете, лучше использовать
PHP:
скопировать код в буфер обмена
  1.  
  2. try
  3.         {
  4.                 if($this -> db = parent::__construct($db_host, $db_user, $db_pass))
  5.                 {
  6.                         if($this -> db -> select_db($db_name))
  7.                          $this -> db -> query("SET NAMES UTF8");
  8.                         else throw new exception("#{$db -> errno}: {$db -> error}");
  9.                 }
  10.                 else throw new exception('#'.mysqli_connect_errno().': '.mysqli_connect_error());
  11.         }
  12.         catch(exception $a)
  13.         {
  14.                 mail('Май мылко', ..., ..., ...);
  15.                 exit("Извините, сервис временно не доступен!");
  16.         }
  17.  
  18.  

или
PHP:
скопировать код в буфер обмена
  1.  
  2.         if($this -> db = parent::__construct($db_host, $db_user, $db_pass))
  3.         {
  4.                 if($this -> db -> select_db($db_name))
  5.                  $this -> db -> query("SET NAMES UTF8");
  6.                 else trigger_error("#{$db -> errno}: {$db -> error}", E_USER_ERROR);
  7.         }
  8.         else trigger_error('#'.mysqli_connect_errno().': '.mysqli_connect_error(), E_USER_ERROR);
  9.  
  10.  
Ja_kazanova Отправлено: 23 Июня, 2013 - 17:30:12 • Тема: Ошибки и исключения в PHP • Форум: Программирование на PHP

Ответов: 5
Просмотров: 606
Меня интересует, если в движке в целом определён пользовательский обработчик ошибок то, не является ли блок try/catch исполняемого класса рудиментом как, таковой? И отлавливает ли error_trigger все ошибки скрипта или это такая себе альтернатива throw new Exception? И в случае если задача обеих обработчиков аналогична то, какой из них по Вашему лучше использовать?
Ja_kazanova Отправлено: 23 Июня, 2013 - 16:41:17 • Тема: Ошибки и исключения в PHP • Форум: Программирование на PHP

Ответов: 5
Просмотров: 606
Доброго времени суток, уважаемые форумчане.
У меня внезапно возник вопрос. В чем заключается разница между исключениями и ошибками в PHP? И актуально ли будет использовать блок
Try && catch если уже определён set_error_handler?
Товарищи, возможно у кого-то имеется литература с подробнейшим описанием данной темы – поделитесь со мной. За ранее благодарен Вам, дорогие друзья. Огромное Вам человеческое спасибо)
P.S.
Чтобы не создавать отдельную тему, киньте ссылку на описание с подробными (разжеванными) примерами по использованию встроенных функций PHP bbcode)
Ja_kazanova Отправлено: 16 Июня, 2013 - 16:03:10 • Тема: is hex? • Форум: Кодировки и все смежное

Ответов: 3
Просмотров: 1757
Доброго времени суток, уважаемые форумчане!
Перед вводом данных (TEXT|BLOB) в БД, я предварительно обрабатываю их функцией

Соответственно перед выводом таких данных они нуждаются в повторной обработке

Так вот, как мне узнать были ли они прежде обработаны bin2hex или нет?
За ранее Вам благодарен. Спасибо
Ja_kazanova Отправлено: 20 Апреля, 2013 - 19:58:59 • Тема: Изучение триггеров • Форум: SQL и Архитектура БД

Ответов: 1
Просмотров: 28
Вопрос решен. Тему можно крыть.
Просто надо было убрать круглые скобки вокруг конструкции delete
Ja_kazanova Отправлено: 20 Апреля, 2013 - 17:26:52 • Тема: Изучение триггеров • Форум: SQL и Архитектура БД

Ответов: 1
Просмотров: 28
Доброго времени суток, уважаемые Форумчане)
Друзья, пытаюсь создать триггер который удалял бы хвосты файлов при удалении директории но, пред моим взором навязчиво возникает мною заскриненая и к посту прикрепленная ошибка. Может это Денвер лагает и лучше его заменить Xampp(ом)?
А вот собственно и код злополучного триггера.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. DELIMITER $$
  3. CREATE OR REPLACE TRIGGER `tg_foto_dir`
  4. AFTER DELETE ON `ac_foto_dir`
  5. ALTER EACH ROW
  6. BEGIN
  7. IF(SELECT COUNT(*) FROM `ac_foto_file` WHERE `id_dir` = OLD.id LIMIT 1) = 1
  8. THEN (DELETE FROM `ac_foto_file` WHERE `id_file` = OLD.id) END IF;
  9. END $$
  10. DELIMITER;
  11.  

Триггер №2 (Они взаимосвязаны, посему - неразлучныУлыбка))
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. DELIMITER $$
  3. CREATE OR REPLACE TRIGGER `tg_foto_alb`
  4. AFTER DELETE ON `ac_foto_album`
  5. ALTER EACH ROW
  6. BEGIN
  7. IF(SELECT COUNT(*) FROM `ac_foto_album` WHERE `id_album` = OLD.id) = 1
  8. THEN (DELETE FROM `ac_foto_file` WHERE `id_album` = OLD.id) END IF;
  9. END $$
  10. DELIMITER;
  11.  

Таблица директорий
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. /*
  3.                 Таблица директорий в фотоальбомах
  4.         */
  5.         CREATE TABLE IF NOT EXISTS `ac_foto_dir`
  6.         (
  7.                 `id` SERIAL,
  8.                 `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Время создания директории',
  9.                 `time_alter` TIMESTAMP COMMENT 'Время последнего изминения',
  10.                 `open` SET('0', '1') NOT NULL DEFAULT '0' COMMENT 'Возможность создавать фотоальбомы в директории. 1 - можно, 0 - запрещено',
  11.                 `size` bigint UNSIGNED NOT NULL DEFAULT '1024' COMMENT 'Максимальный вес выгружаеиого снимка',
  12.                 `dir` varchar(5120) NOT NULL DEFAULT '/' COMMENT 'Адрес текущей директории',
  13.                 `dire` varchar(5120) NOT NULL DEFAULT '/' COMMENT 'Адрес предведущей директории',
  14.                 `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'Название директории',
  15.                 `opis` varchar(1024) NOT NULL DEFAULT '' COMMENT 'Описание директории',
  16.                 PRIMARY KEY (`id`),
  17.                 UNIQUE KEY (`name`),
  18.                 KEY (`time`, `time_alter`, `open`, `size`)
  19.         ) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
  20.  

Таблица фотоальбомов
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.         CREATE TABLE IF NOT EXISTS `ac_foto_album`
  3.         (
  4.                 `id` SERIAL,
  5.                 `id_user` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID автора',
  6.                 `id_dir` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID директории',
  7.                 `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Время создания',
  8.                 `time_alter` TIMESTAMP COMMENT 'Время последнего обращения',
  9.                 `open` SET('0', '1', '2') NOT NULL DEFAULT '2' COMMENT 'Возможность просмотра снимков альбома другими пользователями. 2 - разрешено всем, 1 - только друзьям, 0 - запрещено всем',
  10.                 `pass` varchar(24) NOT NULL DEFAULT '' COMMENT 'Пароль на просмотр снимков альбома',
  11.                 `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'Название альбома',
  12.                 `opis` varchar(520) NOT NULL DEFAULT '' COMMENT 'Описание альбома',
  13.                 PRIMARY KEY (`id`),
  14.                 KEY (`time`, `time_alter`, `open`),
  15.                 FOREIGN KEY (`id_dir`) REFERENCES `ac_foto_dir` (`id`)
  16.                 ON DELETE RESTRICT ON UPDATE CASCADE
  17.         ) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
  18.  

Собственно сами файлы (снимки)
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.         CREATE TABLE IF NOT EXISTS `ac_foto_file`
  3.         (
  4.                 `id` SERIAL,
  5.                 `id_user` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID автора',
  6.                 `id_dir` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID директории снимка',
  7.                 `id_album` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID фотоальбома',
  8.                 `time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Время создания',
  9.                 `time_alter` TIMESTAMP COMMENT 'Время последнего обращения',
  10.                 `open` SET('0', '1', '2') NOT NULL DEFAULT '2' COMMENT 'Возможность комментировать снимок. 2 - разрешено всем, 1 - только друзьям, 0 - запрещено',
  11.                 `let` SET('0', '1') NOT NULL DEFAULT '0' COMMENT 'Файл +18. 1 - да, 0 - нет',
  12.                 `size` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Вес снимка',
  13.                 `type` SET('png', 'jpg', 'jpeg', 'gif') NOT NULL COMMENT 'Формат снимка',
  14.                 `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'Название снимка',
  15.                 `opis` varchar(5120) NOT NULL DEFAULT '' COMMENT 'Описание снимка',
  16.                 PRIMARY KEY (`id`),
  17.                 KEY (`time`, `time_alter`, `open`, `size`, `type`),
  18.                 FOREIGN KEY (`id_dir`) REFERENCES `ac_foto_dir` (`id`)
  19.                 ON DELETE RESTRICT ON UPDATE CASCADE,
  20.                 FOREIGN KEY (`id_album`) REFERENCES `ac_foto_album` (`id`)
  21.                 ON DELETE RESTRICT ON UPDATE CASCADE
  22.         ) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
  23.  

Заранее благодарен Вам. Спасибо дорогие, Друзья)
Ja_kazanova Отправлено: 11 Апреля, 2013 - 17:30:55 • Тема: MySQL - вложенные запросы • Форум: Администрирование БД

Ответов: 11
Просмотров: 5585
Мелкий, если в первом посте ваш код тогда я с вами полностью согласен. Но постольку поскольку там именно мой код без использования излюбленного вами JOIN(а) и вопрос как таковой уже давно исчерпан, тогда к чему эти танцы с бубном? Кому, чем и главное что вы пытаетесь доказать? Перед вложенным поиском строк имеет место проверка на заполненность которая была произведена посредством связки IF/COUNT, что и было сделано мной. И к чему те километры кода которые вы выложили в пред ведущем посте демонстрируя этим самым свою не компетентность. Ибо не нужен гектар кода там, где достаточно одного корректного предложения. Это мое имхо + тесты на производительность тоже на моей стороне)
Всего Вам доброго, прощевайте)
Ja_kazanova Отправлено: 11 Апреля, 2013 - 16:30:05 • Тема: MySQL - вложенные запросы • Форум: Администрирование БД

Ответов: 11
Просмотров: 5585
Мелкий пишет:
Ja_kazanova пишет:
Потому как если в выше упомянутой таблице статистики нет ни одной записи, mysql_num_rows(mysql_query(ваш код)) // = 0 в любом случае

Докажите показав, как пробовали. Это не так для предложенного запроса и структуры таблиц. В результате будут все опросы, в которых не участвовал пользователь. Если ни в одном не участвовал - все опросы.
Я уверен, что мой запрос вы изменили (что логично), но не в том месте.

PS: которая из 3 таблиц - статистика? undefined variable

Право, Вы слишком высокого мнения о себе)
У меня нет ни времени, ни смысла, ни желания спорится с Вами, милейший. По сему в кратко и по сути.
Ничего и не пришлось изменять коме <> на NOT IN в своем же посте (№ 1), что в свою очередь схоже с циклами foreach, for, while в php.
Теперь залейте все предоставленные мной таблицы и сосчитайте количество не голосованых пользователем опросов при условии, что та самая таблица статистики залита но пуста то есть, не содержит не одной записи.
Результатом выполнения ниже представленного кода при условии подстановки Вашего куска
PHP:
скопировать код в буфер обмена
  1.  
  2. echo mysql_num_rows(mysql_query(ваш код)); // возвратит 0 не глядя на то что, опросы таки имеются в ассортименте
  3.  

Но если сосчитать их с помощью подстановки моего кода - будет возвращено верное количество строк.
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. echo mysql_num_rows(mysql_query("SELECT * FROM `ac_opros` WHERE `time_end` > UNIX_TIMESTAMP() AND IF((SELECT COUNT(*) FROM `ac_opros_variant_set`) > 0, `id` NOT IN (SELECT `id_file` FROM `ac_opros_variant_set` WHERE ".(isset($user -> person)?"`id_user` = '{$user -> id}' OR ":" `open` = '1' AND")." `ip` = '".$_SERVER['REMOTE_ADDR']."'))")); // = Верное количество не голосованных опросов
  4.  
  5.  

`ac_opros` - сам вопрос и его описание,
`ac_opros_variant` - варианты ответов,
`ac_opros_variant_set` - собственно та самая статистика, которую Вы, как ни странно в упор не заметили.
Ja_kazanova Отправлено: 11 Апреля, 2013 - 15:45:12 • Тема: MySQL - вложенные запросы • Форум: Администрирование БД

Ответов: 11
Просмотров: 5585
Мелкий пишет:
Ja_kazanova пишет:
Спасибо но, JOIN(ов) я стараюсь избегать

Отчего же?
Тогда вам и подзапросы использовать никак нельзя. Некоторые подзапросы оптимизатор переписывает в join, потому что это заметно эффективнее.

От чего-же? В приведенном мною примере используется 2 под запроса + проверка на наличие записей в таблице статистики. Потому как если в выше упомянутой таблице статистики нет ни одной записи, mysql_num_rows(mysql_query(ваш код)) // = 0 в любом случае
Ja_kazanova Отправлено: 11 Апреля, 2013 - 14:42:51 • Тема: MySQL - вложенные запросы • Форум: Администрирование БД

Ответов: 11
Просмотров: 5585
Извините, решение явилось прям, как Менделееву во сне. Вот правильный код (кому интересно)
SELECT * FROM `ac_opros` WHERE `time_end` > UNIX_TIMESTAMP() AND IF((SELECT COUNT(*) FROM `ac_opros_variant_set`) > 0, `id` NOT IN (SELECT `id_file` FROM `ac_opros_variant_set` WHERE `id_user` = '{$user -> id}' OR `ip` = '{$user -> ip}'), `id` <> '0')
Благодарю все за внимание и желание помочь. Тему можно крыть)
(Добавление)
Мелкий пишет:
Ja_kazanova пишет:
что-бы пользователю выводились только вопросы на которые он еще не давал ответа.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `ac_opros`.* FROM `ac_opros` LEFT JOIN `ac_opros_variant_set` ON id_user=6432 AND `ac_opros`.id=`id_file` WHERE `id_file` IS NULL

?

Спасибо но, JOIN(ов) я стараюсь избегать
Ja_kazanova Отправлено: 11 Апреля, 2013 - 14:22:06 • Тема: MySQL - вложенные запросы • Форум: Администрирование БД

Ответов: 11
Просмотров: 5585
Доброго времени суток, уважаемые форумчане)
Я пишу модуль голосований для своего сайта. Буквально вчера мне понадобилось вывести голосования в категорию не голосованых. То есть, что-бы пользователю выводились только вопросы на которые он еще не давал ответа.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.         /*
  3.                 Таблица статистических опросов
  4.         */
  5.         CREATE TABLE IF NOT EXISTS `ac_opros`
  6.         (
  7.                 `id` SERIAL,
  8.                 `time` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Время создания',
  9.                 `time_alter` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Время        последнего изминения',
  10.                 `time_end` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Время окончания опроса',
  11.                 `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'Заголовок опроса',
  12.                 `opis` varchar(1024) NOT NULL DEFAULT '' COMMENT 'Текст описания',
  13.                 `open` SET('0', '1') NOT NULL DEFAULT '0' COMMENT 'Возможность голосовать. 0 - пользователи, 1 - пользователи и гости',
  14.                 PRIMARY KEY (`id`),
  15.                 UNIQUE KEY (`name`),
  16.                 KEY (`time`, `time_alter`, `time_end`)
  17.         ) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
  18.         /*
  19.                 Варианты ответов
  20.         */
  21.         CREATE TABLE IF NOT EXISTS `ac_opros_variant`
  22.         (
  23.                 `id` SERIAL,
  24.                 `time_alter` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Время последнего ответа',
  25.                 `id_file` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID новости',
  26.                 `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'Вариант ответа',
  27.                 PRIMARY KEY (`id`, `name`),
  28.                 FOREIGN KEY (`id_file`) REFERENCES `ac_opros` (`id`)
  29.                 ON DELETE RESTRICT ON UPDATE CASCADE
  30.         ) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
  31.         /*
  32.                 Учет ответов
  33.         */
  34.         CREATE TABLE IF NOT EXISTS `ac_opros_variant_set`
  35.         (
  36.                 `id` SERIAL,
  37.                 `id_file` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID опроса',
  38.                 `id_variant` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID варианта опроса',
  39.                 `id_user` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID голосовавшего',
  40.                 `time` bigint UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Время ответа',
  41.                 `browser` varchar(32) NOT NULL DEFAULT '' COMMENT 'Название браузера',
  42.                 `version` varchar(32) NOT NULL DEFAULT '' COMMENT 'Версия браузера',
  43.                 `ip` varchar(32) NOT NULL DEFAULT '' COMMENT 'IP голосовавшего',
  44.                 PRIMARY KEY (`id`),
  45.                 KEY (`time`, `id_user`, `ip`),
  46.                 FOREIGN KEY (`id_file`) REFERENCES `ac_opros` (`id`)
  47.                 ON DELETE RESTRICT ON UPDATE CASCADE,
  48.                 FOREIGN KEY (`id_variant`) REFERENCES `ac_opros_variant` (`id`)
  49.                 ON DELETE RESTRICT ON UPDATE CASCADE
  50.         ) ENGINE InnoDB CHARACTER SET UTF8 COLLATE utf8_general_ci;
  51.        

По мотивам ранее рассмотренных сценариев составляю запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `ac_opros` WHERE `time_end` > UNIX_TIMESTAMP() AND `id` <> IF((SELECT COUNT(*) FROM `ac_opros_variant_set`) > 0, EXISTS (SELECT `id_file` FROM `ac_opros_variant_set` WHERE `id_user` = '{$user -> id}' OR `ip` = '{$user -> ip}'), 0)


Но, возвращаемый результат более чем не коректен. То есть, убирается только один голосованый опрос, а остальные выводятся все равно. Если же убрать с вырежения EXISTS - возвращается ошибка под запроса, с EXISTS же под запрос эдентичен так, если-бы в конец добавить LIMIT 1. Но, мне нужно что-бы были исключены все опросы за которые текущий пользователь уже голосовал. Я слышал, что в MySQL уже имеются циклы такие как WHILE, LOOP и тп. Но раскрытую инструкцию по их использованию я со своим корявим г* интернетом я найти самостоятельо не могу. По этому у меня огромная прозьба, спецы, подскажите пльз с кодом и выше упомянутой литературки тоже подкиньте если есть. За ранее Вам благодарен, спасибо)
PS
Я бы мог все решить с помощью PHP но, хочется сделать все красиво и правильно, помогите, а)

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB