PHP представить для вставки и обновления данных

1

Мне нужна моя форма для публикации данных INSERT или UPDATE, в зависимости от того, существует ли столбец. Запрос INSERT работает нормально, но UPDATE не работает. Я думаю, это было бы потому, что исходный SQL-запрос ($ query) терпит неудачу, более чем вероятно, потому что он не находит данные $ Unique_Ref POST. Если это так, как извлечь это единственное значение из массива $ invoice_data?

Это код страницы формы:

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-инъекций, если вы непосредственно помещаете переменные в свой запрос ...
Теги:
mysqli
post
insert

4 ответа

3
Лучший ответ

У вас есть

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

редактировать

я отредактировал вам код следующим образом:

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

для достижения чего ниже, и это работает для меня.. хм..

End Edit

что-то вроде:

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

потому что при его обновлении (field1 = value1, field2 = value)

Edit2

Фактический код тестирования: Изображение 174551

End Edit

может, что-то подобное сделает?

$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
    Спасибо! Ошибка школьника с моей стороны - все это часть учебного процесса ...
  • 0
    Добро пожаловать, всегда и навсегда .. Ура! :)
1

Вы не можете установить несколько значений для нескольких полей в одном выражении, например SET $fields = $data. Вы должны установить каждое значение для каждого поля отдельно: SET field1='value1', field2='value2',...

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. Я бы порекомендовал вам улучшить свой ответ, указав, почему это будет работать, а также улучшить форматирование кода.
0

убедитесь, что вставить цитату (') для строкового значения:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню