Невыгодный misc php do. Обожай его шарм, обаяние

04.02.2019

После прочтения вашего разъяснения у меня создается впечатление, что вы действительно хотите запросить таблицы, находящиеся в двух отдельных экземплярах сервера MySQL. По крайней мере, ваш текст разъяснения:

SELECT foreign_db.login.username, firstname, lastname from foreign_db.login, пользователь, где

предполагает, что вы хотите запустить один запрос во время входа в систему как два пользователя (которые могут или не могут находиться на одном экземпляре сервера mysql).

В вашем вопросе вы сказали, что хотите запрашивать данные из двух разных баз данных, но важно понимать, что один экземпляр MySQL может иметь множество многих баз данных. Для нескольких баз данных, управляемых одним и тем же экземпляром mysql, решение, предлагаемое в вопросе, к которому вы привязаны, просто работает: просто префикс имени таблицы с именем базы данных, разделяя имена базы данных и таблицы точкой: . .

Но, как я заметил, это работает только если:

  • все базы данных, к которым вы обращаетесь в одном запросе, находятся на одном сервере, то есть управляются одним и тем же экземпляром MySQL
  • Пользователь, подключенный к базе данных, имеет права доступа к обеим таблицам.

Сценарий1: базы данных на том же хосте: предоставить привилегии apopriate и определить имена таблиц

Например, GRANT SELECT ON sakila.film TO "test"@"%" позволит пользователю test@% выбирать данные из таблицы film в базе данных sakila . После этого пользователь может ссылаться на эту таблицу, используя sakila.film (так называемое имя квалифицированной таблицы), или если текущая база данных установлена ​​на sakila , просто как film

Сценарий2: базы данных, управляемые разными экземплярами MySQL: FEDERATED engine

Например, если вы знаете, что эта таблица содержится в базе данных misc на удаленном хосте:

CREATE TABLE t (id int not null primary key , name varchar(10) not null unique)

вы можете сделать локальный "указатель" на эту удаленную таблицу, используя следующую команду:

CREATE TABLE t (id int not null primary key , name varchar(10) not null unique) ENGINE = FEDERATED CONNECTION="mysql://@:/misc/t";

К сожалению, движок FEDERATED не всегда доступен, поэтому сначала нужно проверить, можете ли вы его использовать. Но предположим, что это так, тогда вы можете просто использовать локальную таблицу t в своих запросах, как и любую другую таблицу, а MySQL будет связываться с удаленным сервером и выполнять соответствующие операции на физической таблице с другой стороны.

Предостережение: существует несколько проблем оптимизации с таблицами FEDERATED. Вы должны выяснить, и в какой степени это относится к вам. Например, применение WHERE к объединенной таблице может во многих случаях приводить к тому, что содержимое всей таблицы перетаскивается по проводу на ваш локальный сервер, где будет использоваться фактическая фильтрация. Другая проблема заключается в создании таблиц: вы должны быть уверены, что определения объединенной таблицы и таблицы, которые она указывает, соответствуют точно, за исключением предложения ENGINE (и CONNECTION). Если у вас есть, например, другой набор символов, данные могут прибыть полностью искаженными после перемещения по проводу.

Если вы хотите использовать таблицы FEDERATED , прочитайте эту статью http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html , чтобы решить, имеет ли право на ваш конкретный случай использования,

Сценарий3: нельзя использовать FEDERATED, но таблицы в разных экземплярах MySQL

Наконец, если у вас есть таблицы в разных экземплярах MySQL, но почему-то не можете использовать механизм объединения в виде таблицы, из-за вашей неудачи я боюсь. Вам просто придется выполнять запросы на оба экземпляра MySQL, получать результаты и делать с ними что-то интеллектуальное в PHP. в зависимости от ваших точных требований, это может быть вполне жизнеспособным решением.

Думаю, вам нужно решить, какая часть моего ответа лучше всего подходит для вашей проблемы, и добавьте комментарий, если вам понадобится дополнительная помощь. TIA Roland.

0. ВСТУПЛЕНИЕ

Меня зовут Андрей, ник Andrey-T Данный форум сайт является моей личной собственностью. Я крайне негативно отношусь к неадекватным личностям и просто удаляю их со своего форума. Чтобы этого не произошло с Вами, пожалуйста, прочтите нижеприведенные правила. Если же они Вас чем-то не устраивают, просьба покинуть сайт. Если все в порядке - жму Вашу руку и добро пожаловать.
Благодарю.

