未捕获的mysqli_sql_exception:“ where子句”中的未知列

时间:2019-01-24 18:59:13

标签: php html mysql

当我尝试在数据库中选择一个字符串时,我的php代码出现问题。 好吧,我在那里有一个表格“ news”和一个字段“ category”(TINYTEXT类型)。我尝试使用“ where子句”显示该表中的字符串:

$Sql = 'SELECT * FROM `news` WHERE `category` = '.$Param['category'].' ORDER BY `id` DESC';

我必须说我通过使用URL路径1

收到了“ $ Param ['category']”

因此,如果我在表中任何字符串的“类别”值都具有诸如“游戏” 23之类的任何字符串类型值-我的表中的字符串不会显示此错误“致命错误:未捕获的mysqli_sql_exception:“ where子句”中的未知列“游戏””

但是,如果我将数据库中字符串的“ category”值更改为任何数字值-表中的字符串将正确显示!45

我的代码有什么问题?先感谢您!对不起,错误。

3 个答案:

答案 0 :(得分:0)

出于SQL injection protection的考虑,您需要使用准备好的查询,因为这将修复您的错误。我认为问题在于您的参数周围根本没有引号。结果,您正在构建如下查询:

SELECT * FROM `news` WHERE `category` = games ORDER BY `id` DESC
SELECT * FROM `news` WHERE `category` = 1 ORDER BY `id` DESC

后一个是有效的查询:mysql查找类别为1的记录。前一个不是:查询尝试查找列category与列games匹配的记录。后者不存在,因此会出现错误。您要构建以下查询:

SELECT * FROM `news` WHERE `category` = 'games' ORDER BY `id` DESC
SELECT * FROM `news` WHERE `category` = '1' ORDER BY `id` DESC

您将使用以下代码:

$Sql = "SELECT * FROM `news` WHERE `category` = '".$Param['category']."' ORDER BY `id` DESC";

(请注意,我切换到双引号,并在输入参数周围加上了单引号)。 但这仍然很,因为它使您极易受到SQL注入的攻击,这将使攻击者有可能下载或修改整个数据库。花时间阅读并学习如何使用prepared queries,这不仅更安全,而且从一开始就避免了该错误。

答案 1 :(得分:0)

其他人建议您使用参数化查询。这是一个很好的建议,但是他们并没有向您展示它的外观(并不是很难找到示例)。

这是一个使用PDO的简单示例:

$Sql = 'SELECT * FROM `news` WHERE `category` = ? ORDER BY `id` DESC';
$stmt = $pdo->prepare($Sql);
$stmt->execute([ $Param['category' ]);

这将执行查询,就像您将$Param['category']放入SQL中一样,但是即使值包含特殊字符,也可以完全安全地进行查询。

您不要在?占位符两边加上引号。这意味着查询会将其视为单个标量值,而不是列名。实际上,可以将参数 only 用于值-不能用于列名,表达式,SQL关键字或其他任何内容。

使用查询参数编写代码比不使用参数更容易,因为它使您的代码更易于编写和阅读。

答案 2 :(得分:-1)

如果不是表中的字段,则必须在查询中的任何字符串前后加上引号。试试这个:

$Sql = "SELECT * FROM `news` WHERE `category` = '".$Param['category']."' ORDER BY `id` DESC";

如前所述,如果要从必须提及代码注入的来源中提取该字符串,则应使用准备好的语句或PDO。