2017-10-19 22 views
2

J'ai essayé d'obtenir l'ID max de la base de données. Cependant, il me renvoie l'erreurImpossible d'obtenir l'ID max de la base de données

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

Ceci est mon code

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']; 
} 

Il y a un identifiant d'appel de colonne dans ma table de commerce. Je ne sais pas quelle partie est erronée. Peut-être que je manque une partie.

+1

$ queryInit = "CHOISIR MAX (id) comme identifiant FROM trade"; essayez de changer votre requête. –

+0

@scarletwitch J'ai changé la requête mais je reçois toujours la même erreur – phoon

+0

pouvez-vous afficher les '$ response' et' $ rowsInit'? – lighter

Répondre

2

Remplacez cette

SELECT MAX(id) FROM trade 

ce

SELECT MAX(id) AS id FROM trade 

Et

changement à ce

$maxID=$rowsInit["id"]; 

cette

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

Comme je sais que les données indexées avec 0 Tirée par les cheveux.Check these examples


En cas d'échec ajouter cette print_r($rowsInit);die; à côté de if ($rowsInit) { et vérifier comment il placé dans le tableau

+0

pouvez-vous ajouter SELECT MAX (id) AS ID de commerce à votre réponse aussi? Ensuite, je peux l'accepter comme réponse finale – phoon

+0

@downvoer s'il vous plaît spécifier une raison? ne soyez pas impoli/** jaloux ** –

+1

Cette réponse n'explique pas ce qui ne va pas dans le code, pourquoi cela ne fonctionne pas. Alors que vos suggestions résolvent effectivement le problème, quels sont les lecteurs qui apprennent de cette réponse? Ils apprennent qu'ils peuvent lancer leurs problèmes [alors] et quelqu'un les résoudra. – axiac

4

Alias ​​L'appel en fonction comme id:

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

Vous devez également récupérer les données de la première rangée. Fournissez donc aussi l'index des lignes. Essayez

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

Même erreur, index indéfini: id dans la ligne 22 et 23 qui est $ maxID = $ rowsInit ["id"]; et $ response ["maxID"] = $ rowsInit ["id"]; – phoon

+1

Vous devez également récupérer les données de la première ligne. Fournissez donc aussi l'index des lignes. Essayez '$ rowsInit [0] [" id "]' – GurV

0

La requête se lit comme suit:

SELECT MAX(id) FROM trade 

Pourquoi est-ce que vous attendez d'avoir une colonne nommée id dans le jeu de résultats? Il n'y a pas une telle colonne dans la clause SELECT. Il n'y a que l'expression MAX(id) et sa colonne dans le resultset est nommé MAX(id) sauf si vous fournissez un alias pour elle:

SELECT MAX(id) AS id FROM trade 

En savoir plus sur la syntaxe de la SELECT statement.

$rowsInit n'a toujours pas un indice id en raison de:

$rowsInit = $stmtInit->fetchAll(); 

PDOStatement::fetchAll() retourne un tableau de lignes. Vous devez utiliser soit $rowsInit = $stmtInit->fetchAll()[0]; ou, mieux encore, utiliser PDOStatement::fetch() pour obtenir uniquement la première ligne (le jeu de résultats contient exactement une ligne, de toute façon):

$rowsInit = $stmtInit->fetch(); 
1

AOP est beaucoup plus que tout le monde prend pour. A côté de fetchAll() omniprésente, il y a des méthodes pour obtenir le résultat dans une douzaine d'autres formats, y compris une seule valeur scalaire, donc vous n'aurez pas à modifier votre requête comme cela a été suggéré dans d'autres réponses. Donc, en fait, vous avez juste besoin une seule ligne pour obtenir l'ID max:

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

Notez que vous n'avez pas à préparer une requête s'il n'y a pas des espaces réservés à l'intérieur. Quoi de plus important, votre idée sur le error reporting est également erronée. Vous ne devriez jamais divulguer le message d'erreur système réel à l'extérieur. Seul un message d'erreur générique doit être renvoyé.

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

ici vous achevons votre code entier dans un bloc catch global essayer qui traitera non seulement des exceptions AOP mais aussi toute autre exception qui peut se produire.