2016-06-18 38 views
0

我不擅長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的情況下,我錯過了重要的事情。

我的問題是,該表中有一行與團隊名稱「測試」,將返回並插入到格式化表中。我不想從數據庫中刪除測試團隊,但我想將其從格式化表中排除。

我最好修改SQL查詢嗎?或者,在我能做的事情的PHP方面有什麼?

感謝您的任何建議,並請指向正確的方向,如果我看錯了地方,我沒有寫代碼(顯然)。

回答

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"); 
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 
; 

或者你可以修改PHP通過添加if聲明排除了這種團隊:

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值是否得到了適當的驗證。將字符串連接在一起組裝數據庫查詢通常被認爲是不好的做法,因爲這可能會容易受到攻擊。如果您不想通過ORM路徑,那麼您絕對應該考慮切換到接受Prepared Statements的數據庫庫。作爲最低限度,你應該確保你的$lid是你期望的那種範圍內的整數值。

+0

第二個例子不會給他在「測試」記錄中的所有列,除了值爲「Test」的任何字段嗎?而iit也會忽略其他任何列,其他記錄包含「測試」,而不僅僅是「測試」 - 隊。 –

+0

@MagnusEriksson好點 - 將解決。 – simpleigh

+0

@MagnusEriksson這是一個公平的批評 - 但一個很少查詢的應用程序往往會演變成一個有很多查詢的應用程序,然後可能就不會回頭了......它也可以通過'$ lid'避免潛在的SQLi向量。 – simpleigh