SQL 通过 php 脚本添加的行为异常
SQL addition through php script is behaving strangely
我在通过 php 脚本添加 SQL 时遇到了一个奇怪的问题。我在 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>
此表单通过 script.js 中的 jQuery 脚本处理:
$(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.php 中的 class PLQuery 中,如下所示:
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()函数执行时,revision都是加2而不是1来更新的。所以比如revision先是2,也是max,那么更新后revision应该是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'
添加工作正常,这意味着修订设置为 max + 1。我检查了我是否调用函数 doEditPlOption() 两次,但事实并非如此。
还有什么可能导致上述奇怪的行为?
我认为它被执行了两次,因为您已经在包含查询的第一行调用了查询并且它已经被执行,因为它不是准备好的语句。然后你做了 $updateresult->execute();
再次执行查询。尝试删除 $updateresult->execute();
或先准备你的查询。
我在通过 php 脚本添加 SQL 时遇到了一个奇怪的问题。我在 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>
此表单通过 script.js 中的 jQuery 脚本处理:
$(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.php 中的 class PLQuery 中,如下所示:
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()函数执行时,revision都是加2而不是1来更新的。所以比如revision先是2,也是max,那么更新后revision应该是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'
添加工作正常,这意味着修订设置为 max + 1。我检查了我是否调用函数 doEditPlOption() 两次,但事实并非如此。
还有什么可能导致上述奇怪的行为?
我认为它被执行了两次,因为您已经在包含查询的第一行调用了查询并且它已经被执行,因为它不是准备好的语句。然后你做了 $updateresult->execute();
再次执行查询。尝试删除 $updateresult->execute();
或先准备你的查询。