2015-05-28 137 views
1

我需要我的表單來發布INSERT或UPDATE數據,具體取決於列是否已經存在。 INSERT查詢工作正常,但UPDATE不。我想這應該是因爲最初的sql查詢($ query)失敗,很可能是因爲它沒有找到$ Unique_Ref POST數據。如果是這種情況,我該如何從$ invoice_data數組中提取這個單個值?PHP提交插入和更新數據

這是表單頁面代碼:

if (isset($_GET['success']) && empty($_GET['success'])) {echo 'Record saved'; } else {if (empty($_POST) === false && empty($errors) === true) {$invoice_data = array(
    'Unique_Ref'   => mysqli_real_escape_string($conn, $_POST['Unique_Ref']), 
    'Supplier_Name'   => mysqli_real_escape_string($conn, $_POST['Supplier_Name']), 
    'Supplier_Invoice_Ref' => mysqli_real_escape_string($conn, $_POST['Supplier_Invoice_Ref']), 
    'Office'    => mysqli_real_escape_string($conn, $_POST['Office']), 
    'Loss_Surplus_Amount' => mysqli_real_escape_string($conn, $_POST['Loss_Surplus_Amount']), 
    'Loss_Surplus_Currency' => mysqli_real_escape_string($conn, $_POST['Loss_Surplus_Currency']), 
    'Outcome'    => mysqli_real_escape_string($conn, $_POST['Outcome'])); 

    save_invoice($invoice_data);header('Location: invoices.php?success'); exit(); 
    } else if (empty($errors) === false) {echo output_errors($errors);} ?> *html form....* 

這是save_invoice()函數:

function save_invoice($invoice_data) { 
global $conn; 
array_walk($invoice_data, 'array_sanitize'); 
$fields = '`' . implode('`, `', array_keys($invoice_data)) . '`'; 
$data = '\'' . implode('\', \'', $invoice_data) . '\''; 

$query = mysqli_query($conn, "SELECT * FROM `invoicelog` WHERE `Unique_Ref` = '$Unique_Ref'"); 
$result = mysqli_num_rows($query); 

if($result > 0) { 
    mysqli_query($conn, "UPDATE `invoicelog` SET $fields = $data WHERE `Unique_Ref` = '$Unique_Ref'"); 
} else { 
    mysqli_query($conn, "INSERT INTO `invoicelog` ($fields) VALUES ($data)"); 
} 

任何建議將是非常歡迎的。正如我所提到的,最終的INSERT查詢工作正常,它是不起作用的UPDATE查詢。

+0

使用UPDATE時會出現什麼錯誤?你確定$ fields,$ data,$ Unique_Ref的內容嗎?另外要注意你的語法,如果你直接在你的查詢中加入變量,你可能會對SQL注入造成損害...... – Random

回答

3

你必須配對

$fields = '`' . implode('`, `', array_keys($invoice_data)) . '`'; 
$data = '\'' . implode('\', \'', $invoice_data) . '\''; 

編輯

我編輯過你這樣的代碼:

$fields = array_keys($invoice_data)[$i]; 
$data = $invoice_data; 

實現什麼的下方,它爲我工作..嗯..

末編輯

是這樣的:因爲在更新它時

'fields[0] = $data[0], ...' //and so on, place it in a loop. or whatever you prefer.. :) 

(field1 = value1, field2 = value)

編輯2

測試的實際代碼: enter image description here

末編輯

也許這樣的事情會怎樣呢?

$set_arr = array(); 
for ($i = 0; $i < count($data); $i++) 
{ 
    $set_arr[] = "`".array_keys($invoice_data)[$i]/*$fields*/."` = '".$data[$i]."' "; 
} 

$setString = implode(',', $set_arr); 

/* 
Result ]> `Unique_Ref` = '1' ,`Supplier_Name` = '2' ,`Supplier_Invoice_Ref` = '3' ,`Office` = '4' ,`Loss_Surplus_Amount` = '5' ,`Loss_Surplus_Currency` = '6' ,`Outcome` = '7' 
     ]> from my test 
*/ 

那麼你的更新語句將是這樣的:

"UPDATE `invoicelog` SET ($setString) `Unique_Ref` = '$Unique_Ref' 

希望我已經幫你..我走了,編碼快樂乾杯!

+0

謝謝!小學生我的錯誤 - 學習過程的所有部分... – jamesp777

+0

不客氣,永遠永遠..乾杯! :) – 0yeoj

1

不能將多個值設置爲單個表達式中的多個字段,如SET $fields = $data。您應該爲單獨的每個字段中的每個值:SET field1='value1', field2='value2', ...

0

確保插入引號(')的字符串值:

mysqli_query($conn, "UPDATE `invoicelog` SET $fields = '$data' WHERE `Unique_Ref` = '$Unique_Ref'"); 
0

// mysqli_query($ conn,「UPDATE invoicelog SET $ fields = $ data WHERE Unique_Ref ='$ Unique_Ref'」);

更新以下代碼以上行。

$str = ''; 
foreach($invoice_data as $field=>$val){ 
    $str = $str.",".$field."=".$val; 
} 
$str = substr($str,1); 
mysqli_query($conn, "UPDATE `invoicelog` SET $str WHERE Unique_Ref = '$Unique_Ref'"); 
+0

嗨,歡迎來到stackoverflow。我會建議你通過提供爲什麼這會起作用並改進代碼格式來改進你的答案。 – Wtower