问题:使用PHP表单中的2个字段从MySQL数据库检索信息
我有一个MySQL数据库,有3列:问题:使用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
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,则表明滚动错误仍然存在。结果表有问题吗?