Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск по всей базе
 
 автор: Лена   (04.02.2009 в 14:30)   письмо автору
 
 

В базе 60 таблиц. Мне нужно найти, в какой из таблиц базы находится определенная фраза.
Как делаю. Считываю имена таблиц в базе - $table, считываю имена столцов в каждой таблице- $col , и потом делаю такой запрос:
$sql = "SELECT * FROM $table WHERE $col LIKE '%содержание%'";
Пишет, что не хватает памяти.
Как можно по другому сделать?

  Ответить  
 
 автор: BinLaden   (04.02.2009 в 14:40)   письмо автору
 
   для: Лена   (04.02.2009 в 14:30)
 

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

  Ответить  
 
 автор: Лена   (04.02.2009 в 16:04)   письмо автору
 
   для: BinLaden   (04.02.2009 в 14:40)
 

то есть делать это средствами SQL?

  Ответить  
 
 автор: BinLaden   (04.02.2009 в 16:12)   письмо автору
 
   для: Лена   (04.02.2009 в 16:04)
 

Наоборот вручную, просто посмотреть в том же phpMyAdmin список таблиц.

  Ответить  
 
 автор: Лена   (04.02.2009 в 16:14)   письмо автору
 
   для: BinLaden   (04.02.2009 в 16:12)
 

их 62 штуки. В них и нужно найти материал. Я думала, скриптом это будет быстрее.

  Ответить  
 
 автор: Trianon   (04.02.2009 в 14:52)   письмо автору
 
   для: Лена   (04.02.2009 в 14:30)
 

что в конечном итоге оказывается в $sql ?

А почему поиск лишь по одной БД?

  Ответить  
 
 автор: BinLaden   (04.02.2009 в 15:13)   письмо автору
 
   для: Trianon   (04.02.2009 в 14:52)
 

-

  Ответить  
 
 автор: Лена   (04.02.2009 в 16:09)   письмо автору
 
   для: Trianon   (04.02.2009 в 14:52)
 

>что в конечном итоге оказывается в $sql ?

$sql = "SELECT * FROM $table WHERE $col LIKE '%содержание%'";

$table - таблица из базы, которую получаю в цикле, когда считываю все таблицы, которые есть в базе, $col - поле таблицы, которое тоже получаю в цикле, когда считываю все поля таблицы.

>А почему поиск лишь по одной БД?
Потому что интересует наличие определенного материала в определенной БД. Есть текстовая информация, мне нужно узнать, в какую таблицу она поступает.

  Ответить  
 
 автор: BinLaden   (04.02.2009 в 16:14)   письмо автору
 
   для: Лена   (04.02.2009 в 16:09)
 

> Есть текстовая информация, мне нужно узнать, в какую таблицу она поступает.

Информация поступает не через Ваши скрипты?

  Ответить  
 
 автор: Лена   (04.02.2009 в 16:18)   письмо автору
 
   для: BinLaden   (04.02.2009 в 16:14)
 

Нет, через чужие. Если бы через мои, я бы знала, куда все складывается.

  Ответить  
 
 автор: Trianon   (04.02.2009 в 16:23)   письмо автору
 
   для: Лена   (04.02.2009 в 16:18)
 

Я бы наверное, если приспичило бы, запустил mysqldump с перенаправлением на grep.

  Ответить  
 
 автор: Trianon   (04.02.2009 в 16:21)   письмо автору
 
   для: Лена   (04.02.2009 в 16:09)
 

то есть этот оператор вызывается во вложенном цикле?

  Ответить  
 
 автор: Лена   (04.02.2009 в 16:46)   письмо автору
 
   для: Trianon   (04.02.2009 в 16:21)
 

Да, во вложенном. Как через дамп и grep сделать?

  Ответить  
 
 автор: Trianon   (04.02.2009 в 17:25)   письмо автору
 
   для: Лена   (04.02.2009 в 16:46)
 

mysqldump -hхост -uлогин -pпароль --skip-extended-insert база | grep искомое >report.txt

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

  Ответить  
 
 автор: Лена   (04.02.2009 в 23:35)   письмо автору
 
   для: Trianon   (04.02.2009 в 17:25)
 

Думала сама справлюсь, но не получается.
Я записываю в командной строке то, что вы написали, но у меня пишет: "... не является внутренней или внешней командой... " - и так при любой команде.
Где мне про это почитать?

