У меня странная проблема с дополнениями в SQL через скрипт php. У меня есть следующая форма в PL.php:
echo "<form id='editploptionform'>
<div class='table-row'>
<input type='hidden' name='id' value='".$row['id']."'>
<input type='hidden' name='order_id' value='".$row['order_id']."'>
<div class='table-column-options'><input type='text' name='edit_option_number' value='".$row['option_number']."'></div>
<div class='table-column-options2'><input type='text' name='edit_option_description' value='".$row['option_description']."'></div>
<input type='submit' value='Bewerk' class='edit'>
</div>
</form>
Эта форма обрабатывается с помощью скрипта jQuery в script.js:
$(document).on('submit', '#editploptionform', function() {
$.ajax({
type: 'POST',
data: $(this).serialize(),
url: "editploption.php",
success:function(data){
bootbox.alert("De optie is aangepast!", function(){
location.reload();
});
}
});
return false;
});
На editploption.php вызывается функция, которая обновляет параметр:
$obj = new PLQuery($_POST['order_id']);
$obj->doEditPlOption($_POST['id'], $_POST['order_id'], $_POST['edit_option_number'], $_POST['edit_option_description']);
Функция doEditPlOption () находится в классе PLQuery в PLQuery.php и выглядит следующим образом:
class PLQuery
{
private $hookup;
private $tableMaster3 = '[docgen].[dbo].[pl]';
public function doEditPlOption($id, $orderid, $optionnumber, $optiondescription)
{
$this->hookup=UniversalConnect::doConnect();
try
{
$updateresult = $this->hookup->query("UPDATE [docgen].[dbo].[pl] SET
order_id = '".$orderid."',
option_number = '".$optionnumber."',
option_description = '".$optiondescription."',
revision = (SELECT MAX( revision ) + 1 FROM pl where order_id = '".$orderid."')
WHERE id = '".$id."';
");
$updateresult->execute();
}
catch(PDOException $e)
{
echo $e;
}
$this->hookup = null;
}
}
Все отлично работает, кроме добавления в колонку ревизий в запросе. Это касается следующего фрагмента кода, где что-то идет не так:
revision = (SELECT MAX( revision ) + 1 FROM pl where order_id = '".$orderid."')
Каждый раз, когда выполняется функция doEditPlOption (), ревизия обновляется путем добавления 2 вместо 1. Так, например, ревизия — это сначала 2, что также является максимумом, затем после обновления ревизия должна быть 3, но по какой-то причине ревизия установить на 4.
Однако, когда я выполняю запрос непосредственно к базе данных SQL, используя, например, следующий запрос:
UPDATE [docgen].[dbo].[pl] SET
order_id = '217109',
option_number = '423',
option_description = 'vcvx',
revision = (SELECT MAX( revision ) + 1 FROM pl where order_id = '217109')
WHERE id = '7'
сложение работает правильно, что означает, что ревизия установлена на макс + 1. Я проверил, вызываю ли я функцию doEditPlOption () дважды, но это не так.
Что еще может вызвать странное поведение, описанное выше?
Я думаю, что он выполняется дважды, потому что вы уже вызвали свой запрос в первой строке, которая включает запрос, и он уже был выполнен, потому что это не подготовленный оператор. Затем после этого вы сделали $updateresult->execute();
который выполнил запрос еще раз .. Попробуйте удалить $updateresult->execute();
или подготовьте свой запрос первым.
Других решений пока нет …