我使用Oracle作为数据库层,但问题是oracle通过OCI8(我做了一个PDO用户空间驱动程序)只支持SQL语句中的命名参数,并且不支持定位参数。 (比如使用多个?)
在一个基础上,它是Laravel的Eloquent,它生成SQL,但我找不到任何关于如何覆盖参数构造的文档。
我希望能够以“:name”的形式创建命名参数,而不是放置多个“?”整个查询。
可以这样做吗?我的猜测是它与数据库语法类有关...
答案 0 :(得分:1)
哦,如果有人有更好的解决方案,请继续提交或者告诉我我的临时解决方案可能出现的问题。我替换所有“?”使用“:autoparam”,参数增量创建“:autoparam0”,“:autoparam1”,“:autoparam2”等。
//Replace ? with a pseudo named parameter
$newStatement = null;
$parameter = 0;
while($newStatement !== $statement)
{
if($newStatement !== null)
{
$statement = $newStatement;
}
$newStatement = preg_replace('/\?/', ':autoparam'.$parameter, $statement, 1);
$parameter++;
}
$statement = $newStatement;
然后,当我收到从PDO绑定参数的请求时,我检查参数是否为数字。在大多数语言中,据我所知,数字索引是无效的标识符,所以我可以安全地假设,至少对于我的PDO用户空间驱动程序,我可以用以下代码替换数字参数名称:
//Replace the first @oci8param to a pseudo named parameter
if(is_numeric($parameter))
{
$parameter = ':autoparam'.$parameter;
}
它现在有效,我需要用laravel做更多的测试,看看问题是否出现在不同的分数中,但到目前为止,它似乎还好......