2012-08-24 157 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);