使用查询字符串中的变量获取数据?

时间:2013-08-12 20:11:42

标签: php mysql query-string

我希望我在这里使用的标题是可以理解的......

我有一个包含两列的数据库:ward_id和ward_name。

我希望为每个病房创建动态页面,并在页面标题中显示ward_name。我创建了一个header.php文件,我将其包括在内。

我使用....?wid = {$ row ['ward_id']}将URL传递给URL,当我创建其他使用该ID从数据库中获取数据的查询时,该工作正常。

但是我遇到的问题是该页面拒绝将ward_name显示为页面标题。我期待这样的事情发挥作用:

    $wardid = $_GET['wid'];

    $query = "SELECT ward_name, ward_id FROM wards WHERE ward_id=$wardid";
    $result = mysql_query($query);

    while ($row=mysql_fetch_array($result))
    {
$pagetitle = "$row['ward_name']";
    }

但事实并非如此,我已经在上面尝试了很多变化我现在不可能记住它们所以我真的希望有人可以帮助我......这是目前的代码:

标题页:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
    <meta charset="utf-8">
    <title><?php echo $pagetitle; ?></title>
    <link rel="stylesheet" href="style.css">
    </head>

    <body>

        <div class="wholepage">

            <div class="headlinewrapper">
                <div class="headline">
                    <h1></h1>
                    <h2></h2>
                </div>
            </div>

            <div class="headlinesidewrapper">
                <div class="headlineside">
                    <p>shv jsfj sjnsf jnsf nsnf nj njsfn
njfjn sfns njf njnsf njs dgbjn dn jnd njjn dd d d nj njd njnd njd nn djndj njd</p>
                </div>
            </div>

            <div class="topnavigation">
                <ul>
                <li><a href="index.php">Home</a></li>
                <li><a href="boroughs.php">Boroughs</a></li>
                <li><a href="wards.php">Wards</a></li>
                </ul>
            </div>

            <div class="sidebar">

            </div>

            <div class="mainpagewrapper">

动态页面:

<?php

    $pagetitle = "Hello";
    include ('header.php');

    ?>

                <div class="mainpage">
                    <div class="infobox">

                    </div>
    <?php

    require('mysqli_connect.php');

    mysql_select_db('onetwom2_london');


    $wardid = $_GET['wid'];

    $query = "SELECT ward_name, ward_id FROM wards WHERE ward_id=$wardid";
    $result = mysql_query($query);

    while ($row=mysql_fetch_array($result))
    {
    echo "<div class=\"boroughlist\"><p>{$row['ward_name']}</p></div>" ;
    }

    $pagetitle = $result;

    ?>

    <div class="clear">
    </div>      
                </div>
            </div>
        </div>


    </body>

    </html>

所以我只想知道如何/是否可以将通过URL传递的id与存储在数据库中的ward_id进行匹配,然后让页面标题显示与该id相关联的ward_name。如果这是一个非常简单的问题我很抱歉,我花了好几个小时试图解决这个问题,而且我完全难过了! (我上面发布的代码只是5小时挫折的最终结果所以请欣赏我在向你寻求帮助之前已经努力了:))

3 个答案:

答案 0 :(得分:0)

帮自己一个忙,并使用一些ORM或库来为您提供参数化查询。

此代码为您打开SQL注入攻击:

$wardid = $_GET['wid'];

$query = "SELECT ward_name, ward_id FROM wards WHERE ward_id=$wardid";

答案 1 :(得分:0)

首先, 尽量避免使用双引号。请改用单'引号。双引号使php查找将被解析的字符串中的变量。使用单引号,字符串中的任何变量都将以纯文本形式回显,从而提高整体性能。

所以,

而不是

$pagetitle = "$row['ward_name']";

你想用

$pagetitle = $row['ward_name'];

同样在这里:

echo "<div class=\"boroughlist\"><p>{$row['ward_name']}</p></div>";

应改为:

echo '<div class="boroughlist"><p>'.$row['ward_name'].'</p></div>';

使用单引号会使\"也过时,使代码更具可读性,并且编写起来会更容易。


在PHP中使用数据库我建议您使用MySQLi类。看看https://github.com/ajillion/PHP-MySQLi-Database-Class。它易于实施且学习曲线较低。

MySQLi是MySQL的继承者(现在已弃用)。随着MySQLi prepared statements的引入,使得包含(用户)输入的查询保存为SQL InjectionPDO会更好,但使用起来会更难。

