1

有时根据查看我的页面时的用户类型,我需要添加一个 JOIN,甚至只是限制结果。有没有更清洁的方法呢?我应该为每种类型的请求单独声明吗?什么更“合适”?

这是我的代码最终的样子:

// Prepare statement
$stmt = $this->db->prepare('
    SELECT *
    FROM    Documents
    LEFT JOIN Notes ON ID = D_ID
    '.($user_id ? "INNER JOIN Users ON UID = ID AND UID = :userid" : '')."
    ". ($limit ? 'LIMIT :offset, :limit' : '')
);

// Bind optional paramaters
if ($user_id) $stmt->bindParam(':userid', $user_id, DB::PARAM_INT);

if ($limit)
{
    $stmt->bindParam(':offset', $limit[0], DB::PARAM_INT);
    $stmt->bindParam(':limit', $limit[1], DB::PARAM_INT);
}
4

2 回答 2

1

为了清楚起见,也许只是将插入字符串包装到自己的方法中,例如getUserInsertString($user_id),并尝试使您的引用使用更加一致。

另外,您是否正在测试是否仅通过 go 来定义$user_id和定义?如果是这样,如果您将错误报告转向所有,您将收到一堆未定义的变量警告。您可能要考虑改用。$limitif ($user_id)if (isset($user_id))

于 2012-04-05T23:43:50.077 回答
0

我会创建单独的(受保护的)函数,它们返回只需要执行的准备好的语句。

/**
* @returns PDOStatement
*/
protected function prepareStatementForCase1(PDO $dbObject,Object $dataToBind){...}
/**
* @returns PDOStatement
*/
protected function prepareStatementForCase2(PDO $dbObject,Object $dataToBind){...}

然后,我会在外面决定,必须叫哪一个。您可以更轻松地重建、维护和阅读代码。

例子:

class Document{
  protected $dbObject;

  public function __construct(PDO $dbObject){
    $this->dbObject=$dbObject;
  }
  public function doQuery($paramOne,$paramTwo,...){
    $logicalFormulaOne=...; // logical expression here with parameters
    $logicalFormulaTwo=...; // logical expression here with parameters
    if($logicalForumlaOne){
      $dbStatement=$this->prepareStatementForCase1($dataToBind);
    }else if($logicalFormuleTwo){
      $dbStatement=$this->prepareStatementForCase2($dataToBind);
    }
    $dbResult=$dbStatement->execute();
  }
  protected function prepareStatementForCase1(Object $dataToBind){
    $dbStatement=$this->dbObject->prepare("query string");
    $dbStatement->bindParam(...);
    return $dbStatement;
  }
}

但是,当您的 PDOResult 对象表示不同类型的数据库元组时,或者当您在其中一种情况下返回更多行时,我不建议这样做。

我通常做的是创建一个代表(在您的示例中)文档的类。只有一个。我可以按其字段插入、删除、选择、修改,并处理一项。当我需要(例如)获取更多它们时,我创建一个新类,例如 DocumentList,它处理文档集合。这个类在获取更多 Document 对象时会给我一个数组。

于 2012-04-05T23:56:58.763 回答