MySQL问题使用一个插入语句插入多行

时间:2014-02-11 23:50:36

标签: php mysql

好的,我意识到这里有类似的话题,其实很多,但是没有一个能帮助我弄清楚我的问题,它似乎只是让我离我的目标越来越远。我已尝试过implode,对于每个循环等,但我收到“Query is empty”因为我传递空数组或者我得到语法错误。

我正在使用mysqli准备好的语句,这是我尝试过的,没有运气。很难过。基本上,我正在插入从我构建的API传递的许多成分行:

API网址字符串

menu_item.php?ingredient_name[]=bacon&ingredient_price[]=1.00&ingredient_default[]=0&ingredient_name[]=cheese&ingredient_price[]=0&ingredient_default[]=1

PHP

// set arrays, item_id, foreign key, already set from previous query
    $ingredient_name = $_GET['ingredient_name'];
    $ingredient_price = $_GET['ingredient_price'];
    $ingredient_default = $_GET['ingredient_default'];
    // define arrays
    $ingredients = array(
        'ingredient_name' => $ingredient_name,
        'ingredient_price' => $ingredient_price,
        'ingredient_default' => $ingredient_default
    );
    $insertQuery = array();
    $insertData = array();
    // set array length
    $len = count($ingredients);
    /**
    prepare the array values for mysql
    **/
    // prepare values to insert recursively
    $ingQuery = "INSERT INTO TABLE (column1,column2,column3,column4) VALUES ";
    // set placeholders
    foreach ($ingredients as $row) {
        $insertQuery[] = '(?,?,?,?)';
    }
    // iterate through all available data
    for( $i=0;$i<$len;$i++ ) {
        $insertData[] = $ingredients['ingredient_name'][$i];
        $insertData[] = $ingredients['ingredient_price'][$i];
        $insertData[] = $ingredients['ingredient_default'][$i];
    }
    // set ingredient value placeholders
    $ingQuery .= implode(', ', $insertQuery);
    // prepare statement ingredients
    $ingStmt = $mysqli->prepare($sql);
    // run the query
    if( $ingStmt ) {
        $ingStmt->execute($insertData);
    } else {
        // handle error return
        echo json_encode(array('error' => $mysqli->error.__LINE__));
        echo json_encode($insertData);
    }

现在忽略所有可能需要重新开始的事情。有什么建议?目前我收到Query Was Empty错误...我需要做一个更好,更有效的方法,但我对此感到头疼!

编辑(仍在进行中)

// the query
    $ingQuery = "INSERT INTO table (column1,column2,column3,column4) VALUES (?,?,?,?)";
    // prepare statement
    $ingStmt = $mysqli->prepare($ingQuery);
    if( $ingStmt ) {
        // iterate through all available data
        for( $i=0;$i<count($_GET['ingredient_name']);$i++ ) {
            $ingStmt->execute(array($item_id,$_GET['ingredient_name'][$i],$_GET['ingredient_price'][$i],$_GET['ingredient_default'][$i]));
        }
    } else {
        echo json_encode(array('error' => $mysqli->error.__LINE__));
    }
    $ingStmt->close();

2 个答案:

答案 0 :(得分:1)

这是不正确的

// set array length
$len = count($ingredients);

你的$ ingredients数组总是有3个元素。试试这个:

// set array length
$len = count($ingredient_name);

然后,这是不正确的(没有名为$ sql的变量)

$ingStmt = $mysqli->prepare($sql);

应该是

$ingStmt = $mysqli->prepare($ingQuery);

答案 1 :(得分:1)

首先,您的查询中有4列 - (column1,column2,column3,column4) VALUES (?,?,?,?),但您只插入3个值$_GET['ingredient_name'], $_GET['ingredient_price'], $_GET['ingredient_default']

其次,除非你需要重用你的数组/变量,为什么不将它简化为准备并在循环中执行 -

// the query
$ingQuery = "INSERT INTO TABLE (column1,column2,column3) VALUES (?,?,?)";
// prepare statement
$ingStmt = $mysqli->prepare($ingQuery);
// iterate through all available data
for( $i=0;$i<count($_GET['ingredient_name']);$i++ ) {
    $ingStmt->execute(array($_GET['ingredient_name'][$i], $_GET['ingredient_price'][$i], $_GET['ingredient_default'][$i]));
}

<强>更新
使用mysqli时需要使用bind_param() -

// the query
$ingQuery = "INSERT INTO TABLE (column1,column2,column3,column4) VALUES (?,?,?,?)";
// prepare statement
$ingStmt = $mysqli->prepare($ingQuery);
$ingStmt->bind_param("isss", $item_id, $val1, $val2, $val3);
// iterate through all available data
for( $i=0;$i<count($_GET['ingredient_name']);$i++ ) {
    $val1 = $_GET['ingredient_name'][$i];
    $val2 = $_GET['ingredient_price'][$i];
    $val3 = $_GET['ingredient_default'][$i];
    $ingStmt->execute();
}