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(); 或先准备你的查询。