将原始查询转换为预准备语句

时间:2011-10-27 08:48:48

标签: php mysql prepared-statement

假设我的1995时尚功能意味着向mysql发送查询。 我对我的项目有很多疑问,我正在寻找能够解析原始查询的函数/类(假设:条形码中的SELECT foo,其中pizza ='hot'LIMIT 1) 并使用php创建一个准备好的语句。你对此有什么建议吗? 这值得么?或者最好只重写所有查询?

我可以在我的项目中计算424个查询,这只是SELECTs

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

试试这个:

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语句都与示例类似,条件是字符串,那么这可能会有效。但是,一旦需要等于整数,则必须更改模式。这就是我现在可以做的事情......我知道这根本不是最好的方法,但为了样本,试一试:)

答案 1 :(得分:0)

我建议regexp搜索这些查询(我认为它们应该有模式),稍后对它们进行排序,看看哪些相似/可以分组。

此外,如果您有某种日志,请检查哪些日志最常执行,将罕见查询移动到预准备语句中没有多大意义。

答案 2 :(得分:0)

老实说,你应该重写你的查询。使用正则表达式会起作用,但您可能会发现模式无法处理某些查询。问题是,只有一个模式可以解析所有问题,因此查询很复杂。此外,对您的代码来说,最好的做法和一致性就是简单地完成工作并重写您的查询。

祝你好运!

答案 3 :(得分:0)

您可能希望启用跟踪工具并在将SQL命令发送到数据库时捕获它们。预先警告,你将要看到的东西会吓跑你的裤子:)