如何在一个php变量中使用SET和INSERT?

时间:2016-10-26 05:32:48

标签: php mysql

这不是重复的问题,因为我问如何在一个PHP变量中使用SET和INSERT,对AUTO_INCREMENT没有任何疑问......

我的页面如下:

<?php

function genWO(){
    $dbtype = "MySQL";
    $username = "user";
    $password = "pass";
    $hostname = "10.10.10.10";
    $dbname = "TABLES";
    //connection to the database
    $conn = new mysqli($hostname, $username, $password);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
}

    $insertNewWONum = "SET @MAX_WO = (SELECT max(WO_NUM) + 1 from GENERIC_TABLES.WO_NUMBERS); INSERT INTO GENERIC_TABLES.WO_NUMBERS (WO_NUM, WO_REQUESTOR) values (@MAX_WO, `test`)";

    if ($conn->query($insertNewWONum) === TRUE) {
        echo "New record created successfully". "<br>";
    } else {
        echo "Error: " . $insertNewWONum . "<br>" . $conn->error;
    }

    $getWONum = "SELECT LPAD(max(WO_NUM) ,6,0) as NEW_WO_NUM from GENERIC_TABLES.WO_NUMBERS";
    $result = $conn->query($getWONum);

    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            echo "New WO Number: " . $row["NEW_WO_NUM"]. "<br>";
        }
    } else {
        echo "0 results";
    }

    //close the connection
    $conn->close();
    }

    ?>

由于不允许在一个查询中对同一个表使用INSERT和SELECT,我试图设置变量并在INSERT查询中使用它:

$insertNewWONum = "SET @MAX_WO = (SELECT max(WO_NUM) + 1 from GENERIC_TABLES.WO_NUMBERS); INSERT INTO GENERIC_TABLES.WO_NUMBERS (WO_NUM, WO_REQUESTOR) values (@MAX_WO, `test`)";

但它不起作用,但如果我在终端中使用此查询,它可以正常工作。

任何人都可以告诉我如何实现它吗?

1 个答案:

答案 0 :(得分:0)

  

由于不允许在一个查询中对同一个表使用INSERT和SELECT

除了您的方法的所有问题当然您可以在一个声明中使用INSERTSELECT

INSERT INTO WO_NUMBERS (WO_NUM, WO_REQUESTOR)
SELECT COALESCE(MAX(WO_NUM), 0) + 1, 'Test'
  FROM WO_NUMBERS;

以下是SQLFiddle演示。

现在您需要意识到的是,您的方法对于并发访问不安全。如果此代码同时从两个或多个会话执行,则它们中的一些或全部可能生成相同的数字,从而有效地破坏您的应用程序。

请改用AUTO_INCREMENT

CREATE TABLE WO_NUMBERS
(
  WO_NUM INT PRIMARY KEY AUTO_INCREMENT,
  WO_REQUESTOR VARCHAR(32)
);

INSERT INTO WO_NUMBERS (WO_REQUESTOR) VALUES ('Test');

以下是SQLFiddle演示。

如果出于某种原因,您无法直接使用AUTO_INCREMENT(我老实说也不明白您为什么不能这样做),即您需要添加前缀或增加生成的ID /您可以通过某种方式查看代码this answer