PHP函数checkInfo动态,不起作用

时间:2013-05-05 18:04:07

标签: php oop pdo

我想检查特定列中是否有特定值的行。

我会检查很多列,所以我决定为所有内容创建一个函数,而不是为每个东西创建一个函数specific

    public function checkInfo($column, $parm)
    {
        $this->check = $this->pdo->prepare("SELECT * FROM recoveries WHERE :column = :parm");
        $this->check->execute(array( ":column" => $column, ":parm" => $parm ));

        if ($this->check->rowCount())
        {
            return true;
        }
        else
        {
            throw new exception ("Could not find recovery ".$parm.", ".$column."");
        }
    }

变量列:列名。

可变参数:参数名称(无论用户在表单中发布了什么内容)。

这就是我检查其行数的方式:

    $column = 'recovery_email'; 
    try
    {
        $recover->checkInfo('recovery_email', $_POST['email']);
        echo
        '
            <form action="check.php" method="post">
                <input type="text" name="id">
                <button type="submit" class="btn">Continue</button>
            </form>
        ';
    }
    catch (Exception $t)
    {
        echo '<div class="alert alert-error">'.$t->getMessage().', <a href="check.php">Go back</a></div>';
    }

结果:

 Could not find recovery
  • 列名称正确无误。
  • Parm是正确的(从数据库中取出)。

问题:

我正在提供正确的信息,但它却给我一个无法找到该行的错误。

问题

为什么会这样?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您无法绑定列名称。绑定参数仅适用于值。

但即使你可以 - 如果你的表中不存在列,即使是语法上有效的列名也会产生SQL错误。

  • 首先,检查列是否存在并允许查询。有很多方法可以做到这一点 - 最简单的方法是使用in_array函数。

  • 然后通过字符串连接(或插值)将列名插入SQL语句,并仅绑定列值。

您的方法如下所示:

public function checkInfo($column, $parm)
{
    if(!in_array($column, array('recovery_email', 'my_column2', 'my_column3')))
    {
        throw new exception ("Unknown column: ".$column);
    }

    $this->check = $this->pdo->prepare("SELECT * FROM recoveries WHERE $column = :parm");
    $this->check->execute(array( ":parm" => $parm ));

    // ... 
}