【问题标题】:PHP - Select SQL Table using PHP variable in Select StatementPHP - 在 Select 语句中使用 PHP 变量选择 SQL 表
【发布时间】:2018-10-13 04:50:18
【问题描述】:

如何使用变量来选择 SQL 表?

$sselect = $_GET['series'];
$episodes = mysqli_query($conn, "SELECT * FROM '$sselect'") or die(mysqli_error());

【问题讨论】:

  • 您查询的表应该从不来自外部输入。听起来你应该重新考虑你的架构
  • @charlee 我不认为这篇文章很好地代表了任何人应该做的事情
  • @Phil,请详细说明
  • @CamAcc 我已经更新了我的答案,以包括菲尔想说的话。

标签: php sql variables select


【解决方案1】:

试试这个: 这应该有效。感谢@Phil,他指出表名应该用反引号括起来。我已经更新了我的答案来做到这一点。额外的单引号用于完成 MYSQL 查询。

$sselect = $_GET['series'];
$episodes = mysqli_query($conn, 'SELECT * FROM `'.$sselect.'`') or die(mysqli_error());    

更新:

Phil 的意思是,如果您使用 $_GET 变量,有人可以轻松地将 URL 替换为不同的表名,从而带来巨大的安全风险。例如,假设我有一个名为users 的表,但我期望$_GET 变量是以下变量之一:carspencilscolors

您希望表单返回这样的 URL:

www.example.com/index.php?series=pencils

但用户可以更改数据来表示:

www.example.com/index.php?series=users

允许用户/攻击者访问机密表。这不是一个好的做法,Phil 建议您更改表结构中的架构,这样用户就不会选择表名。

【讨论】:

  • MySQL 使用反引号来引用架构对象名(表/列名),而不是双引号~dev.mysql.com/doc/refman/5.7/en/identifiers.html
  • @Phil 对,但我这样的代码似乎仍然有效。我不知道为什么?
  • @Phil 谢谢我找到了原因。这是因为我的代码不是用于对象名称,而是用于对象值。
  • 如果您必须接受来自$_GET 的表名,我至少会创建一个表白名单并确保该值与其中一个匹配。
【解决方案2】:

为什么不使用简单的连接?

$sselect = $_GET['series']; $episodes = mysqli_query($conn, "SELECT * FROM ".$sselect) or die(mysqli_error());

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多