【问题标题】:PHP - how to search a single column specified in a drop down menuPHP - 如何搜索下拉菜单中指定的单个列
【发布时间】:2016-03-18 23:42:50
【问题描述】:

我有一个在 HTML 网页上实现的 SQL 数据库。我希望用户能够在搜索框中输入值并搜索下拉菜单中指定的表的列。

例如:表格上有 3 列 - 'first name'、'second name' 和 'surname'。用户可以在下拉菜单中选择这些列名之一,然后在搜索框中输入他们想要在指定列中搜索的内容。假设他们选择了“姓氏”列,并想在该列中搜索“约翰逊”。

结果应显示所有带有“Johnson”的姓氏,并显示找到的每个姓氏的其余部分。我的数据库有点不同并且比这更大,但它的应用相同。我当前的代码可以在下面找到:

<head>
    <link rel="stylesheet" type="text/css" href="stylesheet.css" />
    <meta charset="utf-8" />

    <title>The 24 Hour Race</title>
    <div id="title">
        <a href="index.php"><img src="images/title.png"></img></a>
    </div>
    <p id="subtitle">For the toughest of the tough</p>
</head>
<body>
    <div id="nav">
        <form method="post" action="index.php?go"  id="searchform">
            <br>
            <h3>Search in:</h3><select name="field">
            <option value="rider_no.">Rider No.</option>
            <option value="category">Category</option>
            <option value="name">Name</option>
            <option value="team_name">Team Name</option>
            <option value="nationality">Nationality</option>
            <option value="year_participated">Year Participated</option>
            <option value="total_laps">Total Laps</option>
            <option value="fastest_lap">Fastest Lap</option>
            </select>
            <input type="text" name="key">
            <input type="submit" name="submit" value="Search"><br>
        </form>
        <br>
        <h3>Sort by years:</h3>            
        <ul>
            <li><a href="2007.php">2007</a></li>
            <li><a href="2008.php">2008</a></li>
            <li><a href="2009.php">2009</a></li>
            <li><a href="2010.php">2010</a></li>
            <li><a href="2011.php">2011</a></li>
            <li><a href="2012.php">2012</a></li>
            <li><a href="2013.php">2013</a></li>
            <li><a href="2014.php">2014</a></li>
            <li><a href="2015.php">2015</a></li>
        </ul>
    </div>
    <div id="form">            
        <table id="t01" align="right" cellspacing="2">
    <thead>
        <tr>
            <td bgcolor="#ccc">Rider No.</td>
            <td bgcolor="#ccc">Category</td>
            <td bgcolor="#ccc">Name</td>
            <td bgcolor="#ccc">Team Name</td>
            <td bgcolor="#ccc">Nationality</td>
            <td bgcolor="#ccc">Year Participated</td>
            <td bgcolor="#ccc">Total Laps</td>
            <td bgcolor="#ccc">Fastest Lap</td>
        </tr>
    </thead>
    <tbody>
        <?php
        $connect = mysql_connect("localhost","root", "Highland5");
        if (!$connect) {
            die(mysql_error());
        }
        mysql_select_db("the24hourrace");
        if(isset($_POST[field]) and isset($_POST[key])) {
            $results = mysql_query("SELECT ".[field]." FROM riders WHERE ".[field]." = ".[key], $connect);
        } else {
            $results = mysql_query("SELECT * FROM riders", $connect); 
        }

        while($row = mysql_fetch_array($results)) {
   ?>
            <tr>
                <td><?php echo $row['rider_no']?></td>                    
                <td><?php echo $row['category']?></td>
                <td><?php echo $row['name']?></td>
                <td><?php echo $row['team_name']?></td>
                <td><?php echo $row['nationality']?></td>
                <td><?php echo $row['year_participated']?></td>
                <td><?php echo $row['total_laps']?></td>
                <td><?php echo $row['fastest_lap']?></td>
            </tr>
        <?php
        }
        ?>
     </tbody>
        </table>
    </div>
</body>

我要问的重要部分包括 div id="nav" 和它下面的表格:

<form method="post" action="index.php?go"  id="searchform">
            <br>
            <h3>Search in:</h3><select name="field">
            <option value="rider_no.">Rider No.</option>
            <option value="category">Category</option>
            <option value="name">Name</option>
            <option value="team_name">Team Name</option>
            <option value="nationality">Nationality</option>
            <option value="year_participated">Year Participated</option>
            <option value="total_laps">Total Laps</option>
            <option value="fastest_lap">Fastest Lap</option>
            </select>
            <input type="text" name="key">
            <input type="submit" name="submit" value="Search"><br>
        </form>

