繁体   English   中英

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

[英]How to use SET and INSERT in one php variable?

这不是重复的问题,因为我要问如何在一个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`)";

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

谁能让我知道如何实现它?

由于不允许在一个查询中对同一张表使用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 /代码,则可以查看此答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM