объектная переменная mysqli из ключа запроса

#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. я ценю ваше время. я рад реализовать это. я отправил вам несколько пунктов