php - MySQL建表查询时如何使用变量作为表名?

标签 php mysql

我有一个变量,它获取上一页的值,我想使用该值作为我的表名。传递的值是一个整数,因此如果传递的值是 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/

相关文章:

php - date() 期望参数 2 为整数,给定 float

php - 匹配标题、php、mysql

php - Go webserver 性能稳定性如何,与 Tomcat、Apache 相比,长期运行稳定性如何?

php - 使用 CakePHP 查询时得到错误的结果

PHP 页面结构到数组

php - mysqli_fetch_assoc()期望参数1为mysqli_result,在第8行(目录)中给定的 bool 值

mysql - 我可以同时使用replicate-ignore-db 和replicate-do-table 吗?

PHP页面显示空白

mysql - 无法在 phpmyadmin - mysql 中添加外键约束

mysql - 多个 NOT EXISTS SQL