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

まず、割り当てたすべての配列パラメーターを1つずつ削除します。これには、アレイに追加するのにCPU時間がかかります。少し複雑なループがあるようです。配列の割り当てを避け、1ページに実行するためのループがたくさんあるようにしてください。

- - - - アップデート - - - -

このアップデートを試してみてください:

$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,'%')

まず、なぜ2番目のCONCATが必要なのですか?これを行うだけ

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

ただし、それでも最初のConcat関数のインデックスを破るペナルティが発生します。また、なぜワイルドカードが好きなのですか?おそらく、正確な同等性チェックが必要です。

渡されたリクエスト値「q」を名前と名前の2つの部分に分割し、それを検索関数に渡します。

検索機能でこれを試してください:

  $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 に答える