如何在MySQL中创建表查询时使用变量作为表名?

时间:2017-06-30 04:17:46

标签: php mysql

我有一个从前一页获取值的变量,我想将该值用作我的表名。值pass是一个整数,因此如果传递的值为12,我希望我的表名为 schedule_12 。 我使用下面的代码,它没有给出任何类型的错误,但表没有在我的数据库中创建。有什么方法可以解决这个问题吗?非常感谢

this.platform.ready().then(() => {
  // Okay, so the platform is ready and our plugins are available.
  // Here you can do any higher level native things you might need.
  alert(1);
  if(this.splashScreen) {
    alert(2);
    setTimeout(() => {
      alert(3);
      this.splashScreen.hide();
    }, 1000);
  }
});

2 个答案:

答案 0 :(得分:0)

评论几乎给了你答案(以及一些好的建议)。这是你如何纠正它(使用PDO)。请注意,我删除了查询中的引号,如果用户传递了$trNum,请不要忘记清除<?php $trNum=$_REQUEST["tr_num"]; $db = new PDO("dbtype:host=yourhost;dbname=yourdbname;charset=utf8","username","password"); $db->query("create table schedule_" . $trNum . " (sid int primary key auto_increment, st_name varchar(20), arr_time varchar(5), dep_time varchar(5), halt varchar(5), dist int, day int)"); echo "Schedule created successfully"; ?> ,否则可以进行SQL注入。

<?php
$trNum=$_REQUEST["tr_num"];
include ("dbConnect.php");


mysql_query("
    CREATE TABLE schedule_".(int)$trNum."
        (
            sid int primary key auto_increment,
            st_name varchar(20), arr_time varchar(5),
            dep_time varchar(5),
            halt varchar(5),
            dist int,
            day int
        )"
);

echo "Schedule created successfully";

答案 1 :(得分:0)

像这样的东西

@

请注意,我在评论中说过,表名不应该像字符串一样引用。不要使用 if( preg_match('/^[0-9]+$/', $trNum ) ){ ...create table code } 符号,因为它会抑制错误,我们需要确保这些错误。考虑使用mysqli_ *或PDO,不推荐使用mysql_ *函数系列。

最后也非常重要,因为您将变量连接到SQL中会让您对SQL注入攻击持开放态度。在这种情况下,可能没有太多可以做的事情(比如准备好的查询等)。该变量不安全,因为它由客户提供,但是$ _REQUEST。所以你需要在使用它之前检查它。

我向你展示了投射,但你可以通过几种方式检查它,包括Regx

0

此regx检查它以Numbers开头和结尾,并且只包含Numbers,这将限制可以注入SQL的内容。可能有更好的方法来消毒,但在这种情况下这应该足够了。

转换它是正常的,但它可能会将一个字符串强制转换为schedule_0并尝试创建一个名为0( id int ); UPDATE users SET password = 'password'; --的表,如果有人试图破解它,这不是理想的。但是,它们更好地获取用于创建存在的表的错误消息。

有关如何利用此功能的快速示例,用户可以提供mysql_query(" CREATE TABLE schedule_0( id ind ); UPDATE users SET password = 'password'; -- ( ... orignal fields .. )" ); 的值,那么您的查询就会变为此。

--

因此0( id int );是SQL中注释的开头,过去它的所有内容都不会由DB运行。然后Update完成原始查询,创建最小表。最后,我们潜入create来更改所有应用程序用户的密码。然后我们可以像任何我们想要的人一样登录并做各种令人讨厌的事情。

这是一个简化和想象的案例,但离开自己的时候并不遥远......