PHP PDO查询在没有参数但不在

时间:2015-05-19 12:33:56

标签: php mysql pdo

我有一个非常简单的查询,当我不使用参数时可以工作。使用参数,它不返回任何内容。其他人在这里发布了同样的问题: Query with input parameters doesn't work whereas direct query works

然而没有人回答。以下是我的代码。

require_once('database.class.php');

class Plan extends Database {
    public function getBenefitAmounts($plan_id, $group_id, $level) {
        $sql = 'SELECT DISTINCT benefit FROM rates WHERE plan_id = :plan AND group_id IS NULL AND `level` = :lvl';
        $params = array(':plan'=>896, ':lvl'=>1);
        $this->sqlQuery($sql, $params);

        // $sql = 'SELECT DISTINCT benefit FROM rates WHERE plan_id = 896 AND group_id IS NULL AND `level` = 1';
        // $this->sqlQuery($sql);

        $results = $this->sth->fetchAll(PDO::FETCH_COLUMN);

        $options = '';
        foreach ($results as $value) {
            $options .= '<option value="' . $value . '">$' . $value . '</option>';
        }

        return $options;
    }
}

在数据库类中:

public function sqlQuery($sql, $values_to_bind=null) {

    $this->sth = $this->pdo->prepare($sql);

    if (isset($values_to_bind)) {
        foreach ($values_to_bind as $param => $value) {
            $this->sth->bindValue($param, $value);
        }
    }
    $success = $this->sth->execute();
    if (!$success) {
        $arr = $this->$sth->errorInfo();
        print_r($arr);
    }
}

第一个代码片段中注释掉的代码工作得很好,但是使用参数时,它什么都不返回。 getBenefitAmounts函数是从另一个使用JQuery get调用的PHP文件调用的。

3 个答案:

答案 0 :(得分:0)

您是否尝试添加bindValue()可选的第三个参数。它可以像PDO :: PARAM_INT,PDO :: PARAM_STR等。只是尝试调试,看看它是否有帮助。

答案 1 :(得分:0)

如果您使用没有感知代码,我不知道您为什么如此喜欢try...catch。因为这种技术:} catch (PDOException $e) { throw new PDOException($e);}} catch (PDOException $e) {;}的意思相同,就像你要求php在catch时不做任何事情一样。如果你什么都不做的话,你为什么要求抓住它?

现在我猜测如何修复你的代码:

public function sqlQuery($sql, $values_to_bind=null) {
    $this->sth = $this->pdo->prepare($sql);

    if (isset($values_to_bind)) {
        foreach ($values_to_bind as $param => $value) {
            $this->sth->bindValue($param, $value);
        }
    }
    $success  = $this->sth->execute();
    if (!$success) {
        $arr = $this->$sth->errorInfo();
        print_r($arr);
    }

}

顺便提一句,您使用$this->sth = $this->pdo->prepare($sql);表示您的sqlQuery函数是您未向我们展示的某个类的方法。你的第一段代码是在那个类之外的某个地方?如果您发布完整版本的代码,而不仅仅是您认为涉及的行,那会更好。

在这里你可以切换到常规方式:

    //$results = $this->sth->fetchAll(PDO::FETCH_COLUMN); //you don't need it

    $options = '';
    while ($row  = $this->sth->fetch(PDO::FETCH_ASSOC)) {
        $options .= '<option value="' . $row['benefit'] . '">$' . $row['benefit'] . '</option>';
    }

答案 2 :(得分:-1)

为什么不使用bindParam绑定参数?

$plan = 896;
$lvl = 1;

$sth = $dbh->prepare("SELECT DISTINCT benefit FROM rates WHERE plan_id = :plan AND group_id IS NULL AND `level` = :lvl");
$sth->bindParam(":plan", $plan);
$sth->bindParam(":lvl", $lvl);
$sth->execute();
$r = $sth->fetchAll();