>Только лучше эту строку в командном файле записать
где почитать, чтобы понять, что вы здесь написали.
Почему так допытываюсь: а вдруг мне когда-то придется еще что-то искать в базе.

  Ответить  
 
 автор: Trianon   (05.02.2009 в 00:05)   письмо автору
 
   для: Лена   (04.02.2009 в 23:35)
 

mysqldump.exe нужно иметь.
ну и grep.exe тоже.
либо доступным по пути, либо в том каталоге, откуда команду издаете.

Первая утилита входит в поставку сервера MySQL . Среди клиентских утилит.

Если дело у хостера происходит и сервер удаленный доступ к БД не разрешает - то же самое можно выполнить через ssh (если такой доступ разрешил хостер) - тогда все утилиты у него на сервере.

  Ответить  
 
 автор: Лена   (12.02.2009 в 16:36)   письмо автору
 
   для: Trianon   (05.02.2009 в 00:05)
 

mysqldump.exe в Денвере не было, нашла в 5 версии MySQL.
grep.exe нашла в пакете unxutils - здесь все дополнительные клиентские утилиты MySQL. Там кроме grep.exe есть еще agrep.exe и egrep.exe. Чем они отличаются, не нашла.
Если искать по такому способу, как вы предложили, получилось вот так:

C:\WebServers\usr\local\mysql5\bin>mysqldump -h localhost -u root --skip-extended-insert drupal | grep -n -i "menu"

Это без учета регистра и с указанием номера строки, в которой встречается данный паттерн.

Получилось и по-другому это сделать. Записываем дамп в файл, а дальше уже ищем в файле, сортируем и результат тоже пишем в файл:

C:\WebServers\usr\local\mysql5\bin>mysqldump -h localhost -u root --skip-extended-insert drupal>report.sql
find "menu" <report.sql | sort > nwtrade.txt 


Проблема теперь вот в чем. Если ищу слово на английском, - все нормально, если на русском, оно не ищется. Что в этом случае делают?

  Ответить  
 
 автор: Trianon   (12.02.2009 в 16:48)   письмо автору
 
   для: Лена   (12.02.2009 в 16:36)
 

Идея-то основная заключалась в том, чтобы сам дамп не создавать - он же большой как правило...
А чтобы русские слова искать, нужно эту команду в bat-файл поместить. В той же кодировке, в которой дамп формируется.
Впрочем, если кодировка 1251 , можно попробовать перекллючить её командой windows
chcp 1251

Что до источников утилит - то они у нас совпали один-в-один.

  Ответить  
 
 автор: sim5   (12.02.2009 в 17:08)   письмо автору
 
   для: Trianon   (12.02.2009 в 16:48)
 

Чуть не купился сам тоже, и посоветовал Лене это чатом. Но внимательно просмотрев саму команду, получаем:

chcp - задает номер кодовой страницы. Поддерживаемые кодовые таблицы с соответствующими странами/регионами или языками приведены в следующей таблице.
Кодовая страница Страна/регион или язык
437 США
850 Многоязыковый (латиница I)
852 Восточная и центральная Европа (латиница II)
855 Кириллица (русский)
857 Турецкий
860 Португальский
861 Исландский
863 Французский (Канада)
865 Скандинавский
866 Русский
869 Современный греческий

Команда проглатывает 1251, но вот будет ли она перключаться на эту кодировку. Навряд ли.

  Ответить  
 
 автор: Trianon   (12.02.2009 в 18:37)   письмо автору
 
   для: sim5   (12.02.2009 в 17:08)
 

Вот результат моих неглубоких проверок.
В winXP команда переключает окно консоли на 866 и на 1251 кодовую страницу.
Причем я не знаю, как вытрясти из команды списо допустимых параметров.

Правда экранная часть переключается лишь в том случае , если в свойствах окна выставлен tt-фонт Lucida console.
Более того, командой chcp 65001 экранную её часть можно переключить в кодировку utf-8 , клавиатурная сторона работает при этом непредсказуемо, но буковки на экране видны нормально.

В висте ничего не проверял, ибо не пользуюсь.

  Ответить  
 
 автор: sim5   (12.02.2009 в 18:46)   письмо автору
 
   для: Trianon   (12.02.2009 в 18:37)
 

