преобразование необработанных запросов в подготовленный оператор

предположим, что у меня есть модная функция 1995 года, предназначенная для отправки запросов в mysql. У меня много запросов по моему проекту, и я ищу функцию/класс, способный анализировать необработанный запрос (предположим: SELECT foo from bar, где pizza = 'hot' LIMIT 1) и создать подготовленный оператор с помощью php. у вас есть какие-нибудь советы по этому поводу? стоит ли оно того? или лучше просто переписать все запросы?

Я могу насчитать 424 запроса в своем проекте, и это только SELECT.

спасибо за любую помощь


person sathia    schedule 27.10.2011    source источник


Ответы (4)


Попробуй это:

function prepare1995Sql_EXAMPLE ($sqlString) {

    # regex pattern
    $patterns = array();
    $patterns[0] = '/\'.*?\'/';

    # best to use question marks for an easy example
    $replacements = array();
    $replacements[0] = '?';

    # perform replace
    $preparedSqlString = preg_replace($patterns, $replacements, $sqlString);

    # grab parameter values
    $pregMatchAllReturnValueHolder = preg_match_all($patterns[0], $sqlString, $grabbedParameterValues);
    $parameterValues = $grabbedParameterValues[0];

    # prepare command:
    echo('$stmt = $pdo->prepare("' . $preparedSqlString . '");');
    echo("\n");

    # binding of parameters
    $bindValueCtr = 1;
    foreach($parameterValues as $key => $value) {
    echo('$stmt->bindParam(' . $bindValueCtr . ", " . $value . ");");
    echo("\n");
    $bindValueCtr++;
    }

    # if you want to add the execute part, simply:
    echo('$stmt->execute();');
}

# TEST!
$sqlString = "SELECT foo FROM bar WHERE name = 'foobar' or nickname = 'fbar'";
prepare1995Sql_EXAMPLE ($sqlString);

Пример вывода будет:

$stmt = $pdo->prepare("SELECT foo FROM bar WHERE name = ? or nickname = ?");
$stmt->bindParam(1, 'foobar');
$stmt->bindParam(2, 'fbar');
$stmt->execute();

Это, вероятно, сработает, если все ваши операторы sql аналогичны примеру, а условия являются строками. Однако, как только вы потребуете приравнивания к целым числам, шаблон необходимо изменить. Это то, что я могу сделать на данный момент. Я знаю, что это не лучший подход, но ради примера попробуйте :)

person Nonym    schedule 20.11.2011

Я бы порекомендовал поиск по регулярным выражениям для этих запросов (я думаю, они должны иметь шаблон), позже отсортировать их и посмотреть, какие из них похожи / могут быть сгруппированы.

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

person nimmen    schedule 27.10.2011

Честно говоря, вы должны переписать свои запросы. Использование регулярных выражений будет работать, но вы можете обнаружить, что некоторые запросы не могут быть обработаны шаблоном. Проблема в том, что запросы для одного шаблона очень сложны, чтобы проанализировать их все. Кроме того, было бы лучше и логичнее, если бы ваш код просто выполнял работу и переписывал ваши запросы.

Удачи!

person Jason Foglia    schedule 13.12.2011

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

person dar7yl    schedule 13.12.2011