【问题标题】:PHP search / best result considering mulptiple inputs / Ingore empty inputsPHP 搜索 / 考虑多个输入的最佳结果 / 忽略空输入
【发布时间】:2020-07-09 21:07:07
【问题描述】:

隔离时间让我尝试一些代码来练习,但我确实在这方面有所收获。

看看我的文件。 顺便说一句,我的数据库连接很好

数据库

CREATE TABLE `excavated` (
  `owner_name` varchar(255) NOT NULL,
  `area` varchar(255) NOT NULL,
  `street` varchar(255) NOT NULL,
  `building_block` varchar(255) NOT NULL,
  `year` varchar(255) NOT NULL,
  `number` varchar(255) NOT NULL,
  `archeologist` varchar(255) NOT NULL,
  `key_words` varchar(255) NOT NULL,
  `filename` varchar(255) NOT NULL,
  `size` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

download_index.php(我的表单)

<form id="form" action="filesLogicDownload.php" method="post">
<?php include 'download_info.php'; ?>
<div id="preview"><img src="" width="150px"/></div><br>
<input class="btn btn-success" type="submit" value="Search">
</form>

download_info.php(用户可以给出的所有值,他不必全部给出)

<!--Όνομα Ιδιοκτήτη -->
<div class="form-group">
<label>Όνομα Ιδιοκτήτη</label>
<input type="text" class="form-control" id="owner_name" name="owner_name" placeholder="Όνομα Ιδιοκτήτη" >
</div>


<!--Περιοχή -->
<div class="form-group">
<label>Περιοχή</label>
<input type="text" class="form-control" id="area" name="area" placeholder="Περιοχή" >
</div>

<!--Οδός / Θέση -->
<div class="form-group">
<label>Οδός / Θέση</label>
<input type="text" class="form-control" id="street" name="street" placeholder="Οδός / Θέση" >
</div>

<!--Οικοδομικό Τετράγωνο -->
<div class="form-group">
<label>Οικοδομικό Τετράγωνο (Ο.Τ)</label>
<input type="text" class="form-control" id="building_block" name="building_block" placeholder="Οικοδομικό Τετράγωνο (Ο.Τ)" >
</div>

<!--Έτος Ανασκαφής -->
<div class="form-group">
<label>Έτος Ανασκαφής</label>
<input type="text" class="form-control" id="year" name="year" placeholder="Έτος Ανασκαφής" >
</div>

<!--Αριθμός Σχεδιαστικόυ Αρχείου -->
<div class="form-group">
<label>Αριθμός Σχεδιαστικού Αρχείου</label>
<input type="text" class="form-control" id="number" name="number" placeholder="Αριθμός Σχεδιαστικού Αρχείου" >

<!--Λέξεις Κλειδία -->
</div>
<div class="form-group">
<label>Λέξεις Κλειδία</label>
<input type="text" class="form-control" id="key_words" name="key_words" placeholder="Λέξεις Κλειδία" >
</div>

<!--Αρχαιολόγος -->
<div class="form-group">
<label>Αρχαιολόγος</label>
<input type="text" class="form-control" id="archeologist" name="archeologist" placeholder="Αρχαιολόγος" >
</div>

filesLogicDownload.php(这里我想在他按下按钮时显示值)

<?php
include 'database_connection.php';

if(!empty($_POST['owner_name'])){
    $owner_name = $_POST['owner_name'];
}else {
    $owner_name = "0";
}
if(!empty($_POST['area'])){
    $area = $_POST['area'];
}else {
    $area = "0";
}
if(!empty($_POST['street'])){
    $street = $_POST['street'];
} else {
    $street = "0";
}
if(!empty($_POST['building_block'])){
    $building_block = $_POST['building_block'];
}else {
    $building_block = "0";
}
if(!empty($_POST['year'])){
    $year = $_POST['year'];
}else {
    $year = "0";
}
if(!empty($_POST['number'])){
    $number = $_POST['number'];
}else {
    $number = "0";
}
if(!empty($_POST['key_words'])){
    $key_words = $_POST['key_words'];
}else {
    $key_words = "0";
}
if(!empty($_POST['archeologist'])){
    $archeologist = $_POST['archeologist'];
}else {
    $archeologist = "0";
}


$sql ="SELECT * FROM employees
    WHERE 
    'owner_name' LIKE '%{$owner_name}%' 
    OR 'area' LIKE '%{$area}%' 
    OR 'street' LIKE '%{$street}%' 
    OR building_block LIKE '%{$building_block}%' 
    OR 'year' LIKE '%{$year}%' 
    OR 'number' LIKE '%{$number}%' 
    OR archeologist LIKE '%{$archeologist}%'; ";
$result = mysqli_query($conn, $sql);      
$resultCheck = mysqli_num_rows($result);
?>
<table>
<th>Όνομα Ιδιοκτήτη</th>
<th>Περιοχή</th>
<th>Οδός / Θέση</th>
<th>Οικοδομικό Τετράγωνο (Ο.Τ)</th>
<th>Έτος Ανασκαφής</th>
<th>Αριθμός Σχεδιαστικού  Αρχείου</th>
<th>Λέξεις Κλειδία</th>
<th>Αρχαιολόγος</th>
<th>Μέγεθος Αρχείου</th>
<?php
if ($resultCheck > 0) {
    while  ($row = mysqli_fetch_assoc($result)){
?>
        <tr>
            <td><?php echo $row['owner_name']; ?></td>
            <td><?php echo $row['area']; ?></td>
            <td><?php echo $row['street']; ?></td>
            <td><?php echo $row['building_block']; ?></td>
            <td><?php echo $row['year']; ?></td>
            <td><?php echo $row['number']; ?></td>
            <td><?php echo $row['archeologist']; ?></td>
            <td><?php echo $row['key_words']; ?></td>
            <td><?php echo $row['filename']; ?></td>
            <td><?php echo $row['size']; ?></td>

        </tr>
<?php
}
}
mysqli_close($conn);
?>
</table>
</html>

首先,我想弄清楚,当他不在我的某些输入中键入值时,我如何在搜索中忽略。

例如,如果他只给出 3 个值,那么我的代码将显示考虑到它们的所有数据库结果。如果他只键入 1 个或更多,则相同。

每次都不知道他会选择什么价值观和多少。

最后我只想显示正确的结果。

当他输入 year 和 number 时,结果应该是正确的年份 AND 数字。

不显示所有具有年份OR数字的结果。

例如,如果 year=2005 和 number=1:

不显示:

年份 = 2005 number=1

年份 = 2005 number=2

年份 = 2006 年数字=1

*年 = 2007 年数字=1

仅显示:

年份 = 2005 数字 = 1

我希望你能理解我的解释以及我的想法。如果它能够实现,如果有人有想法,我会很高兴。

谢谢,保重!

【问题讨论】:

标签: php database search


【解决方案1】:

如果你需要获取强 AND 条件的数据,它可能看起来像这样

<?php

include 'database_connection.php';
$fields = ['owner_name','area','street','building_block','year','number','archeologist','key_words','filename','size'];
$sql ="SELECT * FROM employees WHERE 1=1";
$condition = " AND ";
foreach($fields as $f) {
    if ( !empty($_POST[ $f ] ) ) {
    $sql .= ($condition . $f . " LIKE '%" . $_POST[ $f ] . "%'");
    }
}
$sql .= ';';

$result = mysqli_query($conn, $sql);
...

【讨论】:

  • @Dharman ,非常感谢您,先生,即使问题是用 sql 和数据库标签标记的,并且与安全问题无关,我相信问题的作者也是如此是关于。
  • 这不是重点。您的建议是错误的做事方式。 SQL 注入是它出错的主要原因,但如果你想正确地做到这一点,你必须使用准备好的语句。即使问题不是要求安全建议,也不意味着您应该提供错误的方法。你应该为你的解决方案付出努力。
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2017-12-11
  • 2016-07-11
  • 2017-09-24
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多