2014-02-11 54 views
1

好吧,我知道这里有类似的话题,其实很多,但他们都没有帮助我找出我的问题,它似乎让我离我越来越远目标。我已经尝试了implode,为每个循环等,但是我收到“查询是空的”,因为我传递了空数组,否则我得到一个语法错误。MySQL的问题插入多行插入语句

我正在使用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); 
    } 

现在不顾一切,也许我需要重新开始。有什么建议么?目前我收到的查询是空的错误...我需要做到这一点更好,更有效的方式,但我正在抓我的头!

EDIT(仍在进行中)

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

回答

1

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

二,除非y使用的mysqli当

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

更新
您需要使用bind_param() - -

OU需要重用你的阵列/变量,为什么没有简化下来的准备,并在循环中执行
// 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(); 
} 
+0

我应该提交4因为item_id,是insertData []错了吗? Item_id只有一个值,而不是一个数组,但我是否需要将它作为数组的一部分呢? – jflay

+0

是的,'insertData []'是错误的,因为它只包含3个项目,因为它不包含'item_id'。我会更新我的答案。 – Sean

+0

我更新了我的问题,并且完全按照您的指示进行了操作,但现在我没有收到错误,并且仍然没有数据库表中的数据... = /实际上,item_id不是API字符串中的数组,它只能从另一个父表的insert语句在同一个PHP脚本中。我最终通过'$ item_id = $ mysqli-> insert_id;'定义了item_id变量'' – jflay

1

这是不正确

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

你$成份阵列将始终有3个要素,无论。试试这个:

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

那么,这是不正确的(不存在变量,名为$ SQL)

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

应该

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