2012-08-24 119 views
0

我有一個數據庫,其中有一個稱爲形狀的行,幷包含具有矩形,正方形和圓形的條目。我目前有以下代碼來獲取用戶請求的形狀。 (目前它是矩形和圓形,正方形和圓形或只有圓形)。出於某種原因,它不起作用並拋出數據庫錯誤。誰能幫我? 「MEMBER_FROM」是他們的列下MySQL:根據值排除列

$where = ""; 
    if($context['no_sq'] == 1 && $context['no_rec'] == 0) { 
     $where .= " WHERE MEMBER_FROM != 'Square'"; 
    } else if($context['no_sq'] == 1 && $context['no_rec'] == 0) { 
     $where .= " WHERE MEMBER_FROM != 'Rectangle'"; 
    } else if($context['no_sq'] == 1 && $context['no_rec'] == 1) { 
     $where .= " WHERE MEMBER_FROM != 'Square' AND MEMBER_FROM != 'Rectangle'"; 
    } 
    $request = mysql_query("SELECT ID_SHAPES FROM {$db_prefix}shapes WHERE ID_MEMBER = {$memID}{$where}", __FILE__, __LINE__); 
+1

爲什麼第一個鍵'no_squ'?它不應該是'no_sq'嗎? – Jocelyn

+2

什麼是'數據庫錯誤' – Ibu

回答

3

你不能說WHERE兩次。使用AND ...

$where = ""; 
     if($context['no_squ'] == 1 && $context['no_rec'] == 0) { 
      $where .= " AND MEMBER_FROM != 'Square'"; 
     } else if($context['no_sq'] == 1 && $context['no_rec'] == 0) { 
      $where .= " AND MEMBER_FROM != 'Rectangle'"; 
     } else if($context['no_sq'] == 1 && $context['no_rec'] == 1) { 
      $where .= " AND MEMBER_FROM != 'Square' AND MEMBER_FROM != 'Rectangle'"; 
     } 

    $request = mysql_query("SELECT ID_SHAPES FROM {$db_prefix}shapes WHERE ID_MEMBER = {$memID}{$where}", __FILE__, __LINE__); 

UPDATE: 根據您的說法,您的形狀排除複選框,將更有意義來命名的數組這些箱子然後根據循環構建查詢。否則,該代碼可能是很難維持......

<input type="checkbox" name="exclude[]" value="Square"> Square 
<input type="checkbox" name="exclude[]" value="Rectangle"> Rectangle 
<input type="checkbox" name="exclude[]" value="Circle"> Circle 

然後在PHP

foreach($_POST['exclude'] AS $exclude) 
{ 
    $where .= " AND MEMBER_FROM != '".$exclude."'"; 
} 

...顯然逃脫那$排除變種,但爲了簡單起見,我們假設你正在逃跑用戶輸入。

+0

這隻適用於選擇沒有正方形和自己沒有矩形... – longlost10

+0

我的聲明只是簡單地說你不能使用WHERE兩次。你的個人問題是你如何構建你的查詢。如果你想根據用戶的請求選擇一個形狀,你爲什麼不說MEMBER_FROM ='他們要求的任何形狀',而不是基於$ context arr是否特別排除?爲了優化,我們需要更多地瞭解如何收集用戶輸入。 –

+0

實際上,有更多的形狀,但我決定爲了實驗而簡化它。排除比包含形狀更容易。他們通過勾選框點擊他們排除的內容。 – longlost10

0

您正在爲您的查詢添加多個WHERE子句,這是違法的。此外,在這種情況下,您可能更喜歡NOT IN的語法。請注意,我也冒昧地清理了一下你的邏輯結構。

$sql = "SELECT ID_SHAPES FROM {$db_prefix}shapes WHERE ID_MEMBER = {$memID}"; 
$disallowed = array(); 
if($context['no_squ']) $disallowed[] = 'Square'; 
if($context['no_rec']) $disallowed[] = 'Rectangle'; 
if(count($disallowed)) { 
    $sql .= 'AND MEMBER_FROM NOT IN ("' . implode('", "', $disallowed) . '")'; 
} 
$request = mysql_query($sql);