我一直试图用一个小函数来确定存储在MySQL数据库中的一组范围内的等级,即A介于80和100之间,A-介于74和79之间,依此类推。我正在使用PDO和准备好的声明。但PDO并没有给我结果。有人可以帮我解决这个问题.Below是表预览
<?php
include("./inc/db.php");
//i have set PDO attribute to ERRMODE_EXCEPTION in the connection file
//this code has failed to work
$mark = 85;
try{
$pk = $db->prepare("SELECT * FROM grading WHERE ? BETWEEN min AND max");
$pk->bindParam(1,$mark);
$pk->execute();
$ind=$pk->fetch(PDO::FETCH_ASSOC);
echo $ind['grade'];
} catch(PDOexception $f) {
echo $f->getMessage();
}
//however when i try this it displays the grade. whats wrong with the previous code?
try{
$pk = $db->prepare("SELECT * FROM grading WHERE 85 BETWEEN min AND max");
$pk->execute();
$ind=$pk->fetch(PDO::FETCH_ASSOC);
echo $ind['grade'];
} catch(PDOexception $f) {
echo $f->getMessage();
}
?>
答案 0 :(得分:0)
尝试稍微调整一下逻辑。就像凤凰赖特一样,有时只需要翻转它来解决它们:
$pk = $db->prepare("SELECT `grade` FROM `grading` WHERE ? BETWEEN `min` and `max`");
$pk->execute(array($mark));
$ind = $pk->fetch(PDO::FETCH_ASSOC);
echo $ind['grade'];
使用值作为BETWEEN
和IN
的第一个操作数并不是很多人会想到的,但它是如此强大;)
更重要的是(感谢Fred -ii-意外地帮助我意识到),min
和max
是函数名称。如果你想将它们用作列名,那么必须将它们包装在反引号中,就像我在上面的代码中所做的那样。
作为一般规则,您应该始终在表名和列名周围添加反引号。不这样做类似于在PHP中编写$foo = bar;
。当然,它会工作,但如果bar
恰好是一个常量或函数名称,那么所有的地狱都会崩溃。
答案 1 :(得分:0)
您可以编写2个不同的查询:
$pk = $db->prepare("SELECT * FROM grading WHERE max >=:max AND min <=:min");
OR
$pk = $db->prepare("SELECT SOMETHING FROM grading WHERE SOMETHING BETWEEN max AND min");
但在你的情况下,第一个有效。问题是你对min和max
使用相同的变量$mark