-1

データベースのレシピを使用して、ユーザーが毎日の食事プランを作成するためのフォームがあります。プロセスは次のとおりです。

1)管理者は、希望する日付について、食事(ランチおよび/またはディナー)ごとに2つのレシピを選択します。これらの選択は、顧客の食事選択リストに入力するために使用されます。

2)顧客は、希望する日付で、利用可能な食事ごとに1つのレシピを選択します。

問題:

フォームは、ページに表示された最後のリストから選択された値のみを処理しているようで、理由はわかりません。

これが私が扱ってきたコードセクションです。(必要に応じてもっと投稿できます)

// Create a new Meal Plan object
$MPObj = new MealPlan($date);
$MPObj->load($dbDate,$dbDate); // Just want this one day
$minshow = 1;
$defaultServings = 1;

// Read in a list of Meals and Recipes
$rc = DBUtils::fetchColumn( $db_table_meals, 'meal_name', 'meal_id', 'meal_id' );
$mealList = DBUtils::createList($rc, 'meal_id', 'meal_name');
array_unshift_assoc($mealList, 0, ""); // add an empty element to the list

-

$sql = "SELECT mplan_date,
  mplan_recipe,
  recipe_name,
  meal_name,
  recipe_serving_size
  FROM recipe_mealplans
  LEFT JOIN $db_table_meals ON meal_id = mplan_meal   
  LEFT JOIN $db_table_recipes ON recipe_id = mplan_recipe
  WHERE mplan_date = '".mysql_real_escape_string($dbDate)."'
  AND mplan_owner = '".mysql_real_escape_string($user_SK)."'
  ORDER BY recipe_name";
  $rc = $DB_LINK->Execute($sql);
  DBUtils::checkResult($rc, NULL, NULL, $sql);

-

while (!$rc->EOF) {
  if ($rc->fields['meal_name'] === "Lunch") {
  $recipeListLunch[($rc->fields['mplan_recipe'])] = $rc->fields['recipe_name'] . " (" . $rc->fields['recipe_serving_size'] . ")";
  }
  if ($rc->fields['meal_name'] === "Dinner") {
  $recipeListDinner[($rc->fields['mplan_recipe'])] = $rc->fields['recipe_name'] . " (" . $rc->fields['recipe_serving_size'] . ")";
  }
  $rc->MoveNext();
}

-

<form action="index.php?m=meals&amp;dosql=update&amp;view=daily&amp;date=<?php echo $date; ?>" method="post" enctype="multipart/form-data">
<table cellspacing="1" cellpadding="4" border="0" width="80%" class="data">
<tr>
  <th align="center">Remove</th>
  <th align="center">Meal</th>
  <th align="center">Servings</th>
  <th align="center"></th>
  <th align="center">Menu Options</th>
</tr>
<?php
// Print out all the existing meals, and some new ones
for ($i = 0, $maxshow = 1; $i < (isset($MPObj->mealplanItems[$dbDate]) && ($i < $maxshow) ? count($MPObj->mealplanItems[$dbDate]) : 0) + $minshow; $i++) {
  if ($i < (isset($MPObj->mealplanItems[$dbDate]) ? count($MPObj->mealplanItems[$dbDate]) : 0)) {
    // If it is an existing meal item, then set it
    $meal = $MPObj->mealplanItems[$dbDate][$i]['meal'];
    $servings = $MPObj->mealplanItems[$dbDate][$i]['servings'];
    $recipe = $MPObj->mealplanItems[$dbDate][$i]['id'];
  } else {
    // It is a new one, give it blank values
    $meal = NULL;
    $servings = $defaultServings;
    $recipe = NULL;
  }

/* Display Meal Lists to select from */

// Lunch
echo '<tr>';
echo '<td align="center">';
echo '<input type="checkbox" name="delete_'.$i.'" value="yes"></td>';
echo '<td align="center">';
echo DBUtils::arrayselect($mealList, 'meal_id_'.$i, 'size=1', $meal);
echo '</td><td align="center">';
echo '<input type="text" autocomplete="off" name="servings_'.$i.'" value="' . $servings . '" size="3">';
echo '</td><td align="center">';
echo '<input type="hidden" autocomplete="off" name="repeat_'.$i.'" value="1" size="3"> ';
echo '</td><td align="center">';
echo DBUtils::arrayselect($recipeListLunch, 'recipe_id_'.$i, 'size=1', $recipe);
echo '</td></tr>';

// Dinner
echo '<tr>';
echo '<td align="center">';
echo '<input type="checkbox" name="delete_'.$i.'" value="yes"></td>';
echo '<td align="center">';
echo DBUtils::arrayselect($mealList, 'meal_id_'.$i, 'size=1', $meal);
echo '</td><td align="center">';
echo '<input type="text" autocomplete="off" name="servings_'.$i.'" value="' . $servings . '" size="3">';
echo '</td><td align="center">';
echo '<input type="hidden" autocomplete="off" name="repeat_'.$i.'" value="1" size="3"> ';
echo '</td><td align="center">';
echo DBUtils::arrayselect($recipeListDinner, 'recipe_id_'.$i, 'size=1', $recipe);
echo '</td></tr>';

} // end for
?>
</table>

<?php
if isset($recipeListLunch) || isset($recipeListDinner)) {
  echo '<input type="submit" value="Update Menu" class="button">';
}
?>
</form>
4

1 に答える 1

1

nameランチとディナーのコードセクションは、属性に同じ値を使用しています。[]配列を作成するには、それらにまったく異なる名前を付けるか、追加する必要があります。

編集:たとえば、

echo '<input type="checkbox" name="delete_'.$i.'[]" value="yes"></td>';

属性[]の値の二重引用符の内側に注意してください。nameあなたはそれらすべてにこれをする必要があるでしょう。私はよく知らDBUtils::arrayselectないので、次のことがうまくいくかどうかはわかりません。

echo DBUtils::arrayselect($mealList, 'meal_id_'.$i.'[]', 'size=1', $meal);

ただし、同じ名前のフィールドが複数ある限り、それらは互いに上書きします。これらのフィールドを配列にする場合は、フォームを処理するコードを変更して、配列を処理できるようにする必要もあります。

編集:配列を作成する代わりに、ランチセクションとディナーセクションの間で$iをインクリメントすることもできます。ループ内で$iをインクリメントするには、forパラメーターを変更する必要がありますが、少なくとも、フォームを処理するコードを変更する必要はありません。

このfor線は私には非常に複雑に見えます(そして非効率的です)。ループの各反復で不要な計算を実行する場合、1行のコードはより効率的ではありません。意図が正しく理解できたらfor、次の行に置き換えてみてください。

$maxshow = 1;
$num_items = isset($MPObj->mealplanItems[$dbDate]) ? count($MPObj->mealplanItems[$dbDate]) : 0;
if ($num_items + $minshow < $maxshow) $maxshow = $num_items + $minshow;
$maxshow = $maxshow * 2; //double it because we will be incrementing $i within the loop

for ($i = 0; $i < $maxshow; $i++) {

次に、元のランチセクションとディナーセクション(のないセクション)の間に次の行を追加します[]

$i++;

これにより、配列を作成せずに、各フィールドに異なる名前を効果的に割り当てることができます。

于 2012-11-30T11:05:54.323 に答える