I. РЕГИСТРАЦИЯ

1. Разрешено использовать в имени пользователя только английские и русские буквы, а также цифры.

2. Запрещается:
a. регистрироваться с бессмысленными никами типа qwertyuiop, poiuyt, никами состоящими из одних только цифр.
b. использовать в нике нецензурные слова, адреса сайтов, адреса email и т.п.
c. регистрация ников типа Админ, Модер, Главный и т.д.
d. создание клонов (несколько аккаунтов принадлежащих одному пользователю).

Данные аккаунты считаю неуважением к себе и к посетителям и удаляю без предупреждения.

II. ОБЩИЕ ПОЛОЖЕНИЯ

1. Форум является модерируемым, администрация следит за обсуждением и при необходимости вмешивается в его ход. Основой для модерирования является формальный контроль за соблюдением настоящих правил, однако действия модератора могут выходить за рамки формального контроля - его задача состоит в том, чтобы руководствуясь своим здравым смыслом и опытом обеспечить всем участникам возможность эффективного ведения дискуссии.

2a. Если вы не согласны с действиями модератора, его реакцией на нарушения правил, пониманием задач форума и т.п. и не пришли с ним к взаимопониманию путем общения через личные сообщения или другим образом, вы можете сообщить об этом Администратору ([email protected]) без согласования с модератором, или покинуть форум.

2b. Если вы не согласны с действиями Администратора, его реакцией на нарушения правил, пониманием задач форума и т.п., то вам лучше покинуть форум, так как жаловаться на него некому - это его личный форум с его правилами игры.

3. Темы, тексты, какие-либо другие элементы, размещенные на форуме принадлежат как создателю, так и форуму и могут свободно копироваться, издаваться и использоваться с согласия администрации форума или создателя.

3a. Создатель или посетитель темы не имеет право исполнять в ней модераторские функции и решать кому и что можно в ней делать, кроме случая, когда создавший сам является Модератором этого раздела.

3b. Администрация форума не удаляет, по просьбе участников, их аккаунты, созданные ими темы (особенно если в данных темах уже имеются ответы других участников), сообщения и прочий материал, выложенный ими на форуме.

4. Администрация сайта вправе изменять правила по своему усмотрению.

1. Перед началом дискуссий, (созданием тем или написанием сообщений), "полистать" страницы Форума с целью лучшего знакомства с участниками, подразделами Форума и их тематикой, существующими темами и обзорами, в том числе - с обсуждаемой тематикой по разделам и с "неписаными" правилами и традициями форума.

2. До того, как задать проблемный вопрос - воспользоваться функцией "поиск" и ознакомиться с глубиной "проработки" проблемы. (Форум существует с 2006 года и, возможно, Ваша проблема уже давно решена, или, наоборот - пока (или вообще) неразрешима).

3. Составлять заголовок своего сообщения так, чтобы он отражал смысл сообщаемого (запрашиваемого), но не эмоции или ваши мнения;
Не использовать односложные заголовки, как то: "Спасите", "Помогите", "Нужна помощь!", "Вопрос", "Help Me".
Эти темы, или им аналогичные, будут удаляться без предупреждения. В случае рецидива будет удален вопрошающий.

5. Цитировать собеседника минимально или не цитировать, если ваше сообщение идет следующим.
Множественные повторы одного и то же, тем более на одной и той же странице излишни и засоряют форум.
За подобное нарушение, Вы получите предупреждение от модератора, в случае рецидива - бан.

6. Сообщения личного характера, частные дискуссии - малополезные или бесполезные для других участников (флейм) - переносить в режим "приват-общения" (ПМ) или использовать электронную почту.
За подобное нарушение, Вы получите предупреждение от модератора.

7. Используйте кириллицу для написания своих сообщений.

8. Писать сообщения только заглавными буквами не рекомендуется.

IV. ЗАПРЕЩАЕТСЯ

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

3. Регистрация более одного аккаунта на одного человека. Если забыли пароль, обратитесь ко мне.
Наказание: бан

4. Распространение заведомо ложной информации, вирусов (злонамеренных програм, троянов).
Наказание: бан

5. Флуд: многократный постинг одинаковых или слабоотличающихся сообщений; 3 и больше сообщения подряд (пользуйтесь кнопкой "Редактировать"); постинг, состоящий из смайликов или отражающий только эмоции; бессмысленные сообщения; апканье (up), с целью вывести тему на первую страницу; и прочий спам.

