gpt4 book ai didi

php - 当变量为 false 时的 Where 子句不将其考虑到 SQL 查询中?

转载 作者:IT老高 更新时间:2023-10-29 00:16:18 25 4
gpt4 key购买 nike

我有一些我不太明白的东西,我有解决方案,但我不知道为什么,这让我有点抓狂

Controller

DB::connection()->enableQueryLog();

$transfer = Transfer::where('ticket_id', $last_ticket)->where('event_id', 36)->where('buyer', $user_email)->first();

$queries = DB::getQueryLog();

dd($queries);

结果

array:1 [
0 => array:3 [
"query" => "select * from `transfers` where `ticket_id` = ? and `event_id` = ? and `buyer` = ? limit 1"
"bindings" => array:3 [
0 => false
1 => 36
2 => "[email protected]"
]
"time" => 0.36
]
]

情况:数据库中的$last_ticket 是唯一的,绝不是null、空或false

在我的示例中,$last_ticketfalse,但是在 DB 中没有任何 false,为什么我仍然得到结果?

是不是因为每当条件为假时,它就不会将其纳入等式?

所以问题是:我该怎么做才能收到正确的结果含义:如果 $last_ticket 为 false 则没有结果,如果它有一些数据,则返回受 $last_ticket 限制的行结果

一种选择可能是把 if($last_ticket == false){$last_ticket='randomInexistentString_ag4dh&2g32y4t'} 所以它不是空或零,但我不认为这是更漂亮的方式

最佳答案

MySQL 中的零总是匹配任何不以数字开头的字符串——这是因为它希望比较的两边是同一类型,所以它将字符串转换为数字,而任何字符串不以数字开头计算为 0自动。

现在,你不是给它一个 0 - 但你给它喂了一个false ,在 MySQL 中,这不是一个真正的 bool 值,而是一个 0。 .

在不知道您的数据库具体是什么样子的情况下,我认为这是最可能的解释。

有很多方法可以解决这个问题,例如您可以使用 ->when()链接 Eloquent :

Transfer::where('event_id', 36)
->where('buyer', $user_email)
->when($last_ticket, function ($query) use ($last_ticket) {
$query->where('ticket_id', $last_ticket);
})
->first();

(凭内存,语法可能有点偏差,感谢Rick James在评论中指正。)

关于php - 当变量为 false 时的 Where 子句不将其考虑到 SQL 查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com