0

我有一个包含 3 列的 MySQL 数据库:

id  |  articletitle  | articleorganization

还有一个带有 2 个字段和一个提交按钮的简单 PHP 表单:search.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="title" type="text" id="articletitle" size="50" /></td>
    </tr>
    <tr>
      <td align="right">Author or Organization:</td>
      <td align="left"><input name="organization" 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>

表单连接到 searchdb.php:

<?php

include('settings.php');

$title = mysql_real_escape_string($_POST['title']);
$organization = mysql_real_escape_string($_POST['organization']);

$sql = "SELECT * FROM articles WHERE 1 "
     . (isset($title) ? "AND articletitle LIKE '$title%' " : "")
     . (isset($organization) ? "AND articleorganization LIKE '$organization%'" : "");

while ($row = mysql_query($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/>';
    }

?>

在评论者的帮助下进行了一些修改后,问题发生了变化。

现在,在提交搜索后,结果页面开始一遍又一遍地滚动通过 searchdb.php 创建的表格,尽管表格中没有任何结果。

4

3 回答 3

1

基本上,当您有几个具有相同名称的项目引用某种数组时,您得到的是一个实际的数组。

也就是说,如果输入框用“a”和“b”填充,则变量$_POST['term']将等于array("a", "b")

关于缩进,它是您代码风格的一部分,只要您在整个代码库中保持一致,就可以以您觉得舒服的方式进行。

编辑:我确实同意其他人的观点,即您应该更加小心用户输入以及如何将该数据添加到查询中

于 2012-06-14T02:10:14.260 回答
1

如果您回显您的查询,它将打印如下内容:

select * from articles where articletitle like '%%'

这就是您的代码返回表中所有行的原因。要使其按您想要的方式工作,请更改您的名称<input>以与您的列相匹配。

<input type="text" name="title" />
<input type="text" name="organization" />

给定这些标签,您将拥有这样的$_POST包含数组:

Array
(
  [title] => 'some value',
  [organization] => 'another value',
)

而且您必须在查询中执行一些逻辑。如果只title提供,

SELECT * FROM articles WHERE articletitle LIKE '%$title%'

如果只organization提供,

SELECT * FROM articles WHERE articleorganization LIKE '%$organization%'

如果两者都提供,

SELECT * FROM articles
WHERE articletitle LIKE '%$title%' AND 
      articleorganization LIKE '%$organization%'

这是像上面那样制作 SQL 的 PHP:

// Don't forget to properly escape your input
$title = mysql_real_escape_string($_POST['title']);
$organization = mysql_real_escape_string($_POST['organization']);

// Build the SQL
// Echo this string to make sure the SQL is correct
$sql = "SELECT * FROM articles WHERE 1 "
     . (strlen($title) ? "AND articletitle LIKE '%$title%' " : "")
     . (strlen($organization) ? "AND articleorganization LIKE '%$organization%'" : "");

$qry = mysql_query($sql);
于 2012-06-14T02:35:42.290 回答
0

$_POST[term] 变成一个数组,其键值类似于 0,1。丢失 SQL 查询的字段引用。

在输入字段中使用这些名称:

<input name="articletitle" type="text" id="articletitle" size="50" />
<input name="articleorganization" type="text" id="articleorganization" size="50" />

您可以像这样构建查询:

$sql = mysql_query("select * from articles WHERE articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%' OR articleorganization LIKE '%".mysql_real_escape_string($_POST['articleorganization'])."%'");

注意:永远不要在查询中使用 $_POST(用户输入)变量而不先转义以防止 mysql 注入。

PS 我个人对缩进的品味是:总是缩进每一个匹配的 HTML 元素块。所以是的,我会把表格缩进一个标签。

于 2012-06-14T02:46:34.810 回答