mysql PDO获取ID不等于数组的数据[重复]

p1iqtdky  于 2022-12-17  发布在  Mysql
关注(0)|答案(3)|浏览(157)

此问题在此处已有答案

(9个答案)
1小时前关闭。
所以我正在把我的项目从基于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);

}
siotufzp

siotufzp1#

此述词永远不会传回TRUE:

OR null <> :id

NULL是一个代表特殊“null”值的关键字。与NULL进行不等式比较将永远不会返回TRUE。
要测试:id是否包含非NULL值,请使用ANSI标准"IS NOT NULL"运算符,如下所示:

OR :id IS NOT NULL

作为一种非标准的替代方法,您可以使用SQL特定的“null safe comparator”操作符,如下所示:

OR NOT (:id <=> NULL)

但是,您想要执行该测试是没有意义的,因为它与前面的 predicate 是冗余的。
当为:id提供的值为NULL时,您希望采取什么行为?您希望匹配每一行吗?(您的查询看起来与我们用于搜索条件的模式很熟悉,其中为bind参数提供NULL值将禁用搜索条件,如下所示:

WHERE ( prereq <> :id OR :id IS NULL )

如果为:id提供的值为空值,则第二部分将返回TRUE,并且第一个条件的计算结果与此无关。如果:id的值为非空值,则第二个条件将为FALSE,因此第一个条件必须为TRUE才能返回行。
(But这只是一个猜测,不清楚您在那里尝试做什么。)
另外,当我们在一个语句中多次使用同一个命名参数时,我们遇到了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的后续版本中得到了修复;它可能不再是一个需要像这样的解决方案的问题。)
(我不确定这是否能回答你的问题,但我试过了。)

dgtucam1

dgtucam12#

你可以绑定一个数组中的值。这个函数需要做一些细微的改动--我添加了一个冒号,第二个绑定参数使用不同的占位符名称以避免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);
ih99xse1

ih99xse13#

这个问题已经问了8年了,但是如果碰巧有人在寻找类似的问题,这可能会有所帮助

prereq != :id OR :id != null

OU:

prereq != ? OR id != ?
$que->execute([$id1, $id2]);

相关问题