На тестовой площадке сделал копию текущего сайта.
На работающей площадке apache, тут nginx.
Один модуль использует не основную базу данных, а вторую.
Для этого у меня в коде формирования блока написано:
<?php
..
db_set_active('baza2');
..
db_set_active('default');
..
?>
При попытке открыть сайт выводится куча сообщений об ошибке наподобие:
query: INSERT INTO watchdog
(uid, type, message, variables, severity, link, location, referer, hostname, timestamp)
VALUES
(4, 'php', '%message in %file on line %line.', 'a:4:{s:6:\"%error\";s:12:\"user warning\";s:8:\"%message\";s:108:\"Table &#039;baza2.menu_custom&#039; doesn&#039;t exist\nquery: SELECT * FROM menu_custom ORDER BY title\";s:5:\"%file\";s:50:\"/путь/к/друпал/modules/menu/menu.module\";s:5:\"%line\";i:449;}', 3, '', 'http://10.5.12.18:8080/', 'http://10.5.12.18:8080/admin/build', '10.1.21.49', 1288166104) in /путь/к/друпал/includes/database.mysql.inc on line 139
Если комментирую строчку db_set_active('baza2'); (и все обращения к этой базе)
то ошибок нет. Я даже оставлял только строчки
<?phpdb_set_active('baza2');
db_set_active('default');
?>
ошибки все равно появляются.
Попробовал вывести тестовую информацию.
оказалось что ошибки выводятся после
db_set_active('default');
Комментарии
Еще может зависеть от того где ты вообще это вызываешь.
А апач или nginx без разницы
<?php
function mymodule_block($op='list', $delta=0) {
if (
$op == "list") {$block = array();
$block[0]["info"] = '';
return $block;
}
else if ($op == 'view') {
switch ($delta) {
case 0:
$block['subject'] = '';
$block['content'] = _mymodule_makehtml();
break;
}
return $block;
}
}
function
_mymodule_makehtml() {$out = '';
_mymodule_getdata();
...
return $out;
}
function
_mymodule_getdata() {...
db_set_active('baza2');
db_set_active('default');
...
}
?>
В settings.php следующее пишу:
<?php
$db_url['default'] = 'mysql://user1:abc123@localhost/mysite';
$db_url['baza2'] = 'mysql://user1:abc123@localhost/baza2';
?>
Единственное что смущает в settings.php - то, что на тестовой площадке у меня обе базы находятся на одном хосте и доступ к ним есть у одного пользователя. На рабочей площадке они на разных хостах.
Кроме того, и там и там настроены постоянные соединения с базой данных - хакнут includes/database.mysql.inc.
Ну вот и ищи причины в своих хаках, будешь знать как модули хакать.
PS. +1 убитый котенок на твоей совести (вытираю руки от еще теплой крови).
Да когда ж ты маны читать то начнёшь-то?
А это врядли котейка, строки конекта внимательный посмотри и вспомни особенность работы слоя БД
Если БД на одном серванте то все у Уарабъюхи нормально написано, а вот модули хакать низзя :).
Хотя не, Уарабей, ты опять тут врёшь?
И там локалхост и там, а ты говоришь что базы на разных сервантах
Ну угадывать что там в хаке написано у мну нет ни желания ни времени
У меня хрустального шара...
На рабочей - на разных. На тестовой - на одном(localhost). Ошибки возникают только на тесовой площадке.
Трабла действительно в хакнутом файле.
Различие моего database.mysql.inc и оригинального в следующем
+++ d2.inc 2010-10-28 09:24:17.000000000 +0600
@@ -13,17 +13,7 @@
// Include functions shared between mysql and mysqli.
require_once './includes/database.mysql-common.inc';
-global $db_mysql_temporary;
-if(!isset($db_mysql_temporary) ) $db_mysql_temporary = array();
-function db_shutdown_unlock_tables(){
- global $db_mysql_temporary;
- db_query('UNLOCK TABLES');
- db_set_active('default');
- db_query('UNLOCK TABLES');
- if(is_array($db_mysql_temporary) && count($db_mysql_temporary) )
- foreach($db_mysql_temporary as $table) db_query('DROP TEMPORARY TABLE ' . $table);
-}
-register_shutdown_function('db_shutdown_unlock_tables');
+
/**
* Report database status.
*/
@@ -84,8 +74,7 @@ function db_connect($url) {
// server.
// - 2 means CLIENT_FOUND_ROWS: return the number of found
// (matched) rows, not the number of affected rows.
- // $connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE, 2);
- $connection = [user=mysql_pconnect]mysql_pconnect[/user]($url['host'], $url['user'], $url['pass'], 2);
+ $connection = [user=mysql_connect]mysql_connect[/user]($url['host'], $url['user'], $url['pass'], TRUE, 2);
if (!$connection || !mysql_select_db(substr($url['path'], 1))) {
// Show error screen otherwise
_db_error_page(mysql_error());
@@ -286,11 +275,10 @@ function db_query_range($query) {
* correctly.
*/
function db_query_temporary($query) {
- global $db_mysql_temporary;
$args = func_get_args();
$tablename = array_pop($args);
array_shift($args);
- $db_mysql_temporary[$tablename] = $tablename;
+
$query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE '. $tablename .' Engine=HEAP SELECT', db_prefix_tables($query));
if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
$args = $args[0];
Ну не представляю я, что здесь может быть не так .. Раз вы такие гуру, то скажите.