Php “where子句”中的未知列“General”

Php “where子句”中的未知列“General”,php,mysqli,Php,Mysqli,我正试图根据数据库中的主题表为web论坛的主题页面创建一个特定页面。问题是,where子句在我的$_GET['id']中读取作为我的列,而不是主题名。我对这是怎么发生的有点困惑 以下是我的代码片段: $sql = "SELECT * FROM topics WHERE topic_name= " . mysqli_real_escape_string($link,$_GET['id']); echo $sql; $

我正试图根据数据库中的主题表为web论坛的主题页面创建一个特定页面。问题是,where子句在我的$_GET['id']中读取作为我的列,而不是主题名。我对这是怎么发生的有点困惑

以下是我的代码片段:

$sql = "SELECT *
        FROM
            topics
        WHERE 
            topic_name= " . mysqli_real_escape_string($link,$_GET['id']);
echo $sql;
$result = mysqli_query($link, $sql);
echo mysqli_error($link);

不同的SQL部分有不同的含义。例如,引号中包含的部分被视为字符串文字

不带引号的部分更不明确,根据上下文的不同,可以是SQL关键字、SQL运算符、标识符、列或表名或数字文字。考虑到所有这些,您应该正确设置查询部分的格式。例如,字符串文字必须用引号括起来,并对所有特殊字符进行转义

由于您未能这样做,“General”一词被用作列名,因为topic_name=General在本上下文SQL语句中是一个合法但毫无意义的语句,它将查找存储在General字段中的值,而不是表中的值。唉,没有这样的字段,因此出现了错误

最重要的一点是,在动态构建查询时,决不能手动格式化任何数据文本,而必须手动格式化


除了其他好处之外,它甚至可以消除将来出现此类错误的可能性。

您可以发布$sql的结果值吗?您发布的内容不支持您包含的代码。@ceejayoz您是说$sql的回音吗?这是:从topic_name=General@YourCommonSense我觉得不是很清楚。不过,我对此有点不以为然,一周前才开始使用php。我知道它读取的是“id”作为列,但我不知道如何让它读取topic_name作为列。你说这是一个片段,对我来说,这意味着你可能试图从循环结果集中的其他地方回显结果。我们需要知道完整和准确的错误,包括文件名和行号。这个?id-$\u GET['id']来自某个地方。感谢您提供有关准备好的声明的信息。我甚至不知道这是一件事。从现在起,我将尝试将这种使用sql的方法合并到我的代码中。我个人讨厌歧义。作为进一步的步骤,考虑使用代替MySQL。它有更干净的API和许多非常有用的助手方法。@YourCommonSense如果你对我有问题,请在Twitter上随意点击@me-我知道你在那里。在回答/评论中对我的职位进行被动攻击有点不合适。我已经把你的好答案删掉了。@YourCommonSense不使用SELECT的查询如何得到结果?get_结果仅适用于选择查询。@TalhaAhmed get_结果适用于任何返回结果集的查询。
$stmt = $link->prepare("SELECT * FROM topics WHERE topic_name= ?"); 
$stmt->bind_param("s", $_GET['id']);
$stmt->execute();
$result = $stmt->get_result();