关于 $wardid = $_GET['wid'];:确保将值解释为整数。所以试试这个:

$wardid = (int) $_GET['wid']; // type cast to integer aka Type Juggling
$query  = 'SELECT ward_name, ward_id FROM wards WHERE ward_id=`'.$wardid.'` LIMIT 1';

注意LIMIT 1。这会将查询限制为一个结果,使其在找到结果后立即停止,效果更好。

祝你学习更多关于SQL和PHP的信息: - )


编辑:

根据a comment from the questioner,我想添加问题中给出的代码的重写示例

<?php

    // I'll demonstrate how to use the MySQLi Class
    require_once('mysqlidb.php');

    // Connect to the database
    $db = new Mysqlidb('host', 'username', 'password', 'databaseName');

    // Get the wid from the uri
    $wardid = $_GET['wid'];

    // Fetch the page title from the db
    $result    = $db->where('ward_id', $wardid)->get('wards', 1);
    $pagetitle = $result['ward_name'];

?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title><?php echo $pageTitle; ?></title>
    <link rel="stylesheet" href="style.css">
</head>
<body>

    <!-- A templating engine like smarty would make things easier -->
    <section class="whole-page">
        <div class="headline-wrapper">
            <div class="headline">
                <h1></h1>
                <h2></h2>
            </div>
        </div>
    </section>

    <div class="headline-sidewrapper">
        <div class="headline-side">
            <p>Lorem ipsum...</p>
        </div>
    </div>

    <nav class="top-navigation">
        <ul>
            <li><a href="index.php">Home</a></li>
            <li><a href="boroughs.php">Boroughs</a></li>
            <li><a href="wards.php">Wards</a></li>
        </ul>
    </nav>

    <aside class="sidebar"></aside>

    <section class="mainpage-wrapper">
        <!-- Dynamic page part - I recommend using a separate template that will be included here -->
    </section>

</body>
</html>

这是使用MySQLi数据库类的基本示例。我建议您使用像smarty这样的模板引擎来简化这样的工作。另请考虑阅读'Separation of concerns'

答案 2 :(得分:0)

你应该逐步解决问题,看看它在哪里出错,在while循环中使用var-dump $ pagetitle。如果它出现为NULL,请查看存储的内容,您没有从数据库中检索任何内容,并且任何一个Query都存在问题。如果它有正确的变量问题是你的PHP。你的header.php文件中的var_dump $ pagetitle,以确保它获得正确的变量。

让我知道结果,我可以从那里帮助你

<?php
    $wardid = $_GET['wid'];
    $query = "SELECT ward_name, ward_id FROM wards WHERE ward_id=$wardid";
    $result = mysql_query($query);
    while ($row=mysql_fetch_array($result))
    {
        $pagetitle = "$row['ward_name']";
        //Step Through The Problem
        var_dump($pagetitle);
    }
    include ('header.php');
?>
<div class="mainpage">
  <div class="infobox">
   </div>
  <?php
    require('mysqli_connect.php');
    mysql_select_db('onetwom2_london');
    $wardid = $_GET['wid'];
    $query = "SELECT ward_name, ward_id FROM wards WHERE ward_id=$wardid";
    $result = mysql_query($query);
    while ($row=mysql_fetch_array($result))
    {
       echo "<div class=\"boroughlist\"><p>{$row['ward_name']}</p></div>" ;
    }
    $pagetitle = $result;
  ?>
    <div class="clear">
    </div>      
</div>

更新 - 试试这个

<?php
    require('mysqli_connect.php');
    mysql_select_db('onetwom2_london');
    $wardid = $_GET['wid'];
    $query = "SELECT ward_name, ward_id FROM wards WHERE ward_id=$wardid";
    $result = mysql_query($query);
    while ($row=mysql_fetch_array($result))
    {
        $pagetitle = $row['ward_name'];
        //Step Through The Problem
        var_dump($pagetitle);
    }
    include ('header.php');
?>
<div class="mainpage">
  <div class="infobox">
   </div>
  <?php
    $result2 = mysql_query($query);
    while ($row2=mysql_fetch_array($result2))
    {
       echo "<div class=\"boroughlist\"><p>{$row2['ward_name']}</p></div>" ;
    }
  ?>
    <div class="clear">
    </div>      
</div>