1

毎日の食事プランを作成するために使用する食事/レシピ データベースがあります。3 つの異なる選択リスト (朝食、昼食、夕食) を作成して、各food_nameの利用可能なレシピ オプションを表示する必要があります。

現在、上記のそれぞれに個別のクエリを使用し、個別のビルドを使用して各リストの結果を表示しています。

ランチのクエリ:

  // Lunch options
  $sql = "SELECT plan_date,
    plan_meal,
    plan_recipe,
    recipe_name,
    recipe_serving_size
    FROM recipe_plans
    LEFT JOIN $table_meals ON meal_id = plan_meal    
    LEFT JOIN $table_recipes ON recipe_id = plan_recipe
    WHERE plan_date = '".$date."'
    AND meal_name = 'Lunch'
    AND plan_owner = '".$user_name."'
    ORDER BY recipe_name";
    $rc = $DB_LINK->Execute($sql);
    DBUtils::checkResult($rc, NULL, NULL, $sql);

  // Scan the rows of the SQL result
  while (!$rc->EOF) {
    $recipeList[($rc->fields['plan_recipe'])] = $rc->fields['recipe_name'] . " (" . $rc->fields['recipe_serving_size'] . ")";
    $rc->MoveNext();
  }

そしてビルド:

// Scan the fields in the SQL result row
// Print all existing Meals, and some new ones
$minShow = 1;
$maxShow = 1;  // only build 1 while testing
for ($i = 0; $i < (isset($MealPlanObj->mealplanItems[$date]) && ($i < $maxShow) ? count($MealPlanObj->mealplanItems[$date]) : 0) + $minShow; $i++) {
  if ($i < (isset($MealPlanObj->mealplanItems[$date]) ? count($MealPlanObj->mealplanItems[$date]) : 0)) {
    // If it is an existing meal item, then set it
    $meal = $MealPlanObj->mealplanItems[$date][$i]['meal']; // meal_id
    $servings = $MealPlanObj->mealplanItems[$date][$i]['servings'];
    $recipe = $MealPlanObj->mealplanItems[$date][$i]['id']; // recipe_id
  } else {
    // It is a new one, give it blank values
    $meal = NULL;
    $servings = $defaultServings;
    $recipe = NULL;
  }
  // The HTML Code to build the select list for 'Lunch'
}

上記のコードは、meal_name ごとに複製されています。これは、私の限られたスキルが私を残した場所だからです (笑)。

問題は、3 つの条件 (朝食、昼食、夕食) ごとに別々の select ステートメントと build ステートメントを記述するのではなく、1 つだけを記述してすべてを出力するにはどうすればよいかということです。

4

1 に答える 1

2

既に変数を使用して SQL クエリを作成しているため、 のような別の変数を導入できます$meal_name。この変数は、SQL ステートメントに適用できます。それ以外の:

$sql = "SELECT mplan_date,
  ...
  AND meal_name = 'Lunch'
  ...

次に書きます:

$meal_name = 'Lunch';
...
$sql = "SELECT mplan_date,
  ...
  AND meal_name = '" . mysqli_real_escape_string($meal_name) . "'
  ...

function の使用に注意してください。mysqli_real_escape_string()この例では絶対に必要というわけではありませんが、変数の内容がまったくわからない場合は、SQL ステートメントに追加するすべての変数をエスケープすることが非常に重要です。サンプル コードは、SQL インジェクションに対して脆弱です。

その後、さらに一歩進んで、コードを関数にパックできます。

function buildSqlQuery($meal_name, $date, $user_name)
{
  $sql = "SELECT mplan_date,
    ...
    ORDER BY recipe_name";
  return $sql;
}

$sqlForBreakfast = buildSqlQuery('Breakfast', '2000-01-01', 'teddy');
$sqlForLunch = buildSqlQuery('Lunch', '2000-01-01', 'teddy');
$sqlForDinner = buildSqlQuery('Dinner', '2000-01-01', 'teddy');
于 2012-11-24T19:25:11.253 に答える