2016-12-12 3 views
0

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

Таблица уже существует и содержит уже половину данных, поэтому мне нужно обновить записи, а не вставлять их.

Это моя форма:

<form method="post" action="test.php" id="price-increase"></form> 
<div class="x_panel"> 
<div class="x_content">    
    <table id="tablePrice" class="display table table-striped table-bordered dt-responsive"> 
     <thead> 
      <tr> 
       <th>Item Code</th> 
       <th>Customer Increase</th> 
       <th>New Invoice</th> 
       <th>New Net</th> 
       <th>New Matrix</th> 
       <th>New Band A</th> 
       <th>Incresed Date</th> 
      </tr> 
     </thead> 
     <tbody> 
      <?php while($res = sqlsrv_fetch_array($sql, SQLSRV_FETCH_ASSOC)) : ?> 
       <tr> 
        <td><?php echo $res['ItemCode'];?></td> 
        <td> 
         <input type="text" name="customerIncrease" id="customerIncrease" class="form-control" value="<?php if(!empty($res['CustomerIncrease'])){echo $res['CustomerIncrease'];}?>"> 
        </td> 
        <td> 
         <input type="text" name="newInvoice" id="newInvoice" class="form-control" value="<?php if(!empty($res['NewInvoice'])){echo $res['NewInvoice'];}?>"> 
        </td> 
        <td> 
         <input type="text" name="newNet" id="newNet" class="form-control" value="<?php if(!empty($res['NewNet'])){echo $res['NewNet'];}?>"> 
        </td> 
        <td> 
         <input type="text" name="newMX" id="newMX" class="form-control" value="<?php if(!empty($res['NewMX'])){echo $res['NewMX'];}?>"> 
        </td> 
        <td><?php echo $res['NewBandA'];?> 
         <input type="text" name="newBandA" id="newBandA" class="form-control" value="<?php if(!empty($res['NewBandA'])){echo $res['NewBandA'];}?>"> 
        </td> 
        <td> 
         <input id="increaseDate" name="increaseDate" data-date-format="dd/mm/yyyy" class="form-control col-md-7 col-xs-12" required="required" type="text" value="<?php if(!empty($res['IncreaseDate'])){echo $res['IncreaseDate'];}?>"> 
        </td> 
       </tr> 
      <?php endwhile; ?> 
     </tbody>       
    </table>  
    <a href="test.php"> 
     <button type="submit" id="submit" name="submit" class="btn btn-success pull-right" value="Submit">Save</button> 
    </a> 
</div> 

Это мой PHP:

<?php 
if(isset($_POST['submit'])){ 
    $itemCode = (isset($_POST['ItemCode']) && !empty($_POST['ItemCode']))?$_POST['ItemCode'] : NULL; 
    $customerIncrease = (isset($_POST['CustomerIncrease']) && !empty($_POST['CustomerIncrease']))?$_POST['CustomerIncrease'] : NULL; 
    $newInvoice = (isset($_POST['NewInvoice']) && !empty($_POST['NewInvoice']))?$_POST['NewInvoice'] : NULL; 
    $newNet = (isset($_POST['NewNet']) && !empty($_POST['NewNet']))?$_POST['NewNet'] : NULL; 
    $newMX = (isset($_POST['NewMX']) && !empty($_POST['NewMX']))?$_POST['NewMX'] : NULL; 
    $newBandA = (isset($_POST['NewBandA']) && !empty($_POST['NewBandA']))?$_POST['NewBandA'] : NULL; 
    $increaseDate = (isset($_POST['IncreaseDate']) && !empty($_POST['IncreaseDate']))?$_POST['IncreaseDate'] : NULL; 
    $processed = (isset($_POST['Processed']) && !empty($_POST['Processed']))?$_POST['Processed'] : NULL; 

    $query = " UPDATE po_SupplierPriceIncrease 

       SET CustomerIncrease = '$customerIncrease', 
        NewInvoice = '$newInvoice', 
        NewNet = '$newNet', 
        NewMX = '$newMX', 
        NewBandA = '$newBandA', 
        IncreaseDate = '$increaseDate', 
        Processed = '$processed' 

       WHERE ItemCode = '$itemCode'; 
        "; 
    $stmt = sqlsrv_prepare($sapconn2, $query); 
    sqlsrv_execute($stmt); 
    return $stmt; 

    } 
