我有一个非常简单的查询,当我不使用参数时可以工作。使用参数,它不返回任何内容。其他人在这里发布了同样的问题: 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文件调用的。
答案 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();