0

形状と呼ばれる行があり、長方形、正方形、円のいずれかのエントリを含むデータベースがあります。現在、ユーザーが要求する形状のみを取得する次のコードがあります。(現在は、長方形と円、正方形と円、または円のみのいずれかです)。何らかの理由で、それが機能せず、データベース エラーがスローされます。誰でも私を助けることができますか?「MEMBER_FROM」は、彼らがいる列です

$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__);
4

2 に答える 2

3

WHERE を 2 回言うことはできません。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__);

更新: 形状が除外チェックボックスであるという声明に基づいて、これらのボックスに配列で名前を付けてから、ループに基づいてクエリを作成する方が理にかなっています。そうしないと、このコードの保守が非常に困難になる可能性があります...

<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."'";
}

...明らかにその$exclude変数をエスケープしていますが、簡単にするために、ユーザー入力をエスケープしていると仮定しましょう。

于 2012-08-24T23:53:06.797 に答える
0

WHEREクエリに複数の句を追加していますが、これは違法です。NOT INさらに、この場合は betterの構文が好きかもしれません。また、論理構造を少しクリーンアップする自由も取ったことに注意してください。

$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);
于 2012-08-25T00:04:20.340 に答える