所以我正在将项目从基于XML的架构更新到mysql数据库。而且我试图弄清楚如何做这个功能 - 如果它可能的话。我想从数据库中获取一些行,其中值不等于数组中值的值。
function catchUpgrades($id)
{
$sql = "SELECT id, name, cost FROM upgrades WHERE prereq <> :id OR null <> :id";
$que = $this->db->prepare($sql);
$que->bindParam('id', $id[0]);
try {
$que->execute();
while($row = $que->fetch(PDO::FETCH_BOTH))
{
$array['name'] = $row[1];
$array['id'] = $row[0];
$array['cost'] = $row[2];
}
}catch(PDOException $e) {}
}
function showUpgrades()
{
$html = "<div id='upgrades'>";
$array = $this->getUserUpgrades();
$upgrades = $this->catchUpgrades($array);
print_r($upgrades);
}
答案 0 :(得分:3)
您可以绑定数组中的值。这个函数稍作改动 - 我添加了一个冒号,一个带有不同占位符名称的第二个绑定参数,以避免PDO冲突和返回值。显然otherColumnName
必须改变。如果这不是您的意图,请告诉我。我发表评论......
function catchUpgrades($id)
{
$sql = "SELECT id, name, cost FROM upgrades WHERE prereq <> :id OR otherColumnName <> :id2";
$que = $this->db->prepare($sql);
$que->bindParam(':id', $id[0]); //note the : before id
$que->bindParam(':id2', $id[0]); //note the : before id2
try {
$que->execute();
while($row = $que->fetch(PDO::FETCH_BOTH))
{
$array['id'] = $row[0];
$array['name'] = $row[1];
$array['cost'] = $row[2];
}
return $array;
} catch(PDOException $e) {}
}
然后,要调用该函数,您将得到如下所示的行:
$results_array = catchUpgrades($id);
答案 1 :(得分:2)
此谓词永远不会返回TRUE:
OR null <> :id
NULL是表示特殊“null”值的关键字。与NULL的不等式比较永远不会返回TRUE。
要测试:id
是否包含非NULL值,请使用ANSI标准"IS NOT NULL"
运算符,如下所示:
OR :id IS NOT NULL
作为非标准替代方案,您可以使用SQL特定的“null安全比较器”运算符,如下所示:
OR NOT (:id <=> NULL)
但是,你想要做那个测试是没有意义的,因为它与前一个谓词是多余的。
为:id
提供的值为NULL时,您想要什么行为?你想匹配每一行吗? (您的查询对我们用于搜索条件的模式看起来很熟悉,其中为bind参数提供NULL值会禁用搜索条件,如下所示:
WHERE ( prereq <> :id OR :id IS NULL )
如果为:id
提供的值是空值,则第二部分将返回TRUE,并且根本不考虑第一个条件的评估结果。对于:id
的非NULL值,第二个条件将为FALSE,因此第一个条件需要为TRUE才能返回一行。
(但这只是一个猜测,目前还不清楚你在那里做什么。)
另外注意,当我们在语句中多次使用相同的命名参数时,我们遇到了PDO的问题。 (当我们遇到问题时,PDO文档并未表明存在问题。)我们使用的解决方法是在语句中仅引用一个命名参数,方法是使所有命名参数都是唯一的。
解决方法是做这样的事情:
$sql = "SELECT id, name, cost FROM upgrades WHERE prereq <> :id1 OR :id2 IS NULL";
$que = $this->db->prepare($sql);
$que->bindParam(':id1', $id[0]);
$que->bindParam(':id2', $id[0]);
(我不确定这是否已在以后的PDO版本中修复;它可能不再是需要像这样的解决方法的问题。)
(我不确定是否回答了你的问题,但我试了一下。)