1

この関数は整数の配列を取ります

  $this->grades

この配列のサイズは、ユーザーの入力内容によって異なります。1 つの数字だけで完全に機能させることができますが、複数の数字を試すと問題が発生します。エンコードする前に、何らかの形で応答を連結する必要がありますか? または、これを実行するより効率的な方法はありますか?

 private function retrieve_standards_one(){
    $dbh = $this->connect();
    for($x = 0; $x < (count($this->grades)); $x++){
    $stmt = $dbh->prepare("SELECT code, standard_one_id 
                           FROM standard_one 
                           WHERE grade_id = :grade_id 
                           ORDER BY standard_one_id");
    $stmt->bindParam(':grade_id', $this->grades[$x], PDO::PARAM_STR);
    $stmt->execute();
    $stnd = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    $json = json_encode($stnd);
    return $json;
}
4

3 に答える 3

2

配列を使用して結果を保存し、配列をエンコードするだけです

 private function retrieve_standards_one(){
    $dbh = $this->connect();
    $data = array();
    for($x = 0; $x < (count($this->grades)); $x++){
    $stmt = $dbh->prepare("SELECT code, standard_one_id 
                           FROM standard_one 
                           WHERE grade_id = :grade_id 
                           ORDER BY standard_one_id");
    $stmt->bindParam(':grade_id', $this->grades[$x], PDO::PARAM_STR);
    $stmt->execute();
    $data[] = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    $json = json_encode($data);
    return $json;
}
于 2012-12-24T23:00:11.497 に答える
1

問題はこれです:

$stnd = $stmt->fetchAll(PDO::FETCH_ASSOC);

ループを通過するたびに、 の内容を上書き$stndします。そうです、正しく機能させるためには、代わりに個々の結果を全体の配列に追加してから、配列をエンコードする必要があります。

これは、配列を利用し、ループの反復ごとに不必要にクエリを再準備しない、関数の書き直されたバージョンです。

private function retrieve_standards_one(){
    $dbh = $this->connect();
    $stmt = $dbh->prepare("SELECT code, standard_one_id 
                           FROM standard_one 
                           WHERE grade_id = :grade_id 
                           ORDER BY standard_one_id");
    $stnd = array();
    for($x = 0; $x < (count($this->grades)); $x++){
        $stmt->bindParam(':grade_id', $this->grades[$x], PDO::PARAM_STR);
        $stmt->execute();
        $stnd[] = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    return json_encode($stnd);
}

注: この$stnd = array();行は厳密に必須というわけではありませんが、$this->grades要素が 0 の場合にクラッシュを防ぐことができます。

于 2012-12-24T23:00:19.390 に答える
1

数値の配列を渡したい場合は、次のようにします。

<?php

$grades = array(1,2,3,4,5);

private function retrieve_standards_one($grades)
{
    // ensure only numbers get into the SQL statement
    $grade_ids = array();
    foreach ($grades as $grade) {
        if (is_numeric($grade)) {
            $grade_ids[] = $grade;
        }
    }
    $grade_ids = implode(',', $grade_ids);

    $dbh = $this->connect();
    $sql = "SELECT code, standard_one_id
            FROM standard_one
            WHERE grade_id IN ($grade_ids)
            ORDER BY standard_one_id";
    $stmt = $dbh->query($sql);
    $stmt->execute();
    $stnd = $stmt->fetch(PDO::FETCH_ASSOC);
    $json = json_encode($stnd);
    return $json;
}
于 2012-12-24T23:00:49.243 に答える