【问题标题】:Get data using variable from query string?使用查询字符串中的变量获取数据?
【发布时间】:2013-08-12 20:11:42
【问题描述】:

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

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

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

我使用 ....?wid={$row['ward_id']} 通过 URL 传递 id,当我创建使用该 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 个小时的挫折的最终结果,所以请感谢我在向你寻求帮助之前已经努力了 :))

【问题讨论】:

  • 您不需要将值括在(双)引号中。尝试将$pagetitle = "$row['ward_name']"; 更改为$pagetitle = $row['ward_name'];
  • 嗨,Markus,我已经尝试了您的建议,但没有运气,我实际上希望有人可以尝试重写我发布的代码,因为我尝试了很多变化,我的头脑在旋转。跨度>
  • 您也不需要while() 循环来获取数据库中的单个值。使用 while 表明数据库中可能有 MULTIPLE ward_id。
  • @MWells 好的,我会尽快用重写代码更新我的答案。
  • 使用PDO忘记mysql扩展。

标签: php mysql query-string


【解决方案1】:

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

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

<?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>

【讨论】:

  • 您好 wmfrancia,我已经修改了我的代码并将其添加到您的答案中(但现在我认为这是错误的做法:/)目前该页面在正文中显示正确的 ward_name 值页面,但页面标题正在显示值:mysqli_connect
  • 再次您好,感谢您的努力。我完全按照上面的方法尝试了代码,页面在正文中显示了正确的 ward_name,但页面标题只是网站地址(例如 blahblahblah.co.uk),然后我添加了 require('mysqli_connect.php'); mysql_select_db('onetwom2_london');在第一个
  • 嗯,我删除了代码中的一些冗余,看起来您的 mySql 代码有些问题。尝试将所有内容都转换为 MySqli
  • 是的,它不起作用似乎很奇怪,在我(没有经验的)眼中,这段代码似乎并不特别复杂......就像最后的努力一样,问题可能完全出在 header.php还是我将它包含在动态页面中时的定位?
  • 您好 wmfrancia 我已将您的答案标记为正确,因为您的代码是正确的。问题在于我包含的一个文件已经分配了一个页面标题,该页面标题覆盖了我的变量:/我知道这是一个非常业余的错误,但通过聆听这里的所有答案,我从中学到了很多,非常感谢努力帮助我:)
【解决方案2】:

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

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

$wardid = $_GET['wid'];

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

【讨论】:

  • 嗨,丹,我会做的,但我想做的事是否可能?我觉得如果我做不到这一点,我就不应该尝试其他可能更高级的东西。
  • $pagetitle = $result; 是什么意思
  • 嗨 Momo,我只是用它来了解我想要实现的目标。我想将数据库中的 ward_name 显示为页面标题。上面的代码非常不工作,所以我正在寻找有关如何做到这一点的建议,如有必要,根据需要重写上面的代码。
  • 这不是答案。应该是评论。
  • @MarcB:哦,是吗?您尝试将所有这些信息粘贴在评论中,您会看到它的可读性。
【解决方案3】:

首先, 尽量避免使用双引号。请改用单个 ' 引号。双引号使 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 Injection 上。 PDO 会更好,但更难使用。

关于 $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'

【讨论】:

  • 嗨,Markus,感谢您的努力。我下载了 mysqlidb 文件并使用了您在上面发布的代码并替换了我的登录详细信息,但每次我尝试访问该页面时都会收到 http 500 错误:(
  • HTTP 500 错误是 server-side 并告诉您负责显示所请求页面的服务器有问题。 你有吗访问您的服务器错误日志文件?在浏览器中加载页面后,尝试找到它们并检查最后几行。这应该提供足够的数据来找到问题的原因。 还可以尝试在浏览器中使用shift+f5(在WIN 机器上)或cmd+f5 or cmd+shift+r(在Mac 上)在浏览器中进行硬刷新。这会清除浏览器缓存并重新加载页面。您使用的是 wamp 还是 xamp 设置?确保所有服务都处于活动状态并正在运行
  • 哈哈。在我之前的评论中毫无目的地使用了所有 600 可用字符:-P
  • 您好,markus,非常感谢您的所有努力,非常感谢您的帮助。我今天又花了几个小时在上面,终于找出了问题所在。它与 mysqli_connect.php 文件有关,该文件已经定义了一个页面标题,它覆盖了我的变量。一旦我从该文件中删除了 head 部分,变量就起作用了。一个简单的错误,但由于我没有经验,我今天查看源代码时才注意到。我希望你不会觉得你的努力被浪费了,因为我认为我从查看你的答案中学到了很多东西,以帮助避免未来的问题! :)
  • @MWells 很高兴您发现了问题所在!如果您想回馈我的努力,请投票支持我的答案并考虑接受它。我想为您的 php 代码未来debugging提供一些东西:开始使用 the / a php linter 来检查您的代码中常见的错误 自动点击按钮或在控制台中输入 press。还有更多工具可以帮助您调试您的代码。也可以使用 IDE 或类似 TextMate / SublimeText 的东西。这就是 cool kids 在那里使用的东西。检查出来,然后给我回馈:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多