Обновить строку, если существует, или вставить - PullRequest
0 голосов
/ 24 марта 2020

Я работаю над веб-формой PHP, которая в настоящее время подключается к базе данных Oracle. Я пытаюсь заставить функционал работать так, чтобы после того, как пользователь отправил форму, он проверит, существует ли строка на основе номера задания, если он затем обновится, в противном случае вставьте значения.

Это принесет на данный момент вернули внутреннюю ошибку сервера, и я не могу понять, почему.

Ниже приведен фрагмент кода ...

<?php

//connect to database
$DBC = oci_connect("username", "password", "server");

set_time_limit ( 120 );


$jobNumber = $_POST['jobNumber'];

$C1utShortAmount = $_POST['1CutShortAmount'];
$1Scrap = $_POST['1Scrap'];
$1Repair = $_POST['1Repair'];
$1TotalQty = $_POST['1TotalQty'];

$2Scrap = $_POST['2Scrap'];
$2RaisedParts = $_POST['2RaisedParts'];
$2Repair = $_POST['2Repair'];
$2TotalQty = $_POST['2TotalQty'];

$3Repair = $_POST['3Repair'];
$3Scrap = $_POST['3Scrap'];
$3Repair = $_POST['3SmtRepair'];
$3RaisedParts = $_POST['3RaisedParts'];
$3TotalQty = $_POST['3TotalQty'];

$createdBy = $_POST['usersname'];

$sqlSelect = "SELECT * FROM wip.table1 WHERE JOB_NUMBER = '$jobNumber'";

$SQL = "INSERT INTO wip.table1
   ( job_number,
     1_Cut_Short_Amount,
     1_Scrap,
     1_Repair,
     1_Total_Qty,
     2_Scrap,
     2_Raised_Parts,
     2_Repair,
     2_Total_Qty,
     3_Repair,
     3_Scrap,
     3_Repair,
     3_Raised_Parts,
     3_Total_Qty
  )
    VALUES (
      '$jobNumber',
      '$1CutShortAmount',
      '$1Scrap',
      '$1Repair',
      '$1TotalQty',
      '$2Scrap',
      '$2RaisedParts',
      '$2Repair',
      '$2TotalQty',
      '$3Repair',
      '$3Scrap',
      '$3Repair',
      '$3RaisedParts',
      '$3TotalQty'
   )";

   $sql2 = "UPDATE wip.table1
            SET 1CUT_SHORT_AMOUNT = '$1CutShortAmount',
                1SCRAP = '$1Scrap',
                1REPAIR = '$1Repair',
                1TOTAL_QTY = '$1TotalQty',
                2SCRAP = '$2Scrap',
                2RAISED_PARTS = '$2RaisedParts',
                2SMT_REPAIR = '$2Repair',
                2TOTAL_QTY = '$2TotalQty',
                3REPAIR = '$3Repair',
                3SCRAP = '$3eScrap',
                3SMT_REPAIR = '$3SmtRepair',
                3RAISED_PARTS = '$3RaisedParts',
                3TOTAL_QTY = '$3TotalQty'
            WHERE JOB_NUMBER LIKE '$jobNumber'";

   if(oci_num_rows($sqlSelect) > 0){
     $stmt = oci_parse($DBC,$SQL2);

     $rc = oci_execute($stmt);
      if (!$rc)
      {
      $error = oci_error($stmt);
      var_dump($error);
      }

      oci_free_statement($stmt);
   }
   else
   {
     $stmt1 = oci_parse($DBC,$SQL);

     $rc = oci_execute($stmt1);
      if (!$rc)
      {
      $error = oci_error($stmt1);
      var_dump($error);
      }

      oci_free_statement($stmt1);
   }

Ответы [ 3 ]

3 голосов
/ 24 марта 2020

Oracle имеет синтаксис MERGE для одновременного выполнения таких операций обновления / вставки.

Вот пример, основанный на 3 столбцах вашей таблицы:

merge into wip.table1 t              -- target table
using (                              -- source table: pass your parameters here
    select 
        :job_number job_number, 
        :1_cut_short_amount 1_cut_short_amount, 
        :1_scrap 1_scrap 
    from dual
) s
on (s.job_number = t.job_number)      -- define the "match" condition
when matched then                     -- a record already exists: update
    update set 
        t.1_cut_short_amount = s.1_cut_short_amount,
        t.1_scrap = s.1_scrap
when not matched then                 -- no record yet: insert
    insert(job_number, 1_cut_short_amount, 1_scrap)
    values(s.job_number, s.1_cut_short_amount, s.1_scrap)
2 голосов
/ 24 марта 2020

Помимо ответа, данного GMB , переменные не могут начинаться с целого числа.

Однако вы можете использовать что-то вроде $_1 et c., Но не $1 et c.

Обратитесь к следующим сведениям о переменных по PHP. net:

Я цитирую из руководства:

Переменные в PHP представлены знаком доллара, за которым следует имя переменной. Имя переменной чувствительно к регистру.

Имена переменных следуют тем же правилам, что и другие метки в PHP. Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания. Как регулярное выражение, оно будет выражаться так: ^ [a-zA-Z_ \ x80- \ xff] [a-zA-Z0-9_ \ x80- \ xff] * $

Использование сообщения об ошибках также:

1 голос
/ 24 марта 2020

В Oracle вам необходимо сначала разобрать , выполнить , а затем извлечь до num_rows.

<?php

$stmt = oci_parse($DBC,$sqlSelect);

$rc = oci_execute($stmt);
$row=oci_fetch_array($stmt);
$jobExists=oci_num_rows($stmt)>0; 

   if($jobExists){
     $stmt = oci_parse($DBC,$SQL2);

     $rc = oci_execute($stmt);
      if (!$rc)
      {
      $error = oci_error($stmt);
      var_dump($error);
      }

      oci_free_statement($stmt);
   }
   else {
     $stmt1 = oci_parse($DBC,$SQL);
     $rc = oci_execute($stmt1);

      if (!$rc) {

        $error = oci_error($stmt1);
        var_dump($error);

      }

      oci_free_statement($stmt1);
   } 

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...