省略SELECT查询的特定SQL结果

时间:2016-06-18 08:53:08

标签: php sql select

我对SQL语法不是很了解,而且在我对这个问题的研究中,我能够偶然发现从数据库查询中排除列的示例,但不会发现将返回的实际表结果。

php脚本正在运行以下SQL查询:

$query = $db->query("SELECT `team`, `points`, `goalsfor`, `goalsagainst`, `goalsdifference`, `matches`, `wins`, `draws`, `losses` FROM `".TABLE_PREFIX."myleagues_rows` WHERE `league` = {$lid} ORDER BY `points` DESC, `goalsdifference` DESC, `goalsfor` DESC, `goalsagainst` ASC");

然后再次引用它并将数据插入到格式化的HTML表格中,即查询的下一部分:

while($row = $db->fetch_array($query)) {
        foreach($row as $name => $value) {
            $teams[$row['team']][$name] = $value;

Full link到php文件,以防我错过重要的事情。

我的问题是,该表中的一行是否有团队名称"测试"将被返回并插入格式化的表中。我不想从数据库中删除测试团队,但我确实希望将其从格式化表中排除。

我最好修改SQL查询吗?或者在PHP方面我可以做些什么呢?

感谢您的任何建议,如果我找错了地方,请指出正确的方向,我没有写代码(显然)。

2 个答案:

答案 0 :(得分:0)

您可以使用WHERE语句将其从SQL查询中删除(我猜“团队”是名称?):

$query = $db->query("SELECT 
    `team`, 
    `points`, 
    `goalsfor`,
    `goalsagainst`, 
    `goalsdifference`, 
    `matches`, 
    `wins`, 
    `draws`, 
    `losses` 
FROM `".TABLE_PREFIX."myleagues_rows` 
WHERE 
    `league` = {$lid} 
    AND `team` != 'test' 
ORDER BY 
    `points` DESC, 
    `goalsdifference` DESC, 
    `goalsfor` DESC, 
    `goalsagainst` ASC");

答案 1 :(得分:0)

正如您所观察到的,这里有两个不同的选项:更改数据库查询或更改处理结果的PHP。

更改数据库查询就像在WHERE子句中添加附加术语一样简单,可能如下所示:

SELECT
    `team`,
    `points`,
    `goalsfor`,
    `goalsagainst`,
    `goalsdifference`,
    `matches`,
    `wins`,
    `draws`,
    `losses`
FROM
    `{{TABLE_PREFIX}}myleagues_rows`
WHERE
    `league` = {{$lid}} AND
    `team` <> 'Test'
ORDER BY
    `points` DESC,
    `goalsdifference` DESC,
    `goalsfor` DESC,
    `goalsagainst` ASC
;

或者,您可以通过添加if语句来修改PHP以排除此团队:

while($row = $db->fetch_array($query)) {
    if ($row['team'] !== 'Test') {
        foreach($row as $name => $value) {
            $teams[$row['team']][$name] = $value;
        }
    }
}

哪一个最好?您将面临的问题是,每次您想要查询团队列表时,排除“测试”团队的代码将会一次又一次地出现。您可能希望将此代码推送到更高级别的抽象:

  • 为什么不使用某种对象关系映射器(ORM),如Doctrine,而不是对数据库进行原始查询?这将使事情变得容易: - 排除测试行成为一行代码 - 或者,您可以在查询“团队”模型时排除测试行
  • 或者,您可以通过创建排除测试行的视图将逻辑推送到数据库中。然后,您可以针对新视图而不是基础表运行查询。使用“TABLE_PREFIX”机制可能相当容易。

在我写作时,值得检查您传递给数据库的$lid值是否已经过适当验证。通过将字符串连接在一起来组装数据库查询通常被认为是不好的做法,因为它可能容易受到SQL Injection攻击。如果您不想通过ORM路由,那么您一定要考虑切换到接受Prepared Statements的数据库库。作为最低限度,您当然应该确保$lid是您期望的范围内的整数值。