好的,我意识到这里有类似的话题,其实很多,但是没有一个能帮助我弄清楚我的问题,它似乎只是让我离我的目标越来越远。我已尝试过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();
答案 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();
}