Помимо глупого вопроса, на который можно ответить, просто прочитав страницу руководства, существует гораздо более важная проблема:
Будет ли функция safe
правильно обрабатывать инъекции SQL?
Нет.
Поскольку функция safe()
в основном не делает ничего, кроме применения mysql_real_escape_string к переданному аргументу, она не должна называться таким образом.
Потому что применение mysql_real_escape_string не имеет ничего общего с инъекциями или безопасностью вообще.
По крайней мере эта функция должна добавлять кавычки вокруг переданного значения в дополнение к экранированию. Это сделает некоторые запросы ошибочными, но, по крайней мере, безопасными.
Есть ли способ написать удобную функцию, например, вышеупомянутую строку, при этом убедитесь, что все переменные, помещенные в безопасную функцию, правильно экранированы.
Конечно.
Используйте заполнители.
$rs = getrs($dbh,"select firstname,lastname from users where userid=?",$uid);
Пользовательский обработчик заменит заполнитель ?
на безопасно подготовленное значение.
Вот функция, которую я написал давным-давно с тем же намерением, что и у вас, но более разумный, с учетом безопасности и простоты использования.
Это, безусловно, не идеально - нет необходимости вводить символы %
непосредственно в запрос, так как он использует синтаксис printf. И у него нет заполнителя для идентификаторов (как и многих других удобных заполнителей). И, конечно, реализация ООП была бы намного более гибкой, имея аккуратные отличные методы вместо уродливой переменной «mode».
Но если вы хотите функцию
function dbget() {
/*
usage: dbget($mode, $query, $param1, $param2,...);
$mode - "dimension" of result:
0 - resource
1 - scalar
2 - row
3 - array of rows
*/
$args = func_get_args();
if (count($args) < 2) {
trigger_error("dbget: too few arguments");
return false;
}
$mode = array_shift($args);
$query = array_shift($args);
$query = str_replace("%s","'%s'",$query);
foreach ($args as $key => $val) {
$args[$key] = mysql_real_escape_string($val);
}
$query = vsprintf($query, $args);
if (!$query) return false;
$res = mysql_query($query);
if (!$res) {
trigger_error("dbget: ".mysql_error()." in ".$query);
return false;
}
if ($mode === 0) return $res;
if ($mode === 1) {
if ($row = mysql_fetch_row($res)) return $row[0];
else return NULL;
}
$a = array();
if ($mode === 2) {
if ($row = mysql_fetch_assoc($res)) return $row;
}
if ($mode === 3) {
while($row = mysql_fetch_assoc($res)) $a[]=$row;
}
return $a;
}
?>
Вы можете добавить свой $ dbh к его вызову, но я не вижу в этом смысла.
есть ли в PHP функция, передающая $ dbh, которая сообщает вам, является ли она дескриптором mysql или mssql
Абсолютно бессмысленно иметь такую функцию.
Когда нужно использовать обработчик базы данных, он, очевидно, должен знать, к какому драйверу базы данных он принадлежит.
Ой. И я надеюсь, что вы не собираетесь использовать mysql_real_escape_string с ms sql.