0

PHP変数キャッシングを行う最良の方法は何ですか? たとえば、4 行のテーブルがあるとします。

         name |  job
--------------------------
 Justin Smith | Plumber
 Jack Sparrow | Carpenter
 Justin Smith | Plumber
  Katie White | Doctor

次のように構築されます。

foreach($people as $person) {
   echo $person->name;
   echo get_job($person->name);
}

関数呼び出しget_job()は次のようになります。

function get_job($name) {
  //This is pseudo code below
  $row = MySQL->Query("SELECT job FROM people WHERE name = $name");
  return $row->job;
}

ご覧のとおり、 のジョブを取得したら、Justin Smithそれが であることがわかっているため、完全な MySQL クエリを再度実行する必要はありませんPlumber

key=>value次のような配列であるグローバル変数を実行することを考えていました。

 global $jobs = array("Justin Smith" => "Plumber",
                      "Jack Sparrow" => "Carpenter",
                      "Katie White" => "Doctor");

次に、get_job()関数で、クエリを実行する前に名前が配列に存在するかどうかを確認するだけです。そうでない場合は、名前とジョブを配列に挿入し、ジョブを返します。

基本的に、よりエレガントなこれを行うためのより良い方法はありますか?

4

2 に答える 2

1

多くの可能な解決策があります。ページ上の複数の場所で使用できる配列に SQL の結果を格納できます。代わりにglobal使用する必要がありますstatic

 function get_job($name) 
 {
      static $people_jobs;

      if( !isset($people_jobs[$name]) || empty($people_jobs[$name]) )
      {
          $row = MySQL->Query("SELECT job FROM people WHERE name = $name");
          $people_jobs[$name] = $row->job;
      }

      return $people_jobs[$name];
}

この関数は、何度呼び出しても、1 人に対して 1 回だけ MySQL クエリを実行します。get_job($name);

于 2012-11-17T09:10:48.770 に答える
0

これは、「人」のリストを取得するために 1 つのクエリを作成し、「仕事」を取得するために各人に対して 1 つのクエリを作成する典型的なn + 1 問題です。

それらがどのように関連しているかによって..おそらく、1 つのクエリを使用して両方を取得できます。たとえば、リレーションが Nx1 (1 人に 1 つの仕事があり、1 つの仕事を N 人に使用できる) の場合、最初のクエリは次のようになります。

SELECT p.name, j.job FROM Person p INNER JOIN Job j ON (p.job_id = j.id) 

関係が NxN の場合、トリッキーになります :P,

お役に立てれば

于 2012-11-17T09:46:33.643 に答える