#php #variables #mysqli
#php #переменные #mysqli
Вопрос:
Я не уверен, возможно ли это. вот что у меня есть
if ($_REQUEST[db]=="abcd"){
$result =$abcdsqli->query("SELECT * FROM ...");
}elseif ($_REQUEST[db]=="efgh"){
$result =$efghsqli-> ...
}
вот что я хочу
$result =$.$_REQUEST[db].sqli->query("SELECT * FROM ...");
Комментарии:
1. Почти каждый раз, когда вам нужны переменные переменные в вашем коде, вы, вероятно, совершаете ошибку. Попробуйте переосмыслить то, что вы делаете, используя массивы.
2. на самом деле это не переменная переменная, я пытаюсь создать имя объекта ИЗ переменной, чтобы я мог использовать объект.
Ответ №1:
Зачем вам нужно так много mysqli
объектов?
И использование $_RESQUEST
в вашем коде такого открытого типа может привести к множеству взломов на вашем сайте.
Просто используйте один (один [1]) объект mysqli.
Я советую НЕ ИСПОЛЬЗОВАТЬ ЭТО, но это то, что вы хотите:
$sql = "{$_REQUEST['db']}sqli";
$$sql->query("SELECT * FROM ...");
Так что, если $_REQUEST['db'] == 'abc'
бы это делало:
$abcsqli->query("SELECT * FROM ...");
Комментарии:
1. я использую несколько объектов mysqli, потому что я выбираю из нескольких баз данных в моей частной панели администратора, которая показывает статистику по 4 разным веб-сайтам. я обнаружил, что мне нужно переключать базы данных во время оператора mysqli while для сравнения данных с другим веб-сайтом.. итак, я пытаюсь так
2. Мы постоянно используем несколько dbo (объектов базы данных). Я думаю, что ключ db — это просто флаг для его приложения, чтобы определить, какой dbo использовать для запроса.
3. @JohnnyCraig отлично, это нормально. вы не указали это в своем вопросе. но использование
$_REQUEST
для этого оставляет вас очень открытыми для хакеров.4. я бы сделал это частью своего поста, если бы считал, что это имеет отношение к вопросу и / или ответу.
5. @johnny: один дескриптор БД может запрашивать несколько БД :
SELECT tablename.fieldname FROM dbname.tablename.fieldname ...
. Пока идентификатор пользователя, с которым вы подключились, имеет соответствующие права, вам не нужно несколько дескрипторов.
Ответ №2:
Ваш вопрос идеально подходит для заводского шаблона с использованием синглтона. Этот код является скелетным, что означает, что проверка 0 и т. Д., Но Должна дать вам представление.
class Database
{
private static $dbos = array();
public static function getDbo($dboKey)
{
if (!isset(self::$dbos[$dboKey])) {
switch ($dboKey) {
case 'abcd':
$dbo = new mysqli('localhost', 'my_user', 'my_password', 'my_db_1');
break;
case 'efgh':
$dbo = new new mysqli('localhost', 'my_user', 'my_password', 'my_db_2');
break;
}
self::$dbos[$dboKey] = $dbo;
}
return self::$dbos[$dboKey];
}
}
$result = Database::getDbo($_REQUEST[db])->query("SELECT * FROM ...");
Комментарии:
1. будет ли это создавать новый объект mysqli, если его нет? и если она есть, она вернет объект, чтобы я мог его использовать? это хорошая функция
2. Вы поняли. Фабрика — это алгоритм черного ящика, который возвращает известный объект на основе минимального ввода, что и происходит. Когда вы передадите ей ключ, он укажет фабрике, как создать объект, и вернет его.
3. каково точное «имя» для этого типа функциональности? Я хотел бы узнать об этом больше и посмотреть, как я могу применить это к другим вещам. Я всегда знал, что есть что-то, что работает таким образом, но не знал, как найти это без имени.
4. Установка статического параметра, в котором хранятся значения и который используется таким образом, называется «синглтоном». Метод
getDbo()
следует шаблону проектирования фабрики.5. я ценю ваше время. я рад реализовать это. я отправил вам несколько пунктов