[英]Inserting multiple rows into MySql with one INSERT statement using PHP implode function
[英]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.