2015-05-28 81 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