1

データベースを検索し、指定されたフィールドに一致する行を返すフォームがあります。フィールドが空白のままの場合、他のフィールドが一致する限り、その列が何であるかは問題ではないというオプションをユーザーに提供したいと思います。現在、フィールドを「空白」のままにすると、データベース内のすべてのエントリが返されます。

        Hair Color: <select name="hair">
                    <option value="hairall" selected="selected">--</option>
                    <option value="black" >Black</option>
                    <option value="brown">Brown</option>
                    <option value="blonde">Blonde</option>
                    <option value="white">White</option>
                    <option value="red">Red</option>
                    <option value="other">Other</option>

                </select>
        Height: <select name="height">
                    <option value="heightall" selected="selected">--</option>
                    <option value="smaller">Smaller</option>
                    <option value="small">Small</option>
                    <option value="average">Average - 70in</option>
                    <option value="tall">Tall</option>
                    <option value="taller">Taller</option>
                </select>
        Body Type: <select name="body">
                    <option value="bodyall" selected="selected">--</option>
                    <option value="skinny">Skinny</option>
                    <option value="average">Average - 194lb</option>
                    <option value="heavy">Heavy</option>
                </select>
        Ethnicity: <select name="ethnicity">
                    <option value="ethnicityall" selected="selected">--</option>
                    <option value="white">White</option>
                    <option value="black">Black</option>
                    <option value="asian">Asian</option>
                    <option value="hispanic">Hispanic</option>
                    <option value="middleeast">Middle Eastern</option>
                    <option value="other">Other</option>
                    </select><br/>
        <center><input type="submit" value="Find Me" name="submit" ></center>
    </form>
</div>
<div id="results">
    <?php
            $submit = $_GET['submit'];
            $gender = $_GET['gender'];
            $hair = $_GET['hair'];
            $height = $_GET['height'];
            $body = $_GET['body'];
            $race = $_GET['ethnicity'];

            //Hair All/Specific
            if ($hair=='hairall'){
                $newhair = "black' OR `hair`='brown' OR `hair`='blonde' OR `hair`='white' OR `hair`='red' OR `hair`='other";
            }else
                $newhair=$hair;

            //Height All/Specific
            if ($height=='heightall'){
                $newheight = "smaller' OR `height`='small' OR `height`='average' OR `height`='tall' OR `height`='taller";
            }else
                $newheight=$height;

            //Body Type All/specific
            if ($body=='bodyall'){
                $newbody = "skinny' OR `body`='average' OR `body`='heavy";
            }else
                $newbody=$body;

            //Etnicity All/Specific
            if ($race=='ethnicityall'){
                $newrace = "white' OR `race`='black' OR `race`='asian' OR `race`='hispanic' OR `race`='middleeast' OR `race`='other";
            }else
                $newrace=$race;

            //echo "$newhair <br/> $newheight <br/> $newbody <br/> $newrace<br/>";
            require 'connect.inc.php';

            $query = "SELECT * FROM `table` WHERE `gender`='$gender' AND `hair`='$newhair' AND `height`='$newheight' AND `body`='$body' AND `race`='$race' ORDER BY `id` DESC";
4

1 に答える 1

0

('$gender')の代わりに、各値を括弧で囲みます'$gender'。これにより、OR 句が AND 句を台無しにするのを防ぐことができます。これは、あなたが抱えている問題です。

より良い解決策は、フィールドが空白のままの場合、クエリからチェックを完全に削除することですが、それにはコードの約半分を書き直す必要があります。いずれにせよ、大まかに私がそれを行う方法は次のとおりです。

// Only accept the specific fields that are expected
$query_fields = array_intersect_key($_GET, array(
    'gender'=>true,
    'hair'=>true,
    'height'=>true,
    'body'=>true,
    'ethnicity'=>true,
));

// Exclude blank fields
$query_fields = array_filter($query_fields, 'strlen');

$database = (require 'connect.inc.php'); // Get connection to database in this variable somehow

$where_parts = array();
foreach($query_fields as $k=>$v) {
    $v = $database->real_escape_string($v);
    $where_parts[] = "`$k` = '$v'";
}

if(!$where_parts)
    die('No filters selected!');

$query = 'SELECT * FROM `table` WHERE '.implode(' AND ', $where_parts).' ORDER BY `id` DESC';
于 2013-07-31T17:14:06.860 に答える