Сама ведь DOS не работает в 1251 и не знает ее, а уж тем более UTF. Если, допустим, происходит переключение (ошибку по крайней мере меня не выдает, хотя справка говорит об ином), то что будет в результате выполнения строки командной? Если консоли важны команда и ключи ее, а что там в параметрах данных ей до... тогда должно прокатить. Вы пробовали проверять?

  Ответить  
 
 автор: Trianon   (12.02.2009 в 18:59)   письмо автору
 
   для: sim5   (12.02.2009 в 18:46)
 

Что проверять?

Проверки переключения выполнялись командами copy con файл и copy файл con

  Ответить  
 
 автор: sim5   (12.02.2009 в 19:03)   письмо автору
 
   для: Trianon   (12.02.2009 в 18:59)
 

А у меня SP3, правда с твикером, и лажа получается.

  Ответить  
 
 автор: Trianon   (12.02.2009 в 19:11)   письмо автору
 
   для: sim5   (12.02.2009 в 19:03)
 

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

  Ответить  
 
 автор: cheops   (13.02.2009 в 13:20)   письмо автору
 
   для: sim5   (12.02.2009 в 18:46)
 

>Сама ведь DOS не работает в 1251 и не знает ее, а уж тем более UTF
Собственно речь идет не об DOS, которая не имеет команды chcp, а командной строке Windows.

  Ответить  
 
 автор: cheops   (13.02.2009 в 13:18)   письмо автору
 
   для: sim5   (12.02.2009 в 17:08)
 

>Команда проглатывает 1251, но вот будет ли она перключаться на эту кодировку. Навряд ли.
Текущую кодировку всегда можно проверить, если не передавать никаких параметров. Если у вас операционная система Windows XP или выше, команда без проблем переключает кодировку на 1251.
>chcp
Текущая кодовая страница: 866
>chcp 1251
Текущая кодовая страница: 1251
>chcp
Текущая кодовая страница: 1251

  Ответить  
 
 автор: sim5   (13.02.2009 в 15:43)   письмо автору
 
   для: cheops   (13.02.2009 в 13:18)
 

Да как я понял, что можно, хотя если верить справке то нет. Дело в том, что я пытаюсь запустить rar из консоли так, после перехода на 1251 - rar не находит путей, а если прописать в 866, то все путем. Да и другая лажа получается. У меня не "чистая" винда, а с измененным интерфейсом местами, установлены твикеры, может какой либо перхватывает на себя, надо просто проверить. На команду да, ошибок не получаю.

  Ответить  
 
 автор: Лена   (13.02.2009 в 22:14)   письмо автору
37.9 Кб
 
   для: cheops   (13.02.2009 в 13:18)
 

У меня не так выходит. Прикрепила, что получается. Вместо русских букв ерунда.
А как можно командный файл написать в кодировке utf8?

  Ответить  
 
 автор: Trianon   (13.02.2009 в 22:44)   письмо автору
 
   для: Лена   (13.02.2009 в 22:14)
 

фонт для окна поставили, как я указывал?

  Ответить  
 
 автор: Лена   (14.02.2009 в 22:40)   письмо автору
 
   для: Trianon   (13.02.2009 в 22:44)
 

шрифт поставила.Это получилось.
А вот как написать командный файл в кодировке utf8(в ней составлена база) нигде не нашла, наверное, это невозможно. Получается поиск по русским словам через консоль невозможный.

  Ответить  
 
 автор: Trianon   (14.02.2009 в 22:46)   письмо автору
 
   для: Лена   (14.02.2009 в 22:40)
 

написать файл можно текстовым редактором, который умеет писать в utf8 .
К таким относится даже примитивный блокнот. Правда первую строку стоит сделать пустой.

  Ответить  
 
 автор: Лена   (14.02.2009 в 23:01)   письмо автору
 
   для: Trianon   (14.02.2009 в 22:46)
 

>Правда первую строку стоит сделать пустой.
Зачем?

  Ответить  
 
 автор: Trianon   (14.02.2009 в 23:10)   письмо автору
 
   для: Лена   (14.02.2009 в 23:01)
 

