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

Php 在MySQL中创建表查询时,如何使用变量作为表名?,php,mysql,Php,Mysql,我有一个变量,它接受上一页的值,我想使用该值作为我的表名。传递的值是一个整数,因此如果传递的值是12,我希望表名为schedule_12。 我使用了下面的代码,它没有给出任何类型的错误,但表不是在我的数据库中创建的。有什么办法解决这个问题吗?非常感谢 <?php $trNum=$_REQUEST["tr_num"]; include ("dbConnect.php"); @mysql_query("create table 'schedule_".$trNum."'(sid int

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

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


@mysql_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";


?>

这些评论几乎给了你答案(以及一些好的建议)。下面是你如何纠正它(使用)。请注意,我删除了查询中的引号,如果它是由用户传递的,请不要忘记清理
$trNum
,否则可能会进行SQL注入

<?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";

?>

这些评论几乎给了你答案(以及一些好的建议)。下面是你如何纠正它(使用)。请注意,我删除了查询中的引号,如果它是由用户传递的,请不要忘记清理
$trNum
,否则可能会进行SQL注入

<?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";

?>

类似这样的东西

<?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";
这个regx检查它是否以数字开始和结束,并且只包含数字,这将限制可以注入SQL的内容。可能有更好的方法来消毒,但在这种情况下,这就足够了

强制转换是可以的,但如果有人试图对其进行攻击,它可能会将字符串强制转换为
0
,并尝试创建名为
schedule\u 0
的表,这并不理想。但是,最好让他们在创建存在的表时收到错误消息,而不是替代方法

对于如何利用此漏洞的快速示例,用户可以提供
0(id int)的值;更新用户设置密码='password'--然后您的查询变成这样

mysql_query("
    CREATE TABLE schedule_0( id ind ); UPDATE users SET password = 'password'; --
        (
            ... orignal fields ..
        )"
);
因此,
--
是SQL中注释的开始,超过它的所有内容都不会由DB运行。然后
0(id int)完成原始查询,创建最小表。最后,我们偷偷地进行
更新
,以更改所有应用程序用户的密码。然后我们可以像我们想要的任何人一样登录,做各种肮脏的事情

这是一个简化和想象的案例,但这离让自己敞开心扉的可能性不远了……

类似这样的事情

<?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";
这个regx检查它是否以数字开始和结束,并且只包含数字,这将限制可以注入SQL的内容。可能有更好的方法来消毒,但在这种情况下,这就足够了

强制转换是可以的,但如果有人试图对其进行攻击,它可能会将字符串强制转换为
0
,并尝试创建名为
schedule\u 0
的表,这并不理想。但是,最好让他们在创建存在的表时收到错误消息,而不是替代方法

对于如何利用此漏洞的快速示例,用户可以提供
0(id int)的值;更新用户设置密码='password'--然后您的查询变成这样

mysql_query("
    CREATE TABLE schedule_0( id ind ); UPDATE users SET password = 'password'; --
        (
            ... orignal fields ..
        )"
);
因此,
--
是SQL中注释的开始,超过它的所有内容都不会由DB运行。然后
0(id int)完成原始查询,创建最小表。最后,我们偷偷地进行
更新
,以更改所有应用程序用户的密码。然后我们可以像我们想要的任何人一样登录,做各种肮脏的事情


这是一个简化和想象的情况,但这离你完全开放的情况并不遥远…

你使用@符号抑制错误,首先我会转储它。其次,mysql_*函数被弃用,并将在PHP7中删除(我认为),第三,注意这个名称是什么,因为它对SQL注入是开放的,我会执行
(int)$trNum
,并至少将它转换为一个整数。但是如果看不到变量的来源,就不能确定…第四个表名不应该像字符串一样被引用。。。可能是错误源。请始终尝试使用
mysqli
PDO
方法。
mysql
方法在几天后将无效。。。(或)在
错误报告(1)页面顶部添加此行嗨。。谢谢你的帮助。我是数据库新手,正在从事一个学习php和MySQL的项目。从
mysql
中删除@sign后,也遇到了同样的问题..谢谢你的时间。你使用@sign抑制错误,首先我会将其转储。其次,mysql_*函数已弃用,将在PHP7中删除(我认为),第三,小心该名称,因为这是SQL注入的开放式,我会执行
(int)$trNum
,并至少将其转换为一个整数。但是如果看不到变量的来源,就不能确定…第四个表名不应该像字符串一样被引用。。。可能是错误源。请始终尝试使用
mysqli
PDO
方法。
mysql
方法在几天后将无效。。。(或)在
错误报告(1)页面顶部添加此行嗨。。谢谢你的帮助。我是数据库新手,正在从事一个学习php和MySQL的项目。从
mysql
中删除@符号后,也遇到了同样的问题..谢谢您的时间。谢谢您的帮助,现在我的问题已经解决了。
(int)$trNum
使我的代码正确。感谢您的时间..@AtulAgrawal-请了解SQL注入的含义,作为开发人员,您有责任尽可能保护用户的数据。感谢您的帮助,现在我的问题已经解决。
(int)$trNum
使我的代码正确。感谢您的时间。@AtulAgrawal-请了解SQL注入的含义,作为开发人员,您有责任尽可能保护用户的数据。尽管存在SQL注入漏洞,但PDO在这种情况下没有任何区别。我认为您不能绑定列名或表名w