问题:使用PHP表单中的2个字段从MySQL数据库检索信息

问题:使用PHP表单中的2个字段从MySQL数据库检索信息,php,mysql,Php,Mysql,我有一个MySQL数据库,有3列: id | articletitle | articleorganization 还有一个简单的PHP表单,包含2个字段和一个提交按钮:search.PHP <div class="content"> <form id="form1" name="form1" method="post" action="searchdb.php"> <table width="100%" border="0" cellpad

我有一个MySQL数据库,有3列:

id  |  articletitle  | articleorganization
还有一个简单的PHP表单,包含2个字段和一个提交按钮: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/>';
    }

?>

基本上,当您有多个同名项引用某种数组时,您得到的是一个实际数组

也就是说,如果输入框中填充了“a”和“b”,则变量
$\u POST['term']
将等于
数组(“a”,“b”)

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


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

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

select * from articles where articletitle like '%%'
Array
(
  [title] => 'some value',
  [organization] => 'another value',
)
$sql = mysql_query("select * from articles WHERE articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%' OR articleorganization LIKE '%".mysql_real_escape_string($_POST['articleorganization'])."%'");
这就是代码返回表中所有行的原因。要使其按您想要的方式工作,请更改
的名称以与列匹配

<input type="text" name="title" />
<input type="text" name="organization" />
您必须在查询中执行一些逻辑。如果只提供了
标题

SELECT * FROM articles WHERE articletitle LIKE '%$title%'
SELECT * FROM articles WHERE articleorganization LIKE '%$organization%'
SELECT * FROM articles
WHERE articletitle LIKE '%$title%' AND 
      articleorganization LIKE '%$organization%'
如果只提供了组织机构

SELECT * FROM articles WHERE articletitle LIKE '%$title%'
SELECT * FROM articles WHERE articleorganization LIKE '%$organization%'
SELECT * FROM articles
WHERE articletitle LIKE '%$title%' AND 
      articleorganization LIKE '%$organization%'
如果两者都提供

SELECT * FROM articles WHERE articletitle LIKE '%$title%'
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);

$\u POST[term]将成为一个具有类似于0,1的键的数组。取消SQL查询的字段引用

在输入字段中使用以下名称:

<input name="articletitle" type="text" id="articletitle" size="50" />
<input name="articleorganization" type="text" id="articleorganization" size="50" />
注意:永远不要在查询中使用$_POST(用户输入)变量,除非先转义以防止mysql注入


PS我个人对缩进的喜好是:总是缩进匹配HTML元素的每个块。因此,是的,我会将表进一步缩进一个选项卡。

bsdnoobz,在做了您建议的更改后,结果页现在返回一个无限列表,其中包含表,但表内没有搜索结果(或者,换句话说,“文章标题
文章组织”
“文章标题
文章组织”无限)也许像“%$title%”这样的
太宽了。尝试将其替换为产生相同结果的
,如“$title%”
。我在原始帖子中更新了代码,以便您可以看到我做了什么。错误在我的代码中:)。应该使用
strlen($title)
而不是
isset($title)
。实际上错误仍然存在。你认为我的结果表的代码中存在缺陷吗?m_r_e_s()将返回一个空字符串,即使$\u POST值不存在,因此你的两个搜索词变量将始终为“isset()”。@MarcB如果我改为strlen,则表明滚动错误仍然存在。结果表有问题吗?