我有一个变量,它获取上一页的值,我想使用该值作为我的表名。传递的值是一个整数,因此如果传递的值是 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";
?>
最佳答案
类似这样的事情
<?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";
请注意,正如我在评论中所说,表名不应像字符串一样被引用。不要使用 @
符号,因为它会抑制错误,而我们需要确保一切正常。 mysql_* 系列函数已弃用,请考虑使用 mysqli_* 或 PDO。
最后也是非常重要的一点,因为您将变量连接到 SQL 中,所以您很容易受到 SQL 注入(inject)攻击。在这种情况下,您可能无能为力(例如准备好的查询等)。该变量并不安全,因为它是由客户端提供的,尽管是 $_REQUEST。所以使用前需要检查一下。
我向您展示了强制转换,但您可以通过多种方式检查它,包括 Regx
if( preg_match('/^[0-9]+$/', $trNum ) ){
...create table code
}
此 regx 检查它是否以数字开头和结尾,并且仅包含数字,这会限制可以注入(inject)到 SQL 中的内容。可能有更好的方法来清理它,但在这种情况下这应该足够了。
转换它是可以的,但如果有人试图破解它,它可能会将字符串转换为 0
并尝试创建名为 schedule_0
的表,这并不理想。然而,最好他们得到创建一个存在的表的错误消息,然后再选择替代方案。
作为如何利用此漏洞的简单示例,用户可以提供值 0( id int );更新用户设置密码='密码'; --
那么你的查询就变成这样了。
mysql_query("
CREATE TABLE schedule_0( id ind ); UPDATE users SET password = 'password'; --
(
... orignal fields ..
)"
);
因此 --
是 SQL 中注释的开始,超过它的所有内容都不会由数据库运行。然后 0( id int );
完成原始查询,创建一个最小表。最后,我们潜入一个更新
来更改所有应用程序用户的密码。然后我们可以以任何我们想要的身份登录并做各种令人讨厌的事情。
这是一个简化的想象案例,但与让自己敞开心扉时可能发生的情况相差不远......
关于php - MySQL建表查询时如何使用变量作为表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838522/