Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте. Не могу понять как лучше, есть два сайта на одном хостинге, разные базы данных, но на одном сервере и один MySQL пользователь. Иногда один сайт передает другому таблицу (на одном актуальная информация, а другой с ним сверяется).
Если сделать select из одной, а потом циклом insert into ... хостинг говорит что скрипт слишком долго работает. Запрос типа "Insert into $DB1.$tableName select * from $DB2.$tableName" не работает, потому что сервер не дает (не пойму почему) обратится к таблице имя_базы.имя_таблицы (написал обращение в тех. поддержку, уже сутки молчат).
Посоветуйте как лучше это сделать. Может есть другие нормальные способы или только эти заставить работать???.
Неактивен
Здравствуйте.
MaxNev написал:
Если сделать select из одной, а потом циклом insert into ... хостинг говорит что скрипт слишком долго работает.
Попробуйте в файле .htaccess в той директории, где находится ваш php-скрипт (я так понял, у Вас на хостинге есть php?) добавить (или модифицировать ) строку
php_flag max_execution_time 30 (или сколько там указано).
Попробуйте побольше значение поставить.
MaxNev написал:
Запрос типа "Insert into $DB1.$tableName select * from $DB2.$tableName" не работает, потому что сервер не дает (не пойму почему) обратится к таблице имя_базы.имя_таблицы
А что значит "сервер не даёт"? Что сервер при этом пишет?
MaxNev написал:
Посоветуйте как лучше это сделать. Может есть другие нормальные способы или только эти заставить работать???.
Если у Вас есть ssh-доступ к Вашему акканту, по я бы посоветовал попробовать через mysqldump/mysqlimport.
Отредактированно deadka (24.03.2011 15:45:50)
Неактивен
По поводу дампа, довольно часто надо делать такую операцию, поэтому в ручную сложновато (сейчас так и делаем). По поводу время выполнения скрипта: да конечно полноценный хостинг с php, ssh, ... (ru-center), попробую время увеличить (сразу как то не подумал), я пробовал делать в несколько шагов, еще одна проблема:
select * ... //выбираем все
$query="insert into ... values ("; // начинаем собирать запрос
while {
$query.=... // Добавляю значения
}
...
// Выполняю запрос
Проблема ,как мне показалось, в том что в некоторых полях таблицы хранится html - код.
По поводу Insert into $DB1.$tableName select * from $DB2.$tableName, щас пособираю ошибки.
Неактивен
Я уже пытался как можно упростить скрипт, что бы найти ошибку.
Сократил до такого срипта:
<?
$WorkDB="название_первой_базы";
$SaveDB="название_второй_базы";
mysql_select_db($SaveDB); //соединение установленно выше.
$res = mysql_query('select * from $SaveDB.Cities') or die(mysql_error());
//Если вместо $SaveDB.Cities написать просто название таблицы (Cities) то все работает.
while ($row = mysql_fetch_assoc($res)) {
echo $row['CityName']."<br />";
}
получаю mysql_error()=SELECT command denied to user 'имя_пользователя'@'ip_сервера' for table 'Cities'
Права у пользователя на обе базы чтение, изменение и создание.
Отредактированно MaxNev (24.03.2011 16:15:34)
Неактивен
MaxNev написал:
Проблема ,как мне показалось, в том что в некоторых полях таблицы хранится html - код.
Трудно судить в чем ошибка, поскольку Вы не привели сам текст запроса, который сервер не хочет выполнять. Ну и show create table приведите за компанию .
Касательно переноса - можно воспользоваться таким читерством - перенести таблицу в цикле по кусочкам. То есть выбирать и вставлять данные порциями - по 100, по 1000 записей. Или выбирать по какому-то одному полю, которое имеет разные значения - просто, чтобы разбить большой запрос на подкусочки. Правда считаю, что лучше бы Вы это сделали через mysqldump/mysqlimport, честное слово .
Касательно html-кода в запросе - функция mysql_real_escape_string решит такие проблемы.
По-хорошему для избежания sql-инъекций стоит любое текстовое данное перед вставкой в базу экранировать с помощью этой функции, ну а целые числа через intval.
Неактивен
Спасибо за помощь. Сейчас буду пробовать (скорее всего начну с того, что попробую добавить mysql_real_escape_string). Я что то не до конца понимаю mysqldump/mysqlimport можно использовать из скрипта (как то автоматически что нибудь копировать)?
Неактивен
Не уверен, что rucenter разрешает своим пользователям запускать команды ОС через php .
Поэтому mysqldump/mysqlimport нужно запускать, войдя по ssh на сервер.
Попробуйте еще посмотреть в phpMyAdmin - там есть возможность снять дамп со всей базы или определенных таблиц.
Неактивен
Я немного выше писал "По поводу дампа, довольно часто надо делать такую операцию, поэтому в ручную сложновато (сейчас так и делаем)."
Неактивен
MaxNev написал:
$res = mysql_query('select * from $SaveDB.Cities') or die(mysql_error());
В данном случае надо испол'зоват' двойные кавычки, чтобы ПХП подставил переменную. А еше лучше обернут' ее в фигурные скобки, чтобы он не истал поля "Cites" в об'екте "$SaveDB".
$res = mysql_query("select * from {$SaveDB}.Cities") or die(mysql_error());
Покажите запрос: INSERT SaveDB SELECT FromDB и ошибку на него.
Все таки он правил'нее, чем верхний вариант.
Как пример соберите запрос в переменную и ее выводите на экран/консоль/файл.
В готовом результате будет видно ошибку.
Отредактированно vaspet (25.03.2011 12:16:07)
Неактивен
Страниц: 1