迭代多个PHP变量,为每个SQL语句分配值

时间:2014-01-31 21:44:24

标签: php sql

所以一直在四处寻找并且不确定如何查询我的问题。基本上,我想要在我的代码中做我已经完成的事情(我有成分变量硬编码),而是创建一个循环来迭代并将所有可用的成分分配给相应的变量并相应地更新我的SQL记录。什么是最好的方法呢?

我想提高效率,所以我不会在我的SQL DB中使用空列,如果URL API中的成分字符串为空,则将其保留为数据库中的空值。 ?PHP的配料[] =苹果&安培;配料[] =胡椒&安培;成分[] = .....

$ingredients = $_GET['ingredient'];
    $ingredient1 = $ingredients[0];
    $ingredient2 = $ingredients[1];
    $ingredient3 = $ingredients[2];
    $ingredient4 = $ingredients[3];
    $ingredient5 = $ingredients[4];
    $ingredient6 = $ingredients[5];
    $ingredient7 = $ingredients[6];
    $ingredient8 = $ingredients[7];
    $ingredient9 = $ingredients[8];
    $ingredient10 = $ingredients[9];
    $ingredient11 = $ingredients[10];
    $ingredient12 = $ingredients[11];
    $ingredient13 = $ingredients[12];
    $ingredient14 = $ingredients[13];
    $ingredient15 = $ingredients[14];
$wait_time = $_GET['wait_time'];

$query = "INSERT INTO menu_items (rest_id,item_name,item_genre,item_price,item_descript,ingredient1,ingredient2,ingredient3,ingredient4,ingredient5,ingredient6,ingredient7,ingredient8,ingredient9,ingredient10,ingredient11,ingredient12,ingredient13,ingredient14,ingredient15,wait_time) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

$stmt =  $mysqli->prepare($query);
    if ($stmt) {
        $stmt->bind_param('issdssssssssssssssssi',$rest_id,$item_name,$item_genre,$item_price,$item_descript,$ingredient1,$ingredient2,$ingredient3,$ingredient4,$ingredient5,$ingredient6,$ingredient7,$ingredient8,$ingredient9,$ingredient10,$ingredient11,$ingredient12,$ingredient13,$ingredient14,$ingredient15,$wait_time);
        $stmt->execute();
            echo json_encode(array('itemID' => $mysqli->insert_id, 'error' => $mysqli->error));
        $stmt->close();
    } else {
        echo json_encode(array('itemID' => null, 'error' => $mysqli->error));
    }

2 个答案:

答案 0 :(得分:2)

由于您有一个单独的成分表,您可以创建一个简单的联结表。这是一个设计的例子

id |  menuId | ingredientId
----------------------------
 1 |    1    |     2
 2 |    1    |     3

其中menuId是菜单表的FK,ingredientId是成分db的FK。上面的示例意味着您有一个带有Id的菜单,其中还包含成分2和3. id列是可选的。如果您不需要,请随意将其删除。

然后,设置您具有下一个HTML结果的成分的选择框

<option value="2">pepper</option>
<option value="3">beef</option>

您可以通过从配料表中选择idname来获取此功能,并使用id作为值字段。

现在,在您的PHP中,只发送填写的项目值。(如果选择了4,请不要发送15。只需发送4)

$ingredients = $_GET['ingredient'];
// insert menu item (not sure if it's a part of the ajax ...)
$newMenuQuery = "INSERT INTO menu_items (rest_id,item_name,item_genre,item_price,item_descript,wait_time) VALUES (?,?,?,?,?,?)";
// query insert for junction table
$newIngredients = "INSERT INTO menuHasIngredients VALUES (?, ?)";

// prepare statement menu
$stmtMenu = $db->prepare($newMenuQuery);

// insert menu
$stmtMenu->bind_param('issdsi',$rest_id,$item_name,$item_genre,$item_price,$item_descript,$wait_time);
$stmtMenu->execute();
// get inserted id (insert_id gives last id given back
$newId = $db->insert_id;
// close connection
$stmtMenu->close();

// check if success
if($newId) {
    // prepare statement ingredients
    $stmtIngredients = $db->prepare($newIngredients);
    // use junction table
    $count = count($ingredients);
    for($i = 0; $i < $count; $i++) {
        $stmtIngredients->bind_param('ii', $newId, $ingredients[$i]);
        $stmtIngredients->execute();
    }
    // handle return good or error

    // close connection
    $stmtIngredients->close();
}
else {
   // send error back that menu inserting has failed
}
// close connection

请在两个查询中检查bindparam字符串表示法。可能错过或输入了错误的字符。

但是,如果您使用了PDO,情况会更容易。但是你应该对上述事情没问题。

答案 1 :(得分:0)

根据文档,你不能动态使用bind_param,也许为什么我认为MySQLi已经过时了:D 唯一的解决方案是使用call_user_func_array():

call_user_func_array(array($stmt, 'bind_param'), array_unshift('issdssssssssssssssssi', $_GET['ingredient']));

我不是pro bind_param,我不推荐它而不是自己检查,我不推荐MySQLi(但这比mysql_ *函数更好)。

但事实上,你永远不应该将数组中的值影响到很多变量。 此外,您应该始终检查用户输入,您不能信任任何输入变量,甚至是管理员(他们会犯错)。