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

Php 将原始查询转换为准备语句,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,假设我有1995年的fashion函数,用于向mysql发送查询。 我在我的项目上有很多查询,我正在寻找一个能够解析原始查询的函数/类(假设:从pizza='hot'LIMIT 1的bar中选择foo) 并使用php创建一个准备好的语句。你有什么建议吗? 值得吗?还是重写所有的查询更好 我可以在我的项目上计算424个查询,这只是选择 感谢您的帮助我建议对这些查询使用regexp搜索(我认为它们应该有模式),稍后对它们进行排序,并查看哪些查询相似/可以分组 另外,如果您有某种日志,请检查哪些日志执

假设我有1995年的fashion函数,用于向mysql发送查询。 我在我的项目上有很多查询,我正在寻找一个能够解析原始查询的函数/类(假设:从pizza='hot'LIMIT 1的bar中选择foo) 并使用php创建一个准备好的语句。你有什么建议吗? 值得吗?还是重写所有的查询更好

我可以在我的项目上计算424个查询,这只是选择


感谢您的帮助

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

另外,如果您有某种日志,请检查哪些日志执行得最频繁,将罕见的查询移动到已准备好的语句没有多大意义。

尝试以下方法:

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

老实说,您应该重写您的查询。使用正则表达式是可行的,但您可能会发现某些查询无法由模式处理。问题是,对于一个模式来解析所有模式的查询有很多复杂性。同样,对于代码来说,简单地完成工作并重写查询也是最佳实践和一致性


祝你好运

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