我试图根据我的数据库中的主题表为我的主题页面创建一个特定页面。问题是,where子句在我的$ _GET [' id']中读取我的列而不是topic_name。我有点不知道这是怎么发生的。
这是我的代码片段:
$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);
答案 0 :(得分:3)
不同的SQL部分具有不同的含义。例如,括在引号中的部分被视为字符串文字。
不带引号的部分更加模糊,根据上下文,可以是SQL关键字,SQL运算符,标识符(列或表名)或数字文字。鉴于这一切,您应该正确格式化查询部分。例如,字符串文字必须用引号括起来,并且所有特殊字符都会被转义。
由于您没有这样做,因此对于列名称采用“常规”字样,因为WHERE topic_name= General
是一个合法的(在此上下文中非常无意义)SQL语句,它将查找存储在General
字段,它是否存在于表中。唉,没有这样的领域,因此错误。
最重要的是,当您动态构建查询时,不得手动格式化任何数据文字,而是use prepared statements instead。
$stmt = $link->prepare("SELECT * FROM topics WHERE topic_name= ?");
$stmt->bind_param("s", $_GET['id']);
$stmt->execute();
$result = $stmt->get_result();
除了其他好处之外,它甚至可以消除将来出现这种错误的可能性。