假设我的1995时尚功能意味着向mysql发送查询。 我对我的项目有很多疑问,我正在寻找能够解析原始查询的函数/类(假设:条形码中的SELECT foo,其中pizza ='hot'LIMIT 1) 并使用php创建一个准备好的语句。你对此有什么建议吗? 这值得么?或者最好只重写所有查询?
我可以在我的项目中计算424个查询,这只是SELECTs
感谢您的帮助
答案 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命令发送到数据库时捕获它们。预先警告,你将要看到的东西会吓跑你的裤子:)