1

这个函数接受一个整数数组

  $this->grades

这个数组的大小取决于用户输入的内容。我只用一个数字就可以让它完美地工作,但是当我尝试多个数字时,我遇到了问题。在对它们进行编码之前,我是否需要以某种方式将响应连接在一起?还是有更有效的方法来运行它?

 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 回答