我想检查特定列中是否有特定值的行。
我会检查很多列,所以我决定为所有内容创建一个函数,而不是为每个东西创建一个函数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
问题:
我正在提供正确的信息,但它却给我一个无法找到该行的错误。
问题
为什么会这样?
我该如何解决这个问题?
答案 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 ));
// ...
}