Я написал эту небольшую функцию несколько лет назад:
function sqlvprintf($query, $args)
{
global $DB_LINK;
$ctr = 0;
ensureConnection(); // Connect to database if not connected already.
$values = array();
foreach ($args as $value)
{
if (is_string($value))
{
$value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
}
else if (is_null($value))
{
$value = 'NULL';
}
else if (!is_int($value) && !is_float($value))
{
die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
}
$values[] = $value;
$ctr++;
}
$query = preg_replace_callback(
'/{(\\d+)}/',
function($match) use ($values)
{
if (isset($values[$match[1]]))
{
return $values[$match[1]];
}
else
{
return $match[0];
}
},
$query
);
return $query;
}
function runEscapedQuery($preparedQuery /*, ...*/)
{
$params = array_slice(func_get_args(), 1);
$results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.
return $results;
}
Это позволяет запускать операторы в однострочном C # -ish String.Format, например:
runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);
Он избегает использования типа переменной. Если вы попытаетесь параметризовать имена таблиц и столбцов, это будет терпеть неудачу, поскольку она помещает каждую строку в кавычки, которая является недопустимым синтаксисом.
ОБНОВЛЕНИЕ БЕЗОПАСНОСТИ: предыдущая версия str_replace
разрешала инъекции, добавляя токены {#} в пользовательские данные. Эта версия preg_replace_callback
не вызывает проблем, если замена содержит эти токены.
Я определил местоположение ошибки, и она была связана с полномочиями файла. После установки сервиса моя учетная запись локального пользователя не имела доступа для изменения app.exe.config файла.
инструмент, который я использовал для редактирования, не сообщал мне, что это запрещалось доступа, чтобы сохранить файл - это - блокнот ++, если кому-либо интересно - таким образом, я не мог видеть, что это не сохраняло по старому файлу конфигурации.
Решенный теперь, спасибо все.
Martin.
Когда Вы находитесь в режиме отладки, проверяют и видят, какие настройки находятся в my_exe_file_name.vshost.exe.config, Также удостоверяются, что Вы корректируете это в app.config файле. Visual Studio должна обновить заключительный файл конфигурации в Вашем мусорном ведре/папках отладки.
Возможно, вы обновляете неправильный файл конфигурации. Вы должны дважды проверить это, используя
System.Configuration.ConfigurationManager.OpenExeConfiguration(PATH_TO_CONFIG);
Обычно для Windows Services, который я пишу, я бросаю appName.exe.config файл в C:\WINDOWS\system32\
, Возможно, у Вас есть более старая версия в том каталоге, который является, где Ваш сервис получает значение, даже при том, что Вы обновили файл конфигурации в своем проекте.
Файл App.config должен быть переименован к your_exe_file_name.exe.config и помещен около EXE-файла.
Действительно ли возможно, что у Вас есть больше чем один экземпляр определенной записи RuntimeFrequency? ConfigurationManager читает файл сверху донизу и обрабатывает каждую установку индивидуально. Поэтому последнее значение RuntimeFrequency, который определяется в файле, является тем, которое это будет использовать.
, Если Вы хотите знать наверняка, если бы Ваш файл используется, я просто удалил бы или прокомментировал бы любое определение для RuntimeFrequency (скопировать/вставить, ошибки действительно происходят), и ожидайте для наблюдения ошибки приложения, когда ConfigurationManager пытается сослаться на запись в AppSettings, который не существует.