6. Использование в сообщениях файлов и изображений большого размера (не более 600 по длинной стороне) и "веса" (не более 195 кб.), а также изображений, не имеющих никакого отношения к теме. Использования в сообщении чрезмерно больших шрифтов и ярких цветов, мешающих чтению.
Наказание: предупреждение от модератора, в случае рецидива - бан.

7. Использование в подписи изображений большого размера и "веса". Разрешенный размер не более 400x60px, 30Kb, jpg/gif. Разрешено использовать только одно изображение. Его содержание не должно отвлекать внимание от сообщения.
Наказание: предупреждение от модератора, в случае рецидива - бан.

8. Использование аватара большого "веса". Разрешенный размер не более 30Kb, jpg/gif.
Наказание: предупреждение от модератора, в случае рецидива - бан.

9. Использование в подписи фраз:
- содержащих нецензурные или оскорбительные слова;
- более пяти строк;
- использование тегов большого размера и яркого цвета, отвлекающих внимание от основного сообщения
Наказание: предупреждение от модератора, в случае рецидива - бан.

10. Публичное обсуждение правил форума, администрации или её действий. Понижение модератору репутации в отместку за наказание.
Наказание: бан.

11. Вопросы "Почему наказали/забанили/лишили права слова?" принимаются только от самих наказанных через [email protected] или ПМ. Принимаются только после повторного прочтения данных правил и уяснением для себя, что ни один пункт действительно не нарушен. В противном случае писать просто бесполезно. Не рекомендуется другим лицам, беспокоящимся за наказанного, задавать на форуме вышеуказанный вопрос. Если вам действительно интересно - спросите у него самого.
Наказание: предупреждение от модератора, в случае рецидива - бан.

12. Передача на форум сообщений от забаненных. Если бы я хотел, чтобы человек продолжал здесь писать - я бы его не удалял. Предоставляя ему свой аккаунт, вы даете согласие на то, что к вам будет применено такое же наказание.
Наказание: бан.

13. Создавать топики в форумах другой тематики. Например, запрещено задавать вопросы о Подготовке автомобиля в рубрике " Новости "
Наказание: предупреждение от модератора, в случае рецидива - бан. Темы, созданные не в тех разделах, в которых они должны были бы быть, будут удалены.

14. Размещение прямых (активных ссылок на сторонние ресурсы).
Наказание: предупреждение от модератора, в случае рецидива - бан. С последующим удалением темы.

ПРИМЕЧАНИЯ

Что такое Бан?
- полное закрытие доступа к форуму. Пользователь не может ни читать, ни писать. Применяется при серьезном или неоднократном нарушении правил.

Меня наказали, что делать?
Изучить еще раз правила и решить согласны ли вы с ними. Если да, то дождаться окончание срока наказания. Если нет - покинуть форум.
Бесполезно писать модератору и просить снять наказание. Если вы всё же пишете, то значит эти правила вы не прочли или не согласились с ними - будьте готовы, что ваше наказание увеличится.

The bzip2 command line tool from Redhat:

Win2k Sp2 users grab the latest version 1.0.2, all other Windows user should grab version 1.00. After downloading rename the executable to bzip2.exe. For convenience put it into a directory in your path, e.g. C:\Windows where C represents your Windows installation drive.

Note: lang stands for your language and x for the desired format, e.g.: pdf. To uncompress the php_manual_lang.x.bz2 follow these simple instructions:

  • open a command prompt window
  • cd to the folder where you stored the downloaded php_manual_lang.x.bz2
  • invoke bzip2 -d php_manual_lang.x.bz2, extracting php_manual_lang.x in the same folder

In case you downloaded the php_manual_lang.tar.bz2 with many html-files in it, the procedure is the same. The only difference is that you got a file php_manual_lang.tar. The tar format is known to be treated with most common archivers on Windows like e.g. » WinZip .

What does & beside argument mean in function declaration of e.g. asort() ? How do I deal with register_globals ?

For information about the security implications of register_globals , read the security chapter on Using register_globals .

It"s preferred to use superglobals , rather than relying upon register_globals being on.

If you are on a shared host with register_globals turned off and need to use some legacy applications, which require this option to be turned on, or you are on some hosting server, where this feature is turned on, but you would like to eliminate security risks, you might need to emulate the opposite setting with PHP. It is always a good idea to first ask if it would be possible to change the option somehow in PHP"s configuration, but if it is not possible, then you can use these compatibility snippets.

Example #1 Emulating Register Globals

