我想知道是否有人在一两分钟内有一双备用的眼睛。我看到的问题在于我的问题。它忽略了第一个初始的isset($ lastName),似乎总是选择isset($ title)。另外我应该提一下,这些值是从HTML表单发布到数据库中的姓氏或标题的搜索。
我的问题是,任何人都可以帮助解决逻辑问题,还是有其他方法可以解决这个问题?我知道它也容易出现SQL注入,但它是在本地数据库上,我将很快关注这一点。如果有人可以提出建议,我肯定有兴趣听取他们的意见。
根据建议HTML表格。
<form name="lookup" method="post" action="searchEmployeeList.php" autocomplete="off">
<fieldset>
<p>Conduct a search</p>
<table width="600">
<tr>
<td width="150">Surname:</td>
<td>
<input type="text" name="lastName" value="" maxlength="25" placeholder="Employees surname">
</td>
</tr>
<tr>
<td width="150">Title:</td>
<td>
<input type="text" name="title" value="" maxlength="25" placeholder="Job role">
</td>
</tr>
<tr>
<td></td>
<!--Blank row-->
<td>
<input type="submit" name="submit" value="Search now">
<input type="submit" name="show_all" value="Show all">
</td>
</tr>
</table>
</fieldset>
</form>
if (isset($_POST['lastName'])) {
include 'DBConDetails.php';
if (isset($lastName)) {
$sql = "SELECT * FROM employee_data Where last_name = '".$_POST['lastName'].
"'";
}
if (isset($_POST['title'])) {
$sql = "SELECT * FROM employee_data Where title = '".$_POST['title'].
"'";
}
$result = mysqli_query($con, $sql);
if ($result - > num_rows > 0) {
echo "<table id = 'searchResults'> < tr >
< td > ID < /td> < td > Name < /td> < td > Age < /td><td>Title</td > < td > Years of Service < /td> < td > Salary < /td> < /tr>";
//multiple echos plainly for readability
while ($row = $result - > fetch_assoc()) {
echo '<tr>';
echo '<td>' . $row["employee_id"] . '</td>';
echo '<td>' . $row["first_name"] . ' ' . $row["last_name"] . '</td>';
echo '<td>' . $row["age"] . '</td>';
echo '<td>' . $row["title"] . '</td>';
echo '<td>' . $row["yos"] . '</td>';
echo '<td>' . $row["salary"] . '</td>';
echo '</tr>';
}
} else {
echo "I'm afraid we could not find any matches, try editing your criteria.";
}
echo "</table>";
}
如果有人在将来遇到类似的问题,那么问题在于if语句都是真的,这导致执行和后者都覆盖了第一个if()
语句。 应该注意到!
答案 0 :(得分:1)
我认为你需要检查:
isset($_POST['lastName']);
而不是
isset($lastName);
后者会被设置,但是等于某个未定义的值(也许是空字符串?)。这同样适用于您的标题变量。
答案 1 :(得分:0)
首先,我认为最好选中class Base {
public:
void display() {
foo();
}
virtual void foo() {
cout << "Base.foo()" << endl;
}
};
class Derived : public Base {
public:
void foo() {
cout << "Derived.foo()" << endl;
}
};
int main() {
Derived* derived = new Derived();
derived->display();
}
请参阅:$_POST vs. $_SERVER['REQUEST_METHOD'] == 'POST'
之后,您可以使用if ($_SERVER['REQUEST_METHOD'] == 'POST')
检查$_POST
变量,也可以使用isset
检查变量。使用strlen
时,strlen
可以删除不必要的空格。
示例:
trim
答案 2 :(得分:0)
首先,你要覆盖你的第一个查询/条件语句。
你告诉它要做的是,“如果已设置,请执行此操作。如果已设置,则执行此操作”。
我觉得你可能想要做的就是检查两者是否都已设置,然后一次性在查询中传递这些变量。
例如并使用!empty()
代替isset()
:
if (!empty($_POST['lastName']) && !empty($_POST['title']) ) {
$lastName = $_POST['lastName'];
$title = $_POST['title'];
$sql = "SELECT * FROM employee_data
Where last_name = '" . $lastName . "'
AND title = '" . $title . "'";
}
如果此处的目标是检查一个 OR 另一个(看起来是这种情况),您可以修改上述代码,并使用OR
运算符:< / p>
if (!empty($lastName) || !empty($title) ) {
$lastName = $_POST['lastName'];
$title = $_POST['title'];
$sql = "SELECT * FROM employee_data
Where last_name = '" . $lastName . "'
OR title = '" . $title . "'";
}
并摆脱:
if (isset($title)) {
$sql = "SELECT * FROM employee_data Where title = '" . $title . "'";
}
旁注:OR
- ||
运算符也可用于PHP条件语句。 &&
是AND
;选择适合你想要达到的目标。
如果我上面因为MySQL抱怨的字符(例如撇号)而引发错误,那么您将需要使用mysqli_real_escape_string()
来转义数据。
旁注:如果您要使用上述内容,请确保首先连接到您的数据库,并将include 'DBConDetails.php';
作为您的第一行。首先连接通常很好。
另外,您的代码很容易注入SQL。使用准备好的声明:
另外,在if (isset($_POST['lastName'])) {
语句之前没有打开PHP标记;如果这是你的实际代码。
它应该读作
<?php
if (isset($_POST['lastName'])) {
...
脚注:
DBConDetails.php
未知您正在使用哪个MySQL API。您需要使用从连接到查询的相同API。不同的MySQL API不会混用。
同时检查查询错误:
如果您想分开提交按钮的操作
<input type="submit" name="submit" value="Search now">
<input type="submit" name="show_all" value="Show all">
您需要使用单独的条件语句并使用相关的name属性。
即:
if (isset($_POST['submit'])) {
// do something, as in include other conditionals, code etc.
}
和
if (isset($_POST['show_all'])) {
// do something, as in include other conditionals, code etc.
}