У меня есть эта функция в моем классе базы данных.Он принимает 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 ''
в моих запросах (если я уже положил квоты во входной запрос ...). - что вы думаете о функции?хороший способ сделать это?