1

我将以下代码作为更大的 Web 应用程序的一部分来搜索员工并返回所需的信息。查询本身几乎不需要时间来完成并返回结果集。似乎需要一些改进的是我目前如何将结果编码到一个数组中,以便 json_encode 返回到前端。我对如何改进代码没有想法(因此我在这里提出问题)。任何想法将不胜感激!

<?php
require_once("class.employee.php");
$employee = new Employee();
$employeeSearch = $employee->searchEmployees($_REQUEST['q']);
$employeeResults = array();
$row_array['id'] = $_REQUEST['q'];
$row_array['empName'] = $_REQUEST['q'];
$row_array['empBusinessTitle'] = '';
$row_array['empFacility'] = '';
array_push($employeeResults, $row_array);
while ($empInfo = $employeeSearch->fetchObject()) {
    $row_array['id'] = $empInfo->empUserName;
    $row_array['empName'] = ucwords($empInfo->empName);
    $row_array['empBusinessTitle'] = $empInfo->empBusinessTitle;
    $facilityName = $employee->getFacilityIDByAD($empInfo->empUserName);
    $row_array['empFacility'] = isset($facilityName->facilityName) ? $facilityName->facilityName : '';
    array_push($employeeResults, $row_array);
}
$ret['results'] = $employeeResults;
echo json_encode($ret);

Class Employee {
public function searchEmployees($query) {
    try {
        $dbh = new PDO($this->dbDSN, $this->dbUser, $this->dbPass);
        $statement = $dbh->prepare("SELECT empID, CONCAT(empFirstName,' ',empLastName) as empName, empUserName, empBusinessTitle from $this->tblEmployeePeople where CONCAT(empfirstname,' ',emplastName) LIKE CONCAT('%',:query,'%') and empUserName != ''");
        $statement->bindParam(':query', $query);
        $statement->execute();
        $dbh = null;
        return $statement;
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
}

}?>
4

2 回答 2

0

首先,我将删除您一一分配的所有数组参数。这需要 CPU 时间来添加到阵列中。似乎你有一些复杂的循环,尽量避免分配数组和许多循环执行到一个页面中。

- - - - 更新 - - - -

试试这个更新:

$row_array = array(
            'id' => $REQUEST['q'],
            'empName' => $_REQUEST['q'],
            'empBusinessTitle' => '',
            'empFacility' = ''
            );

while($empInfo = $employeeSearch->fetchObject()) {
    $row_array[] = $empInfo;
}
array_push($employeeResults, $row_array);

然后只需从数组 $row_array 中通过它们各自的键请求结果。正如雷在他的帖子中已经建议的那样,更新查询。他是对的。

于 2012-10-01T18:40:08.430 回答
0

where 子句中调用的函数会破坏您在这些字段上可能拥有的任何索引。从性能的角度来看,这是查询中最糟糕的部分。

CONCAT(empfirstname,' ',emplastName) LIKE CONCAT('%',:query,'%')

首先,为什么需要第二个 CONCAT?就这样做

 CONCAT(empfirstname,' ',emplastName) LIKE '%:query%'

但是,仍然会达到第一个 Concat 函数的索引破坏惩罚。另外,为什么通配符喜欢?您可能需要精确的相等性检查。

我会将传入的请求值“q”分解为名字和姓氏两部分,然后将其传递给搜索功能。

在搜索功能中试试这个:

  $nameArray = explode('',$query );
  $firstname = $nameArray[0];
  $lastname  = $nameArray[1];

然后将您的查询更改为:

  WHERE ( empfirstname LIKE ':firstname' AND emplastname = ':lastname' ) AND empUserName != ''

然后使用通配符添加绑定,如下所示:

   $statement->bindValue(':firstname', $firstname."%");
   $statement->bindValue(':firstname', $lastname."%");
于 2012-10-01T18:40:37.343 回答