2017-09-22 10 views
1

Je tente de créer une API pour renvoyer des données à partir de mySQL. J'essaie toujours de comprendre le PDO. J'ai la requête ci-dessous qui devrait retourner toutes les lignes de la base de données, en fonction d'un seul paramètre, mais j'ai remarqué qu'il renvoie souvent 1 moins que ce qui devrait être retourné. Quand il y a 2 lignes, elle renvoie 1, quand il y a 1 ligne, elle ne retourne rien.Requête SQL PDO renvoyant moins de lignes que prévu

J'ai joint une capture d'écran des résultats de la base de données.

Toutes les suggestions seraient appréciées.

[![<?php 
// required header 
header("Access-Control-Allow-Origin: *"); 
header("Content-Type: application/json; charset=UTF-8"); 

// include database and object files 
include_once '../config/database.php'; 
include_once '../objects/casualty.php'; 

// instantiate database and casualty object 
$database = new Database(); 
$db = $database->getConnection(); 

// initialize object 
$casualty = new casualty($db); 

// set ID property of record to read 
$casualty->id = isset($_GET\['id'\]) ? $_GET\['id'\] : die(); 

// query categorys 
$stmt = $casualty->cemetery(); 
$num = $stmt->rowCount(); 

// check if more than 0 record found 
if($num>0){ 

    // products array 
    $casualtys_arr=array(); 
    $casualtys_arr\["records"\]=array(); 

    // retrieve our table contents 
    // fetch() is faster than fetchAll() 
    // http://stackoverflow.com/questions/2770630/pdofetchall-vs-pdofetch-in-a-loop 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
     // extract row 
     // this will make $row\['name'\] to 
     // just $name only 
     extract($row); 

     $casualty_item=array(
      "ID" => $ID, 
      "Filename" => $fldgraphicname, 
      "Surname" => $fldsurname, 
      "FirstNameInitial" => $fldfirstnameinitial 

     ); 

     array_push($casualtys_arr\["records"\], $casualty_item); 
    } 

    echo json_encode($casualtys_arr); 
} 

else{ 
    echo json_encode(
     array("message" => "No Casualties found.") 
    ); 
} 
?> 
<?php 
class casualty{ 

    // database connection and table name 
    private $conn; 
    private $table_name = "tblcasualty"; 

    // object properties 
    public $id; 
    public $fldgraphicname; 
     public $fldsurname; 
     public $fldfirstnameinitial; 

    public function __construct($db){ 
     $this->conn = $db; 
    } 

    public function cemetery(){    
     // query to read single record 
        $query = "SELECT * 
         FROM 
          tblnames 
         WHERE 
          tblcemetery_ID = ? 
          ORDER BY ID 
         "; 
     $stmt = $this->conn->prepare($query); 

     // bind id of product to be updated 
     $stmt->bindParam(1, $this->id, PDO::PARAM_INT); 

     // execute query 
     $stmt->execute(); 

     // get retrieved row 
     $row = $stmt->fetch(PDO::FETCH_ASSOC); 

     // set values to object properties 
     $this->fldgraphicname = $row\['fldgraphicname'\]; 
     $this->fldsurname = $row\['fldsurname'\]; 
     $this->fldfirstnameinitial = $row\['fldfirstnameinitial'\];  

      return $stmt; 
    }   

} 
?>][1]][1] 

Répondre

1

Dans votre fonction cemetery vous un fetch. Cela fait avancer le curseur d'une position donc quand vous revenez à votre script principal et utilisez le fetch vous êtes toujours sur la deuxième rangée.

Solutions:

  1. boucle la fetch dans la fonction et il suffit de retourner un tableau de toutes les valeurs.

ou

  1. Ne pas fetch dans la fonction et retourner le jeu de résultats afin que vous puissiez fetch le bloc complet.