【问题标题】:Unknown column 'x' in 'where clause' [1054]“where 子句”中的未知列“x”[1054]
【发布时间】:2013-07-20 20:07:45
【问题描述】:

我的网站与 phpbb 论坛集成在一起,我正在尝试使用一个 php 文件和一个模板来使用数据库中的不同行来拉出一个独特的页面。我的示例文件如下所示:

php 文件:

<?php
include "includes/phpbb.php";

$template->set_filenames(array(
'body'  => 'people.html',
));

$name = $_GET['name'];
$result = $db->sql_query("SELECT * FROM people WHERE name = $name");
while($row = $db->sql_fetchrow($result))
{
$template->assign_vars(array(
'NAME'          => $row['name'],
'AGE'           => $row['age'],
    ));
}

$site->page_footer();

?>

这里是html模板:

<!-- INCLUDE overall_header.html -->

{NAME} is {AGE} years old.

<!-- INCLUDE overall_footer.html -->

我在表格中有两行。一个叫“Walt”,年龄“51”,另一个叫“Jesse”,年龄“25”。每当我输入 people.php?name=Walt 之类的网址时,都会出现错误页面:

SQL ERROR [ mysqli ]

Unknown column 'Walt' in 'where clause' [1054]

SQL

SELECT * FROM people WHERE name = Walt

如果我输入任何类型的数值,它会很好地拉起页面,但没有填写任何变量,因此页面显示“已有数年”。如果我输入 ?name=name,它会拉出数据库表中的第二行,并显示“Jesse 25 岁”(这让我很困惑)。

我做错了什么导致这种情况?我显然希望能够在 url 中输入“Walt”或“Jesse”,并仅使用他们的一行信息来获取整个页面。

【问题讨论】:

    标签: php sql get


    【解决方案1】:

    只需将变量包含在字符串中。所以:

    $result = $db->sql_query("SELECT * FROM people WHERE name = '$name'");
    

    应该可以解决问题。

    非常非常非常小心。我认为$db 对象来自phpbb,他们会在执行之前清理任何数据库查询。但是盲目地接受用户输入并在没有卫生条件的情况下查询数据库将导致 SQL 注入和痛苦的世界。见What's the best method for sanitizing user input with PHP?

    【讨论】:

      【解决方案2】:

      名称应该用引号引起来:

      $result = $db->sql_query("SELECT * FROM people WHERE name = '$name'");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        相关资源
        最近更新 更多