Есть проблемы с этим классом Mysql Helper? - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть эта функция в моем классе базы данных.Он принимает 3 параметра:

  • Запрос
  • на сервер для его выполнения, который идентифицируется по имени, которое хранится в конфигурации
  • массив аргументов, которыецитируется в запросе sql

пример вызова:

$toplist = MyDbClass->q('SELECT * FROM movies WHERE score > ?','slaveserver1',array(100));

вот код ...

/*
 * @param the sql query. may be pure sql or having ? as placeholders for variables that are passed in the 3rd param, not enquoted
 * @param name of the link (slave or master server or other arbitrary database)
 * @param optional array of vars that will be filled in where the ? signs in the query are
 */
public function q($sql,$name,$vars=false) {
    // lets see if the link to the server with name $name has already been initialised, if not lets do it
    if(!isset($this->links[$name])) {
        $this->initialize($name);
    }
    // if variables have been passed, lets fill them into the query
    if($vars !== false) {
        // first real scape them all according to the correct link
        for($i=0;$i<count($vars);$i++) {
            $vars[$i] = mysql_real_escape_string($vars[$i],$this->links[$name]);
        }
        // now escape all actual % signs so they are not used as placeholders vor vsprintf
        $sql = str_replace('%','%%', $sql);
        // no add '' quotes arround every placeholder and fill in
        $sql = str_replace('?','\'%\'', $sql);
        $sql = vsprintf($sql,$args);
    }
    // now execute the parsed query on the correct server
    return mysql_query($sql,$this->links[$name]) or die(mysql_error($this->links[$name]));
}

Теперь мои вопросы:

есть ли проблемы с моим кодом?особенно:

  • есть ли случаи, когда использование кавычек '' вокруг аргументов в запросе может сделать его неработоспособным?
  • есть какой-то элегантный способ предотвратить завершение моей функциис двойными кавычками, такими как where score > ''100 '' в моих запросах (если я уже положил квоты во входной запрос ...).
  • что вы думаете о функции?хороший способ сделать это?

1 Ответ

0 голосов
/ 08 ноября 2010

Я не думаю, что разрешить одному классу манипулировать несколькими SQL-соединениями - хорошая идея.Каждому экземпляру этого класса должно быть разрешено использовать только одно соединение SQL.Или, если вы пытаетесь реализовать какую-то ручную балансировку нагрузки, это должно быть прозрачно использовано пользователем, возможно, допускаются только варианты «ведомый» и «ведущий».

Возможно, вам следует разделить ваши запросы на запросы "read" и "write", потому что вы можете "читать" с любого ведомого, но должны "писать" на все из них.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...