当前位置: 首页 > 面试题库 >

Doctrine Raw SQL和准备好的语句

怀飞扬
2023-03-14
问题内容

我有一个使用准备好的语句的Doctrine_RawSql查询。但是,当生成SQL查询时,它们似乎会被忽略。但是,如果我忽略了标记值,则会得到关于不匹配的绑定变量数量的异常(因此,至少是试图将它们包含在内)。

如果我内联包含这些值,Doctrine是否在幕后做任何事情以防止SQL注入?

这是我的代码:

public function sortedPhotogsByLocation($location)
{
    $q = new Doctrine_RawSql();
    $result = $q->select('{p.*}')
            ->from('photographers p')
            ->addComponent('p', 'Photographer')
            ->where('p.city_id = ?', $location->id)
            ->orderBy('CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname ASC', $location->photographer_sort)
            ->execute();
    return $result;
}

这提供了以下SQL输出:

  SELECT *  
  FROM photographers p 
  WHERE p.city_id = ? 
  ORDER BY 
    CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname 
  ASC

编辑:上的属性$location已正确设置。如果我对参数进行硬编码:

->where('p.city_id = ?', 5)

我遇到了相同的问题,即令牌没有被替换。


问题答案:

我对Doctrine_RawSql并不完全熟悉,但占位符应单独使用,而不是“?%”?并在传递的变量上添加%。看一下示例#6。



 类似资料:
  • 问题内容: 在将HQL转换为SQL时,Hibernate在JDBC内部使用PreparedStatement。HQL中的内联参数如何处理? 例: 将状态“解析”并用作SQL中的参数,或者将其作为内联参数发送。 我的观点背后的原因是“最佳做法”,以及针对重复调用的查询性能 问题答案: 它被内联发送。当是客户端控制的值时,您绝对不希望这样做。 而是将其参数化: 也可以看看: OWASP-hiberna

  • 假设上面的代码是我的查询。什么是一个安全的替代方案,将允许自动增加在mySQL数据库。

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 我有一个类,其中我使用旧的jdbc方法创建了到h2数据库的连接,该方法编写url并获取连接,我在数据库中创建了一个表,这个表不是java对象,所以我用尽了聪明的方法来为我的方法编写测试 //我还创建了一个表app_user公共void addUser(连接连接,字符串登录,字符串密码,字符串描述)抛出SQLException{ 而我的测试方法看起来像这样,有没有办法让它不那么整洁,更简单,我试图用

  • 问题内容: 我刚刚开始做我的第一个项目(很有趣)。我正在学习PHP和MySQL,并且已经完成了我的第一个正常工作的应用程序。它可以工作,但是我现在正在学习如何保护应用程序的安全,从而防止SQL注入。我大约有50多个PHP文件来管理与MySQL数据库的交互。它们看起来都是这样的: 这是我在整个应用程序中用于向数据库读写数据的格式。如果我需要将它们更改为准备好的语句,而不是在其中插入任何信息,而只是在