This will emulate register_globals On. If you altered your variables_order directive, consider changing the $superglobals accordingly.

// Emulate register_globals on

$superglobals = array($_SERVER , $_ENV ,
$_FILES , $_COOKIE , $_POST , $_GET );
if (isset($_SESSION )) {

}
foreach ($superglobals as $superglobal ) {
extract ($superglobal , EXTR_SKIP );
}
}
?>

This will emulate register_globals Off. Keep in mind, that this code should be called at the very beginning of your script, or after session_start() if you use it to start your session.

// Emulate register_globals off
function unregister_GLOBALS ()
{
if (! ini_get ("register_globals" )) {
return;
}

// Might want to change this perhaps to a nicer error
if (isset($_REQUEST [ "GLOBALS" ]) || isset($_FILES [ "GLOBALS" ])) {
die("GLOBALS overwrite attempt detected" );
}

// Variables that shouldn"t be unset
$noUnset = array("GLOBALS" , "_GET" ,
"_POST" , "_COOKIE" ,
"_REQUEST" , "_SERVER" ,
"_ENV" , "_FILES" );

$input = array_merge ($_GET , $_POST ,
$_COOKIE , $_SERVER ,
$_ENV , $_FILES ,
isset($_SESSION ) && is_array ($_SESSION ) ? $_SESSION : array());

Foreach ($input as $k => $v ) {
if (! in_array ($k , $noUnset ) && isset($GLOBALS [ $k ])) {
unset($GLOBALS [ $k ]);
}
}
}

Unregister_GLOBALS ();

?>

8 years ago

If you only needed register_globals for get/post variables, the effictive solution for 5.3 is:
import_request_variables("GPC", "");

But if the skripts relied on session_register() you"ll have to do more:
- Replace all variables that appeared after session_register with _SESSION equivalents - so $myvar becomes $_SESSION["myvar"]
- Take care if your variables appeared inside strings - "Hello $user !" works, but "Hello $_SESSION["user"] !" not - so you have to concatenate the string: "Hello ".$_SESSION["user"] ." !"
- Session variables in function declarations (for whatever purpose) will not work - keeping the old (local) names will work in most cases.
- Finally, replace the session_register(..) line with session_start()

13 years ago

Regarding simulating register_globals = off, note that it is impossible to adequately prevent $_SESSION variables from being globalised, as the array (and thus the globals) are created on a call to session_start(). You would therefore have to "undo" this when you start a session as using it at the start of your script will have no effect.

To avoid potential problems, use a prefix that is unique for all session variables (e.g. "SESS_"), and only access them via the $_SESSION array. The prefix ensures that you don"t have a naming clash (and therefore a security risk) with any non-session globals.

13 years ago

Considering the comment below. I think there"s a way to avoid that "problem":

//
// $starttime is an example of a variable that we might need to define,
// even before, running the "register_globals OFF" emulator below.
list($msec , $sec ) = explode (" " , microtime ());
$starttime = ((float) $msec + (float) $sec );

//
// If register_globals is ON, ensure no unexpected globals are defined.
// ie. We"ll try to emulate a register_globals OFF environment.
if((bool)@ ini_get ("register_globals" ))
{
$superglobals = array($_ENV , $_GET , $_POST , $_COOKIE , $_FILES , $_SERVER );
if(isset($_SESSION ))
{
array_unshift ($superglobals , $_SESSION );
}
$knownglobals = array(
//
// Known PHP Reserved globals and superglobals:
"_ENV" , "HTTP_ENV_VARS" ,
"_GET" , "HTTP_GET_VARS" ,
"_POST" , "HTTP_POST_VARS" ,
"_COOKIE" , "HTTP_COOKIE_VARS" ,
"_FILES" , "HTTP_FILES_VARS" ,
"_SERVER" , "HTTP_SERVER_VARS" ,
"_SESSION" , "HTTP_SESSION_VARS" ,
"_REQUEST" ,

//
// Global variables used by this code snippet:
"superglobals" ,
"knownglobals" ,
"superglobal" ,
"global" ,
"void" ,

//
// Known global variables defined before this code snippet is reached.
"starttime" ,
);
foreach($superglobals as $superglobal )
{
foreach($superglobal as $global => $void )
{
if(! in_array ($global , $knownglobals ))
{
unset($GLOBALS [ $global ]);
}
}
}
}
?>

Note the stuff related to the $_SESSION array depends on whether the PHP session has been started or not. You might want to call session_start() before this point (or set session.auto_start ON).