2014-02-11 51 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);