还有 PHP 部分:

<?php
        $connect = mysql_connect("localhost","root", "Highland5");
        if (!$connect) {
            die(mysql_error());
        }
        mysql_select_db("the24hourrace");
        if(isset($_POST[field]) and isset($_POST[key])) {
            $results = mysql_query("SELECT ".[field]." FROM riders WHERE ".[field]." = ".[key], $connect);
        } else {
            $results = mysql_query("SELECT * FROM riders", $connect); 
        }

        while($row = mysql_fetch_array($results)) {
   ?>
            <tr>
                <td><?php echo $row['rider_no']?></td>                    
                <td><?php echo $row['category']?></td>
                <td><?php echo $row['name']?></td>
                <td><?php echo $row['team_name']?></td>
                <td><?php echo $row['nationality']?></td>
                <td><?php echo $row['year_participated']?></td>
                <td><?php echo $row['total_laps']?></td>
                <td><?php echo $row['fastest_lap']?></td>
            </tr>
        <?php
        }
        ?>

如果您对我的代码或我的要求有任何疑问,请不要犹豫!我发现这有点难以解释:)

【问题讨论】:

  • 所以你想要做的几乎就是一旦他们在字段的 o1 中输入详细信息并点击你希望它显示结果的按钮,或者你希望它确实显示为他们输入吗?
  • @rackemup420 我希望它在点击“提交”后刷新页面并显示新结果
  • 您当前的代码有哪些错误?
  • $results = mysql_query("SELECT ".[field]." FROM riders WHERE ".[field]." = ".[key], $connect); 应该是$results = mysql_query("SELECT ".$_POST['field']." FROM riders WHERE ".$_POST['field']." = ".$_POST['key'], $connect);
  • 是的,我意识到我的问题在提交后更像是代码转储......无论如何,在尝试搜索列后它没有显示任何结果。我之前在 [field] 和 [key] 前面有 $_POST,但结果相同。如果我删除 WHERE ".[field]." = ".[key] 来自第一个 IF 语句,然后表格将显示具有所有值的指定列(无需在搜索栏中输入任何内容)并且每行的其余部分将为空。

标签: php html mysql css sql


【解决方案1】:

为了将来参考,请在发布问题之前研究并提供您的错误代码。

PHP 是一种面向对象 编程语言,这是循环遍历每个列的最佳方法。

<?php foreach($connect->query($sql) as $r): ?>
      <td> <?php echo $r['column']; ?> </td>
<?php endforeach; ?>

此外,当您引用全局变量时,您无法以您尝试捕获它的方式捕获它。

GET 请求 -

echo $_GET['param'];
echo $_GET[$variable];

POST 请求 -

echo $_POST['param'];
echo $_POST[$variable];

这意味着,如果您不将参数存储在变量中,则必须将其声明为字符串。

还请注意,您很容易受到SQLi Injections 的攻击,因为您没有安全地绑定这些字段。

但如果你不担心,那么你可以这样做:

$field = $_POST['field'];
$key = $_POST['key'];
$sql = "SELECT * FROM riders WHERE '$field'='$key'";

【讨论】:

  • &lt;td&gt; &lt;?php echo r['column']; ?&gt; &lt;/td&gt; 应该是&lt;td&gt; &lt;?php echo $r['column']; ?&gt; &lt;/td&gt; 你忘了r['column'] 之前的$
  • 如果你喜欢 (+rep) ;) 可以帮我编辑它,但是是的,可能是打字快忘了放。
  • 它不允许我编辑它.. 当我改变它时它说Seems like nothing has changed 哈哈
  • 没问题,然后我编辑了 x) 虽然@rackemup420 还是不错的地方
  • 你也有 endif;在 foreach 结束时!
【解决方案2】:

所以我继续进行了几乎所有清理工作并使用http://php.net/manual/en/pdo.prepared-statements.php 重写了它,这更安全。我测试了它及其工作。这也不是最安全的方式,但它比您最初发布的代码更安全。您可以四处搜索并找到更多方法来进一步保护您的数据。

新代码:

