2009-09-08 2 views
1

У меня есть класс команд, который аббревиатура почти всех конкретных функций базы данных (у нас есть точно такое же приложение, запущенное на Mssql 2005 (с использованием ODBC и собственной библиотеки mssql), MySQL и Oracle. Но иногда у нас были некоторые проблемы с нашими подготовить метод, который, при выполнении, заменяет все заполнители с их соответствующими значениями Но проблема в том, что я использую следующее:.Решение preg_replace для подготовленных операторов

if(is_array($Parameter['Value'])) 
{ 
    $Statement = str_ireplace(':'.$Name, implode(', ', $this->Adapter->QuoteValue($Parameter['Value'])), $Statement); 
} 
else 
{ 
    $Statement = str_ireplace(':'.$Name, $this->Adapter->QuoteValue($Parameter['Value']), $Statement); 
} 

проблема возникает, когда мы имеем два или мерный подобные имена параметров, Например, session_browser и session_browse_version ... Первый будет частично заменен последним.

Курс мы научились обсуждать параметры в определенном порядке, но теперь, когда у меня есть «свободное» время, я хочу сделать это лучше, поэтому я думаю о переключении на preg_replace ... и мне нехорошо регулярное выражение, может ли кто-нибудь помочь с регулярным выражением, чтобы заменить строку, например ': parameter_name`?

С наилучшими пожеланиями, Bruno B B Magalhaes

ответ

2

Вы должны использовать \bmetacharacter, чтобы соответствовать слово границы, так что вы не случайно совпадают краткое имя параметра в пределах более длинного имени параметра.

Кроме того, вам не нужно специальных случаев массивов, если вы принуждать скалярное значение в массив одной записи:

preg_replace("/:$Name\b/", 
    implode(",", $this->Adapter->QuoteValue((array) $Parameter['Value'])), 
    $Statement); 

Заметим, однако, что это может сделать ложные положительные матчи, когда идентификатор или строковый литерал содержит шаблон, который выглядит как параметр заполнитель:

SELECT * FROM ":Name"; 

SELECT * FROM Table WHERE column = ':Name'; 

Это становится еще более сложным, когда в кавычках идентификаторов и строковые литералы могут содержать кавычки экранированы.

SELECT * FROM Table WHERE column = 'word\':Name'; 

Вы можете пересмотреть вставляя переменные в строки SQL во время подготовки, потому что вы побеждая любые преимущества подготовленных заявлений в отношении безопасности или производительности.

Я понимаю, почему вы делаете то, что делаете, потому что не все базовые функции RDBMS поддерживают именованные параметры, а также параметры SQL не могут использоваться для списков значений в предикате IN(). Но вы создаете ужасно просачивающуюся абстракцию.

+0

Вы потеряли меня долгое время, но немного исследований и Google, вы имеете смысл :) – Val

Смежные вопросы