簡體   English   中英

MySQL使用一個插入語句插入多行問題

[英]MySQL Issues Inserting Multiple Rows with One Insert Statement

好的,我意識到與此相關的主題很多,但實際上沒有一個可以幫助我弄清楚我的問題,而且這似乎使我離目標越來越遠。 我已經嘗試了內爆,每次循環,等等,但是由於傳遞空數組而收到“查詢為空”,否則會收到語法錯誤。

我正在使用mysqli准備的語句,這是我嘗試沒有運氣的嘗試。 很難過。 基本上,我會插入從我構建的API傳遞過來的許多成分行:

API URL字符串

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);
    }

現在,請忽略所有可能我需要重新開始的內容。 有什么建議么? 目前,我正在收到“查詢為空”錯誤……我需要以一種更好,更有效的方式來執行此操作,但是我為此抓狂了!

編輯(仍在進行中)

// 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();

這是不對的

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

您的$ ingredients數組將始終包含3個元素。 嘗試以下方法:

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

然后,這是不正確的(沒有名為$ sql的變量)

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

它應該是

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

首先,您的查詢中有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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM