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

问题描述:

我试图从数据库中获取最大ID。然而,它返回我的错误无法从数据库中获取最大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。我不知道哪部分是错的。也许我想念一些部分。

+1

$ queryInit =“SELECT MAX(id)as id FROM trade”; 尝试更改您的查询。 –

+0

@scarletwitch我改变了查询,但仍然收到相同的错误 – phoon

+0

你可以显示'$ response'和'$ rowsInit'吗? – lighter

更改为

SELECT MAX(id) FROM trade 

SELECT MAX(id) AS id FROM trade 

改变这

$maxID=$rowsInit["id"]; 

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

据我所知获取的数据索引与0Check these examples


如果无法添加此print_r($rowsInit);die;旁边if ($rowsInit) {,并检查它是如何放置在阵列

+0

你可以添加SELECT MAX(id)AS id FROM trade到你的答案吗?那么我可以接受它作为最终答案 – phoon

+0

@ downvoer请指定一个理由?不要粗鲁/ **嫉妒** –

+1

这个答案没有解释代码中的错误,为什么它不起作用。虽然你的建议确实解决了这个问题,但读者从这个答案中学到了什么?他们知道他们可以将问题抛出[所以]并且有人会解决它们。 – axiac

别名的函数调用id

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

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

$rowsInit[0]["id"] 
+0

同样的错误,未定义的索引:第22行和第23行中的id是$ maxID = $ rowsInit [“id”];和$ response [“maxID”] = $ rowsInit [“id”]; – phoon

+1

您还需要获取第一行的数据。所以也要提供行索引。尝试'$ rowsInit [0] [“id”]' – GurV

查询写着:

SELECT MAX(id) FROM trade 

为什么你期望有一个名为列在结果集idSELECT子句中没有这样的列。只有在MAX(id)表达及其在ResultSet列被命名为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(); 

PDO是远远超过大家正在它。除了omniprescent 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异常而且任何其他异常可能发生的。