блокнот в начале файла ставит специальный признак, если Вы сохраняете файл в UTF-8 .Так называемый Byte Order Mark .
Если он окажется перед командой - он её испортит.
А если на отдельной строке - испортит только эту отдельную строку.
По хорошему его стоило бы удалить из файла.
Но в принципе, кроме сообщения "xxx" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
он ничем не грозит.

  Ответить  
 
 автор: Лена   (14.02.2009 в 23:53)   письмо автору
 
   для: Trianon   (14.02.2009 в 23:10)
 

>специальный признак
почитала, их еще называют "три невидимых байта".

Получилось. В консоли вот такое:

C:\Documents and Settings\Администратор>cd C:\WebServers\usr\local\mysql5\bin
C:\WebServers\usr\local\mysql5\bin>chcp 1251
Текущая кодовая страница: 1251
C:\WebServers\usr\local\mysql5\bin>res.bat
C:\WebServers\usr\local\mysql5\bin>п»ї
"п»ї" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
C:\WebServers\usr\local\mysql5\bin>mysqldump -h localhost -u root --skip-extende
d-insert drupal   | grep -n -i "Читать РґР°Р»РµРµ" 1>res.txt

Не понятно еще вот что. Мы переводим консоль в кодировку 1251, чтобы различать кириллицу, на которой пишется поисковая фраза. Командный файл составляем, допустим, в блокноте и сохраняем его с кодировкой utf8. Далее из консоли вызываем bat-файл, одну за другой исполняем команды, и тут в grep поисковая фраза уже в кодировке utf8. Как же тогда оболочка видит кириллицу?

  Ответить  
 
 автор: Trianon   (15.02.2009 в 00:02)   письмо автору
 
   для: Лена   (14.02.2009 в 23:53)
 

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

Но в командный файл можно было написать честно (в кодировке utf8):

пустая строка
chcp 65001
mysqldump -h localhost -u root --skip-extended-insert drupal | grep -n -i "Читать далее" 1>res.txt 
chcp 866


И тогда было бы совсем без кракозябр.

  Ответить  
 
 автор: Лена   (15.02.2009 в 00:36)   письмо автору
 
   для: Trianon   (15.02.2009 в 00:02)
 

>можно было написать честно
Так не выходит. Честность не всегда вознаграждается :)

  Ответить  
 
 автор: Trianon   (15.02.2009 в 00:42)   письмо автору
 
   для: Лена   (15.02.2009 в 00:36)
 

а если руками сперва переключить?
Опять же lucida console должна стоять!

  Ответить  
 
 автор: Лена   (15.02.2009 в 01:05)   письмо автору
 
   для: Trianon   (15.02.2009 в 00:42)
 

Я эту lucida console уже намертво себе поставила, там еще пунктик есть - "Сохранить свойства для других окон..." И все равно нет.
Я думаю, что я неправильно сохраняю пакетный файл. Открываю блокнот, вставляю ваш код, сохраняю: в имя файла дописываю расширение bat, в типе выставляю "Все файлы" и кодировка UTF8. В консоле вижу только вот это:

C:\WebServers\usr\local\mysql5\bin>п»ї
"п»ї" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
C:\WebServers\usr\local\mysql5\bin>chcp 65001
Текущая кодовая страница: 65001

Команды вообще не работают.

  Ответить  
 
 автор: Trianon   (15.02.2009 в 01:14)   письмо автору
 
   для: Лена   (15.02.2009 в 01:05)
 

Да... действительно, эта зараза 65001 тут же приводит к тому, что бат-файт прекращает работу...
Значит только руками перед запуском файла.
Но опять же - чисто для эстетики. Так смысл невелик.
Важнее кодировка самого файла.

  Ответить  
 
 автор: Лена   (15.02.2009 в 01:23)   письмо автору
 
   для: Trianon   (15.02.2009 в 01:14)
 

>Значит только руками перед запуском файла.
Руками перед запуском файла тоже не идет. Нужно отказаться от эстетики, ради производительности. Да так даже и лучше. Кто-нибудь заглянет в консоль и совершенно не поймет, что я там ищу в базе.
Спасибо вам большое за ваше терпение. Все, иду спать.

  Ответить  
 
 автор: cheops   (13.02.2009 в 22:48)   письмо автору
 
   для: Лена   (13.02.2009 в 22:14)
 

Выберите шрифт Lucida Console, Точечные шрифты не поддерживают кодировку cp1251.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования