0

我有一个表格,要求用户只填写至少 1 个(四个)字段。然后,他们可以根据他们的输入提交并获得搜索结果。

问题是,我无法获得一个字符来设置我的变量以匹配任何数据库值。这是我的一些上下文代码;

   if (isset($_POST['buildname']) ||
    isset($_POST['weapon']) ||
    isset($_POST['category']) ||
    isset($_POST['id']))

{
if ($_POST['buildname'] == "") 
    {
        $buildname = ".*";
    }
if ($_POST['weapon'] == "")
    {
        $weapon = ".*";
    }
if ($_POST['category'] == "")
    {
        $category = ".*";
    }
if ($_POST['id'] == "")
    {
        $id = ".*";
    }


$buildname  = sanitizeString($_POST['buildname']);
$weapon     = ($_POST['weapon']);
$category   = ($_POST['category']);
$id         = ($_POST['id']);

$searchstring = "SELECT buildname,weapon,category,id,author FROM weapons " .
                "WHERE buildname='$buildname' AND weapon='$weapon' AND category='$category' AND id='$id'";

如您所见,代码查看是否设置了其中一个变量,然后提交表单。如果未设置变量,它会分配一个字符“。*”(我认为它可以匹配任何东西)。然后它查询数据库以匹配任何行。除非我在每个字段中输入正确的条目,否则我不会得到任何结果。

有任何想法吗?

谢谢!

4

5 回答 5

1

我不会使用%,而是做这样的事情

if (isset($_POST['buildname']) || isset($_POST['weapon']) || isset($_POST['category']) || isset($_POST['id'])){

    $sqlArray = array();

    if(isset($_POST['buildname'])){
        $sqlArray[] = "buildname='" . mysqli_real_escape_string($connection,$_POST['buildname']) . "'";
    }

    if(isset($_POST['weapon'])){
        $sqlArray[] = "weapon='" . mysqli_real_escape_string($connection,$_POST['weapon']) . "'";
    }

    if(isset($_POST['category'])){
        $sqlArray[] = "category='" . mysqli_real_escape_string($connection,$_POST['category']) . "'";
    }

    if(isset($_POST['id'])){
        $sqlArray[] = "id='" . mysqli_real_escape_string($connection,$_POST['id']) . "'";
    }

    $searchstring = "SELECT buildname,weapon,category,id,author FROM weapons " .
                    "WHERE " . implode(' AND ', $sqlArray);

}
于 2013-07-28T21:19:14.107 回答
0

不,您正在使用=运算符,它只比较 2 个值。在您的情况下,它将搜索 '.*' - 并失败。如果您想忽略未填写的字段,请不要将它们放入查询中:不需要正则表达式。因此,如果缺少武器和类别,您的查询应该是这样的

$searchstring = 'SELECT buildname,weapon,category,id,author FROM weapons WHERE ';

$fields = array('buildname', 'weapon', 'category', 'id');
$data = array();
foreach($fields as $value)
{
    if (isset($_POST[$value]) && ($_POST[$value] != "") )
    {
        $data[] = sanitizeString($_POST[$value]);
    }
}

$n = count($data);
if($n > 0)
{
    $searchstring .= implode(' AND ', $data);
    //do MySQL request and output result
}

不要把简单的事情复杂化。此外,您的代码容易受到 SQL 注入的影响,因为某些字段没有转义。

于 2013-07-28T21:11:48.123 回答
0

MySQL 的通配符是:%

于 2013-07-28T21:09:05.333 回答
0

你可以这样做:

$fields = array('buildname', 'weapon', 'category', 'id');

$sql = 'SELECT buildname, weapon, category, id, author FROM weapons';
$prefix = ' WHERE ';
foreach ($fields as $field) {
    if (isset($_POST[$field]) && strlen($_POST[$field])>1) {
        $sql .= $prefix . $field . '=\''
             . sanitizeString($_POST[$field]) . '\'';
        $prefix = ' AND ';
    }
}

if ($prefix == ' AND ') {
// send the query
}

注意:如果要使用不完整的值执行搜索,可以使用LIKE代替=,例如:

$sql .= $prefix . $field . ' LIKE \'%' . sanitizeString($_POST[$field]) . '%\'';

但请记住,这LIKE=

于 2013-07-28T21:23:02.740 回答
0

您正在执行的查询,您“认为会匹配任何东西”不会。该语句不使用正则表达式。

WHERE buildname='$buildname' AND weapon='$weapon'

这实质上是说您需要使以下字段等于它们的字符串值:

WHERE buildname='.*' AND weapon='.*'

我怀疑您有任何名称为 的建筑物.*

最好不要在该字段上进行过滤。WHERE如果未定义变量,则基本上删除原因标准。

您可以动态执行此操作,仅在需要按该字段过滤时构建 SQL 语句。

if (isset($_POST['somevalue']) && ! empty($_POST['somevalue'])) { 
  $where .= 'column_name = ?';
  $values[] = sanitizeString($_POST['somevalue]);
}

我还使用positional parameters了 which 假设您将使用PDOorMySQLi库进行查询。

于 2013-07-28T21:19:25.923 回答