PDO获取数据,其中id不等于数组

时间:2014-04-02 20:36:40

标签: php mysql sql pdo

所以我正在将项目从基于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);


}

2 个答案:

答案 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版本中修复;它可能不再是需要像这样的解决方法的问题。)

(我不确定是否回答了你的问题,但我试了一下。)