PDO:从数据库中获取所有未测试的抽认卡
PDO: Get all untested flashcards from database
我正在尝试从特定的卡片组 (deck_id) 中获取所有待处理的抽认卡。
当
时抽认卡待处理
- 还没有测试,
next_review
未设置(新卡)或
next_review <= $today
(表示卡片需要审核)。
我目前得到的是 deck_id 1
和 deck_id 2
等不同牌组的结果,但我只想从同一副牌(如 deck_id = 1
)中检索待处理的牌。
这是我试过的:
//Get the untested and ready to review cards from DB
public function getCardSR($deckId)
{
$today = date('Y-m-d');
$notSet = '0000-00-00';
$query = "SELECT tbl_repetition.repetition_id,
tbl_repetition.card_id,
tbl_repetition.deck_id,
tbl_repetition.user_id,
tbl_repetition.status,
tbl_repetition.last_review,
tbl_repetition.eFactor,
tbl_repetition.inter,
tbl_repetition.repetition,
tbl_repetition.grade,
tbl_cards.front,
tbl_cards.back
FROM tbl_repetition
LEFT JOIN tbl_cards
ON tbl_repetition.card_id = tbl_cards.card_id
WHERE tbl_repetition.deck_id = :deckId AND
tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(':deckId', $deckId);
$stmt->bindParam(':today', $today);
$stmt->bindParam(':notSet', $notSet);
$stmt->execute();
$result = $stmt->fetchAll();
return $result;
}
这是从 $result
数组中检索结果的方式:
$repetition_id = $decks->getCardSR($c)[$repetitionCard] ["repetition_id"];
$eFactor = $decks->getCardSR($c)[$repetitionCard]["eFactor"];
$card_id = $decks->getCardSR($c)[$repetitionCard]["card_id"];
$deck_id = $decks->getCardSR($c)[$repetitionCard]["deck_id"];
$user_id = $decks->getCardSR($c)[$repetitionCard]["user_id"];
$status = $decks->getCardSR($c)[$repetitionCard]["status"];
$last_review = $decks->getCardSR($c)[$repetitionCard]["last_review"];
$inter = $decks->getCardSR($c)[$repetitionCard]["inter"];
$repetition = $decks->getCardSR($c)[$repetitionCard]["repetition"];
$grade = $decks->getCardSR($c)[$repetitionCard]["grade"];
$front = $decks->getCardSR($c)[$repetitionCard]["front"];
$back = $decks->getCardSR($c)[$repetitionCard]["back"];
您的问题来自 WHERE
子句中的 Operator Precedence。
现在,您正在这样做:
WHERE tbl_repetition.deck_id = :deckId AND
tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet
让我们调用第一个表达式 1,第二个表达式 2 和第三个表达式 3。
这意味着它将被这样评估:
AND
将首先被评估,所以它会 (1 AND 2)
OR
将被评估为第二个,因此您将得到 (1 AND 2) OR 3
这意味着您将从一副牌中检索今天需要复习的所有卡片以及所有未设置复习的牌组中的所有卡片...
要解决此问题,您必须放置括号以使 OR
首先计算:
WHERE tbl_repetition.deck_id = :deckId AND
(tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet)
这样你就会得到你想要的
我正在尝试从特定的卡片组 (deck_id) 中获取所有待处理的抽认卡。
当
时抽认卡待处理- 还没有测试,
next_review
未设置(新卡)或next_review <= $today
(表示卡片需要审核)。
我目前得到的是 deck_id 1
和 deck_id 2
等不同牌组的结果,但我只想从同一副牌(如 deck_id = 1
)中检索待处理的牌。
这是我试过的:
//Get the untested and ready to review cards from DB
public function getCardSR($deckId)
{
$today = date('Y-m-d');
$notSet = '0000-00-00';
$query = "SELECT tbl_repetition.repetition_id,
tbl_repetition.card_id,
tbl_repetition.deck_id,
tbl_repetition.user_id,
tbl_repetition.status,
tbl_repetition.last_review,
tbl_repetition.eFactor,
tbl_repetition.inter,
tbl_repetition.repetition,
tbl_repetition.grade,
tbl_cards.front,
tbl_cards.back
FROM tbl_repetition
LEFT JOIN tbl_cards
ON tbl_repetition.card_id = tbl_cards.card_id
WHERE tbl_repetition.deck_id = :deckId AND
tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(':deckId', $deckId);
$stmt->bindParam(':today', $today);
$stmt->bindParam(':notSet', $notSet);
$stmt->execute();
$result = $stmt->fetchAll();
return $result;
}
这是从 $result
数组中检索结果的方式:
$repetition_id = $decks->getCardSR($c)[$repetitionCard] ["repetition_id"];
$eFactor = $decks->getCardSR($c)[$repetitionCard]["eFactor"];
$card_id = $decks->getCardSR($c)[$repetitionCard]["card_id"];
$deck_id = $decks->getCardSR($c)[$repetitionCard]["deck_id"];
$user_id = $decks->getCardSR($c)[$repetitionCard]["user_id"];
$status = $decks->getCardSR($c)[$repetitionCard]["status"];
$last_review = $decks->getCardSR($c)[$repetitionCard]["last_review"];
$inter = $decks->getCardSR($c)[$repetitionCard]["inter"];
$repetition = $decks->getCardSR($c)[$repetitionCard]["repetition"];
$grade = $decks->getCardSR($c)[$repetitionCard]["grade"];
$front = $decks->getCardSR($c)[$repetitionCard]["front"];
$back = $decks->getCardSR($c)[$repetitionCard]["back"];
您的问题来自 WHERE
子句中的 Operator Precedence。
现在,您正在这样做:
WHERE tbl_repetition.deck_id = :deckId AND
tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet
让我们调用第一个表达式 1,第二个表达式 2 和第三个表达式 3。
这意味着它将被这样评估:
AND
将首先被评估,所以它会(1 AND 2)
OR
将被评估为第二个,因此您将得到(1 AND 2) OR 3
这意味着您将从一副牌中检索今天需要复习的所有卡片以及所有未设置复习的牌组中的所有卡片...
要解决此问题,您必须放置括号以使 OR
首先计算:
WHERE tbl_repetition.deck_id = :deckId AND
(tbl_repetition.next_review <= :today OR
tbl_repetition.next_review = :notSet)
这样你就会得到你想要的