我有一个包含3列的MySQL数据库:
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/>';
}
?>
在评论者的帮助下进行了一些修改后,问题发生了变化。
现在,在提交搜索后,结果页面开始一遍又一遍地滚动通过searchdb.php创建的表格,但表格中没有任何结果。
答案 0 :(得分:1)
基本上,当你有多个具有相同名称的项目引用某种数组时,你得到的是一个实际的数组。
也就是说,如果输入框中填充“a”和“b”,则变量$_POST['term']
将等于array("a", "b")
。
关于缩进,它是您的代码风格的一部分,只要您在整个代码库中保持一致,就可以随意使用它。
修改:我同意其他人的意见,您应该对用户输入以及如何将这些数据添加到查询中更加谨慎
答案 1 :(得分: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);
答案 2 :(得分: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元素块。所以,是的,我会进一步缩进表格。