?> 

Как я уже сказал, он не будет обновляться, и это не имеет ошибок. Я здесь что-то не так?

+0

Вы широко открыты для атак SQL Injection и должны использовать подготовленные заявления вместо конкатенации ваших запросов. Специально, поскольку вы даже не избегаете пользовательских входов. Подробнее: http://php.net/manual/en/function.sqlsrv-prepare.php –

ответ

1

Есть несколько недостатков с HTML формы:

  1. Форма тег немедленно закрывается после того, как он открыт - т.е. <form id="tablePrice"...></form> Так переместить закрывающий тег (т.е. </form>) после любых элементов формы, которые должны быть представленным.
  2. Код товара Код товара не отправляется на форму. Создайте ввод (возможно, он должен быть скрытым и/или только для чтения), чтобы отправить это значение - например. <td><input type="Number" name="ItemCode" value="<?php echo $res['ItemCode'];?>" readonly /></td>
  3. Поскольку input element не может иметь разрешенное содержание, они Самозакрывающиеся, поэтому добавьте (вперед) слэш (т.е. /) до конца каждого входного тега - <input type="text" name="NewMX" id="newMX" class="form-control" value="<?php if(!empty($res['NewMX'])){echo $res['NewMX'];}?>" />

Насколько возможность Обновите сразу несколько записей (для каждого вопроса), для этого вам, скорее всего, потребуется обновить ваш SQL-запрос UPDATE, чтобы иметь некоторую логику на основе значения ItemCode (например, с помощью CASE statements). И поля формы должны быть в формате массива (например, CustomerIncrease []) или иметь уникальные имена (возможно, с добавленным значением ItemCode -e. CustomerIncrease_1), чтобы связать различные значения с обновляемой строкой.

И как предложил @Magnus Eriksson, вы должны использовать подготовленный оператор (со связанными параметрами), чтобы избежать атак SQL-инъекций. Таким образом, вы можете упростить свой PHP-код, как показано ниже, используя третий параметр sqlsrv_prepare() - массив параметров.

PARAMS:
Массив, задающие информацию о параметрах при выполнении параметризованного запроса.

Примечание: вам нужно будет обновить случай имя атрибутов на <input> полей совпадают с именами в $ полей - например, <input type="text" name="NewNet"...>

if(isset($_POST['submit']) && $_POST['ItemCode']) { 
    //these fields should match the name attribute of the inputs in the form 
    $fields = array('CustomerIncrease','NewInvoice','NewNet','NewMX','NewBandA','IncreaseDate' ); 
    $params = array(); 
    $setFields = array(); 
    foreach($fields as $field) { 
     if (isset($_POST[$field]) && !empty($_POST[$field])) { 
      $params[] = &$_POST[$field]; 
      $setFields[] = $field.' = ?'; 
     } 
     else { 
      $setFields[] = $field.' = NULL'; 
     } 
    } 

    //optional : add ProcessedDate to setFields with value from GetDate()? 
    $params[] = &$_POST['ItemCode']; 

    $query = " UPDATE po_SupplierPriceIncrease 
      SET ".implode(', ',$setFields)." 
      WHERE ItemCode = ?"; 
    $stmt = sqlsrv_prepare($connection, $query,$params); 
    sqlsrv_execute($stmt); 
} 
0

Я не вижу ItemCode в html-коде, который делает $itemCode null.

Таким образом, эта часть вашего запроса:

WHERE ItemCode = '$itemCode' 

становится:

WHERE ItemCode = '' 

который является правильным запрос, следовательно, ошибок нет, хотя он не обновляет никаких записей.

Смежные вопросы