将PDO与SELECT选项一起使用

时间:2014-03-18 13:57:30

标签: php mysql pdo

我尝试将PDO用于SELECT选项,这是我的functions.php代码:

<?php
    class Benefits
    {
        public function fetch_all()
        {
            global $pdo;

            $benfitssql = $pdo->query('SELECT * FROM lkup_benefits');
            //$benfitssql->execute();

            while ($row = $benfitssql->fetch(PDO::FETCH_ASSOC))
            {
                $ops.= "<option value='" . $row['BenefitOption'] . "'>"
                    . $row['Benfits'] . "</option>";
            }
        }
    }
?>

这是我的主页:

<label>Benefit Type</label>

<select class="select2_category form-control" data-placeholder="Choose a Category" tabindex="1" id="benefittype" name="benefittype">
    <?php echo $ops; ?>
</select>

当我选择SELECT选项时,它会打开而没有记录,为什么会这样,我错过了什么?

2 个答案:

答案 0 :(得分:2)

您的代码存在两个基本缺陷

首先,你不应该在函数内部格式化HTML,
第二,你应该返回来自函数的东西

class Benefits {
    public function fetch_all() {
        global $pdo;
        return $pdo->query('SELECT * FROM lkup_benefits') ->fetchAll();
    }
}
?>
<label>Benefit Type</label>
<select class="select2_category form-control" data-placeholder="Choose a Category" tabindex="1" id="benefittype" name="benefittype">
<?php foreach ($benefits->fetch_all() as $row): ?>
    <option value="<?=$row['BenefitOption']?>"><?=$row['Benfits']?></option>
<?php endforeach ?>
</select>

答案 1 :(得分:0)

添加你的常识的答案,他说的一切都是正确的,但他忘了(你忘了吧?)一个重要的细节: Globals are evil! < / p>

如果您的函数需要PDO对象才能工作,只需要它!

class Benefits {
    public function fetch_all(PDO $pdo) { //Ask for what you need in the constructor!
        return $pdo->query('SELECT * FROM lkup_benefits') ->fetchAll();
    }
}
?>
<label>Benefit Type</label>
<select class="select2_category form-control" data-placeholder="Choose a Category" tabindex="1" id="benefittype" name="benefittype">
<?php foreach ($benefits->fetch_all($pdo) as $row): //Pass it in when you need it! ?>
    <option value="<?=$row['BenefitOption']?>"><?=$row['Benfits']?></option>
<?php endforeach; ?>
</select>

这使得你的类变得更加灵活,你现在不会默默地依赖于这样一个事实:有一个名为$ pdo的全局对象并且是PDO类型的,代码将不起作用,而且它是现在很清楚!

还有其他问题,例如将数据获取逻辑与表示逻辑混合在一起,但这超出了本问题的范围。