【问题标题】:Unable to get max id from database无法从数据库中获取最大 ID
【发布时间】:2018-03-31 03:00:12
【问题描述】:

我试图从数据库中获取最大 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 列。我不知道哪一部分是错的。也许我错过了一些部分。

【问题讨论】:

  • $queryInit="SELECT MAX(id) as id FROM trade";尝试更改您的查询。
  • @scarletwitch 我已更改查询但仍收到相同的错误
  • 你能显示$response$rowsInit吗?
  • @lighter $response["maxID"] 为空

标签: php sql database mysqli


【解决方案1】:

将函数调用别名为id

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

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

$rowsInit[0]["id"]

【讨论】:

  • 同样的错误,未定义的索引:第 22 行和第 23 行的 id 是 $maxID=$rowsInit["id"];和 $response["maxID"] = $rowsInit["id"];
  • 您还需要获取第一行的数据。所以也提供行索引。试试$rowsInit[0]["id"]
【解决方案2】:

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】:

    改成

    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 为索引。 Check these examples


    如果失败,请将此 print_r($rowsInit);die; 添加到 if ($rowsInit) { 旁边并检查它在数组中的放置方式

    【讨论】:

    • 您也可以将 SELECT MAX(id) AS id FROM trade 添加到您的答案中吗?然后我可以接受它作为最终答案
    • @downvoer 请说明原因?不要粗鲁/嫉妒
    • 这个答案没有解释代码中有什么问题,为什么它不起作用。虽然您的建议确实解决了问题,但读者从这个答案中学到了什么?他们了解到他们可以将问题提交给Stack Overflow,有人会解决它们。
    • @axiac 被提到了这里有什么问题$maxID=$rowsInit[0]["id"] 访问方法错误。那么还有什么要发布的呢??
    • @axiac 他们知道他们可以将他们的问题扔到 Stack Overflow 上,并且确实有人会解决它们。我们在这里分享我们的知识来解决他们的问题。如果你说NO,那么离开Stack,写文章会让你开心:P
    【解决方案4】:

    查询内容如下:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多