define('DB_HOSTNAME', 'localhost');
define('DB_DATABASE', 'the24hourrace');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');

error_reporting(E_ALL);
ini_set('display_errors', 1);

function dataQuery($query, $params) {
$queryType = explode(' ', $query);

// establish database connection
try {
    $dbh = new PDO('mysql:host='.DB_HOSTNAME.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
    echo $e->getMessage();
    $errorCode = $e->getCode();
}

// run query
try {
    $queryResults = $dbh->prepare($query);
    $queryResults->execute($params);
    if($queryResults != null && 'SELECT' == $queryType[0]) {
        $results = $queryResults->fetchAll(PDO::FETCH_ASSOC);
        return $results;
    }
    $queryResults = null; // first of the two steps to properly close
    $dbh = null; // second step to close the connection
}
catch(PDOException $e) {
    $errorMsg = $e->getMessage();
    echo $errorMsg;
}
}

?>
<head>
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
<meta charset="utf-8" />

<title>The 24 Hour Race</title>
<div id="title">
    <a href="index.php"><img src="images/title.png"></img></a>
</div>
<p id="subtitle">For the toughest of the tough</p>
</head>
<body>
<div id="nav">
    <form method="post" action="index.php"  id="searchform">
        <br>
        <h3>Search in:</h3><select name="field">
        <option value="rider_no">Rider No.</option>
        <option value="category">Category</option>
        <option value="name">Name</option>
        <option value="team_name">Team Name</option>
        <option value="nationality">Nationality</option>
        <option value="year_participated">Year Participated</option>
        <option value="total_laps">Total Laps</option>
        <option value="fastest_lap">Fastest Lap</option>
        </select>
        <input type="text" name="key" required>
        <input type="submit" name="submit" value="Search"><br>
    </form>
    <br>
    <h3>Sort by years:</h3>            
    <ul>
        <li><a href="2007.php">2007</a></li>
        <li><a href="2008.php">2008</a></li>
        <li><a href="2009.php">2009</a></li>
        <li><a href="2010.php">2010</a></li>
        <li><a href="2011.php">2011</a></li>
        <li><a href="2012.php">2012</a></li>
        <li><a href="2013.php">2013</a></li>
        <li><a href="2014.php">2014</a></li>
        <li><a href="2015.php">2015</a></li>
    </ul>
</div>
<div id="form">            
    <table id="t01" align="right" cellspacing="2">
<thead>
    <tr>
        <td bgcolor="#ccc">Rider No.</td>
        <td bgcolor="#ccc">Category</td>
        <td bgcolor="#ccc">Name</td>
        <td bgcolor="#ccc">Team Name</td>
        <td bgcolor="#ccc">Nationality</td>
        <td bgcolor="#ccc">Year Participated</td>
        <td bgcolor="#ccc">Total Laps</td>
        <td bgcolor="#ccc">Fastest Lap</td>
    </tr>
</thead>
<tbody>
    <?php
    if (isset($_POST['submit'])) {
        $field = $_POST['field'];
        $key = $_POST['key'];
        $query = 'SELECT * FROM `riders` WHERE `'.$field.'` = ?';
        $params = array($key);
    }else{
        $query = 'SELECT * FROM `riders`';
        $params = array();
    }
    $results = dataQuery($query,$params);

    foreach($results as $row) {
   ?>
        <tr>
            <td><?php echo $row['rider_no']?></td>                    
            <td><?php echo $row['category']?></td>
            <td><?php echo $row['name']?></td>
            <td><?php echo $row['team_name']?></td>
            <td><?php echo $row['nationality']?></td>
            <td><?php echo $row['year_participated']?></td>
            <td><?php echo $row['total_laps']?></td>
            <td><?php echo $row['fastest_lap']?></td>
        </tr>
    <?php
    }
    ?>
 </tbody>
    </table>
</div>
</body>

【讨论】:

  • 伙计,这太棒了。我可能应该提到这是给学校的,所以我不需要任何太安全的东西(如果有的话),但这看起来很棒!我会尝试弄乱你的版本,因为我不想只是复制/粘贴哈哈 - 我会在我摆弄这段代码后在星期一回复你:) 谢谢!
  • 对不起,今天是星期三,我只是回复一下——我会尽快尝试代码,因为有其他东西弹出
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 2017-09-09
  • 2016-08-11
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多