使用PHP变量创建MySQL表

3

我正在尝试创建一个表格,其名称为存储在变量$name中的值。我尝试了许多不同的方法,但似乎都不起作用。这是我目前正在使用的代码:

 mysql_connect("localhost", "peltdyou_admin", "123456") or die(mysql_error()); 
 mysql_select_db("peltdyou_orders") or die(mysql_error()); 
 mysql_query("CREATE TABLE '" .$_POST['name']. "' ( name VARCHAR(30), age INT, car VARCHAR(30))");

我知道这与'" .$_POST['name']. "'有关,但我无法弄清楚它到底是什么。 我已经尝试了将其替换为'$name',该值从代码中更深处获取。

任何帮助都将不胜感激!


1
你尝试过输出你所生成的SQL语句,以确保它包含了你认为应该包含的内容吗? - andrewsi
3
不要直接在任何mySQL查询中使用POST数据。 - Hidde
1
据我所知,MySQL不需要在表名周围加引号。你尝试过去掉单引号吗? - Jeff Lambert
@Hidde,或GET或COOKIE或任何不可信的数据。 - Brad
检查您的 SQL 用户权限。 - scriptin
显示剩余3条评论
6个回答

8
请使用反引号而不是引号来包围表名,并转义输入!此外,尽管在本地主机上可以工作,但请确保在生产服务器上运行的用户具有创建表的权限(通常情况下,在共享托管上并没有这个权限)。 警告:您真的确定要根据用户输入创建一个表吗?您会用这种方式创建多少个表?难道您不能重新设计整个系统,以便插入
$name = mysql_real_escape_string($_POST['name']);
mysql_query("CREATE TABLE `".$name."` ( name VARCHAR(30), age INT, car VARCHAR(30))");

完美!非常好用,谢谢。我会在4分钟内接受答案。 - user1449737
当管理员向数据库添加新客户时,表将由管理员创建,因此不会被垃圾邮件攻击。 - user1449737
我建议将客户端添加到“客户端”表中作为新行,而不是创建新表... - Damien Pirsy
mysql_real_escape_string 在这里完全没有用。 - Your Common Sense

1

你应该使用PDO或MySQLi代替mysql_*函数。mysql_*函数正在被弃用,并且存在许多安全漏洞。

话虽如此,你不需要引用表名,而是应该使用无引号或反引号。


你如何使用PDO或mysqli将变量绑定到标识符? - Damien Pirsy
你的查询看起来像这样:CREATE TABLE :name (name VARCHAR(30), age INT, car VARCHAR(30))然后$stmt->bindParam(":name", $_POST['name']);如果想要一个完整的例子,你需要找到一个好的PDO教程,它会给你所有的基础知识。 - Cody Covey
你确定吗?文档上说的不一样。另外,阅读这篇文章:https://dev59.com/8XVC5IYBdhLWcg3wykaj - Damien Pirsy
没错,你说得对,无法使用bindParam来完成标识符。不过我不确定为什么你要给我的回答投反对票,因为这个回答根本没有提到绑定参数的问题... - Cody Covey
你是对的,我误读了你的回答 :). 我进行了一些小修改,以便撤销我的负评,再次抱歉! - Damien Pirsy

1

将其放入另一个变量中,它就可以工作了,在POST变量和mysql_query中的“'”字符之间存在冲突。

<?php
mysql_connect("localhost", "peltdyou_admin", "123456") or die(mysql_error()); 
mysql_select_db("peltdyou_orders") or die(mysql_error()); 
$name = mysql_real_escape_string($_POST['name']);
mysql_query("CREATE TABLE '$name' ( name VARCHAR(30), age INT, car VARCHAR(30))");
?>

我发布了这段代码来帮助你的编码,但是你不应该使用mysql_*函数,而应该使用mysqli_*函数。你可以在这里阅读更多关于它们的信息:http://php.net/manual/en/book.mysqli.php

准备语句是否适用于标识符?我认为它们仅适用于绑定值。 - Damien Pirsy
你是对的,它们确实不支持!如果你查看http://php.net/manual/en/mysqli.prepare.php 那里会告诉你:P我会把那个删除。那是一个错误,抱歉!!! - Dave_Peachy
mysql_real_escape_string 在这里完全没有用。 - Your Common Sense

0
CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `description` text NOT NULL,
  `price` double NOT NULL,
  `created` datetime NOT NULL,
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

0
使用最新的Mysqli连接器,您可以像这样做: 1.从用户输入创建一个变量,例如$variable = $ _POST['name'] 2.在下面的完整代码中使用该变量来查询

$variable = $ _POST['name']; mysqli_connect("localhost", "peltdyou_admin", "123456") or die(mysql_error()); mysqli_select_db("peltdyou_orders") or die(mysqli_connect_error()); mysqli_query("CREATE TABLE $variable ( name VARCHAR(30), age INT, car VARCHAR(30))");


0
$query = "CREATE TABLE $name" . '(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    age INT,
    name  varchar(30),
    car VARCHAR(30)
)';

1
我想知道如何将变量用作列名。 - Anusha
我们可以在foreach循环中编写创建查询吗?如何使用,请指导我。 - Anusha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接