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