2

我有一个使用 PHP 搜索 MySQL 数据库的表单。目前,当用户在两个字段之一中输入搜索时,会显示数据库的全部内容。此外,如果用户将两个字段都留空,则会再次显示数据库的全部内容。

但是,如果用户在两个字段中输入随机信息,则结果页面将为空白。

此表单的假定用法是用户可以通过填写其中一个或两个字段来根据文章标题、文章作者或组织或文章标题及其作者或组织来搜索文章。

我想弄清楚的是:

为什么结果页面一直显示所有数据库内容。

如何确保数据库实际上正在被查询,而不是仅仅因为编码错误而被转储。

代码如下:

搜索.php:

<div class="content">
    <form id="form1" name="form1" method="post" action="searchdb.php">
        <table width="100%" border="0" cellpadding="6">
            <tr>
              <td width="29%" align="right">Article Title:</td>
              <td width="71%" align="left"><input name="articletitle" type="text" id="articletitle" size="50" /></td>
            </tr>
            <tr>
              <td align="right">Author or Organization:</td>
              <td align="left"><input name="articleorganization" type="text" id="articleorganization" size="50" /></td>
            </tr>
        </table>


        <table width="100%" border="0" cellpadding="6">
          <tr>
            <td><input type="submit" name="submit" value="Submit" /></td>
          </tr>
        </table>
    </form>
</div>

搜索数据库.php

<?php

include('settings.php');
$query = "select * from articles";
$where = array();
if (!empty($_POST['articletitle'])) {
   $where[] = "articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%'";
}
    if (!empty($_POST['articleorganization'])) {
       $where[] = "articleorganization LIKE  '%".mysql_real_escape_string($_POST['articleorganization'])."%'";
}
    if (!empty($where)) {
        $query .= " WHERE " . implode(" OR ", $where);
        $sql = mysql_query($query);
    } else {
        // No results
}
while ($row = mysql_fetch_array($sql)){
    echo '<br/> Article Title: '.$row['articletitle'];
    echo '<br/> Article Organization: '.$row['articleorganization'];
    echo '<td><a href="edit.php?id=' . $row['id'] . '">Edit</a></td>';
    echo '<td><a href="delete.php?id=' . $row['id'] . '">Delete</a></td>';
    echo '<td><a href="entry.php?id=' . $row['id'] . '">View Full Entry</a></td>';
    echo '<br/><br/>';
}

?>
4

3 回答 3

3

当两者均为空白时,您的查询状态:

WHERE field LIKE '%%'

匹配一切。

当其中任何一个为空白时也会发生同样的情况,因为您使用 anOR来连接 where 子句。

您可以通过检查输入是否为空来防止这种情况发生:

<?php
if (!((empty($_POST['field1']) || empty($_POST['field2']))) {
  //run your query
}
于 2012-06-14T05:47:43.123 回答
2

关注@sberry 的帖子。

if (isset($_POST['articletitle']) && $_POST['articletitle'] != "")

该变量可以设置,但仍然是一个空字符串。

@xbonez 使用的方法更简单

if (!empty($_POST['articletitle']))和上面的例子一样,需要两次测试

您是否尝试过 xbonez 方法?

为了完整起见,这将检查是否至少填写了一个字段:

if (!empty($_POST['articletitle']) || !empty($_POST['articleorganization'])) {
   $query = "SELECT * from `articles` WHERE ";

   $query .= "`articletitle` LIKE '%" . mysql_real_escape_string($_POST['articletitle']) . "%' ";

   $query .= "OR `articleorganization` LIKE '%" . mysql_real_escape_string($_POST['articleorganization']) . "%'";

    $sql = mysql_query($query);

} else {
    // No results
}

仅在填写其中一个字段时才会使用的内容,例如:

$query = "SELECT * from `articles` WHERE ";

放在 if() 语句中,否则它们会被不必要地解析。

无需创建数组然后将其转换为字符串。".=" 将字符串片段连接成最终的查询字符串。

个人喜好问题:
MySql 关键字全大写,我发现它使语句更易于阅读。
有很多关于它的讨论。
搜索“ sql大写关键字样式

在表和字段名周围使用反引号:
允许为表或字段名使用保留关键字(计数、大小写、默认值、div、索引、键、限制、选项、顺序等)。
减少mysql解析器的工作,不需要检查是否存在保留字冲突。
如果您的表或字段名称将来成为保留关键字,则可以避免出现问题。

再次,无数次讨论。搜索“ mysql 反引号

MySQL 文档:
9.3。保留字

9.2. 架构对象名称
在此页面上查找“引用标识符”。
此外,如果您将来可能要迁移到不同的数据库应用程序,您可以使用双引号而不是反引号,查找“ANSI_QUOTES”。

9.2.4。函数名称解析和解析
在此页面上查找“引用标识符”。

于 2012-06-14T06:31:44.877 回答
1

对此进行了测试,它应该完全符合您的要求。

$query = "select * from articles";
$where = array();
if (!empty($_POST['articletitle'])) {
   $where[] = "articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%'";
}
if (!empty($_POST['articleorganization'])) {
   $where[] = "articleorganization LIKE '%".mysql_real_escape_string($_POST['articleorganization'])."%'";
}
if (!empty($where)) {
    $query .= " WHERE " . implode(" OR ", $where);
    $sql = mysql_query($query);
} else {
    // No results
}

编辑
看来您的表单正在传递空值,因此不是检查isset,而是检查!empty。我已经更新了上面的代码。

于 2012-06-14T05:52:18.377 回答