конвертиране на необработени заявки в подготвен отчет

да предположим, че имам моята модна функция от 1995 г., предназначена да изпраща заявки към mysql. Имам много заявки за моя проект и търся функция/клас, способен да анализира необработената заявка (да предположим: SELECT foo от лента, където 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

Бих препоръчал търсене с regexp за тези заявки (мисля, че трябва да имат модел), по-късно да ги сортирате и да видите кои са подобни/могат да бъдат групирани.

Освен това, ако имате някакъв вид журнал, проверете кои се изпълняват най-често, няма много смисъл да премествате редки заявки към подготвени оператори.

person nimmen    schedule 27.10.2011

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

Късмет!

person Jason Foglia    schedule 13.12.2011

Може да искате да активирате средство за проследяване и да уловите SQL командите, докато се изпращат към базата данни. Бъдете предупредени, че това, което ще видите, ще ви изплаши до дъното :)

person dar7yl    schedule 13.12.2011