无法从数据库中获取最大ID

时间:2017-10-19 06:07:41

标签: php sql database mysqli

我试图从数据库中获取最大ID。但是,它会返回错误

  

undefined index: id in $maxID=$rowsInit["id"]; and $response["maxID"] = $rowsInit["id"];

这是我的代码

if ($_POST['maxID'] == 0) {
    $queryInit = "SELECT MAX(id) FROM trade";
    try {
        $stmtInit = $db->prepare($queryInit);
        $resultInit = $stmtInit->execute();
    } catch (PDOException $ex) {
        $response["success"] = 0;
        $response["message"] = $ex;
        die(json_encode($response));
    }

    $rowsInit = $stmtInit->fetchAll();

    if ($rowsInit) {
        $maxID = $rowsInit["id"];
        $response["maxID"] = $rowsInit["id"];
    } else {
        $response["success"] = 0;
        $response["message"] = "No Trade Available!";
        die(json_encode($response));
    }
} else {
    $maxID = $_POST['maxID'];
}

我的交易表中有一个列调用ID。我不知道哪个部分是错的。也许我错过了一些部分。

4 个答案:

答案 0 :(得分:4)

将函数调用别名为id

$queryInit="SELECT MAX(id) as id FROM trade";

您还需要获取第一行的数据。所以也提供行索引。试试

$rowsInit[0]["id"]

答案 1 :(得分:2)

将此更改为

SELECT MAX(id) FROM trade

SELECT MAX(id) AS id FROM trade

将此更改为

$maxID=$rowsInit["id"];

$maxID=$rowsInit[0]["id"]; # or  $maxID=$rowsInit[0]->id

我知道用0索引的Fetched数据。 Check these examples

  

如果失败,请在print_r($rowsInit);die;旁边添加此if ($rowsInit) {并检查其在阵列中的放置方式

答案 2 :(得分:1)

PDO远远超过每个人的需求。除了无所不在的fetchAll()之外,它还有一些方法可以以十几种其他格式获取结果,包括单个标量值,因此您不必像其他答案中所建议的那样更改查询。实际上,您只需一行即可获得最大ID:

 $id = $pdo->query("SELECT MAX(id) FROM trade")->fetchColumn();

请注意,如果查询中没有占位符,则无需准备查询。

更重要的是,您对error reporting的想法也是错误的。您永远不应该泄露外部的实际系统错误消息。只应返回一般错误消息。

try {
    if ($_POST['maxID'] == 0) {
        $maxID = $pdo->query("SELECT MAX(id) FROM trade")->fetchColumn();
        if (!$rowsInit) {
            $response["success"] = 0;
            $response["message"] = "No Trade Available!";
            die(json_encode($response));
        }
    } else {
        $maxID = $_POST['maxID'];
    }

    // here goes your code to get the response

} catch (Exception $ex) {
    log_error($ex);
    $response["success"] = 0;
    $response["message"] = "Server error";
    die(json_encode($response));
}

在这里,您将整个代码包装在一个全局try catch块中,该块不仅可以处理可能发生的PDO异常,还可以处理任何其他异常

答案 3 :(得分:0)

查询显示:

SELECT MAX(id) FROM trade

为什么您希望在结果集中有一个名为id的列? SELECT子句中没有这样的列。只有MAX(id)表达式,并且结果集中的列名为MAX(id),除非您为其提供alias

SELECT MAX(id) AS id FROM trade

详细了解SELECT statement的语法。

$rowsInit仍然没有id索引,因为:

$rowsInit = $stmtInit->fetchAll();

PDOStatement::fetchAll()返回一组行。你应该使用$rowsInit = $stmtInit->fetchAll()[0];,或者更好的是,使用PDOStatement::fetch()来获取第一行(结果集中只包含一行):

$rowsInit = $stmtInit->fetch();