如何在MySQL表中创建带空格和通配符的SQL表名?

时间:2011-08-19 20:10:45

标签: php mysql wildcard

我正在寻找一种在MySQL表中存储带空格和通配符的值的方法。如何才能做到这一点?我尝试使用mysql_real_escape_string但由于某种原因,它仍然不会创建带有通配符的表。我一直在做一些研究,我知道它并不复杂但找不到我想要的东西。

插入示例:

$sql = "CREATE TABLE " . $_COOKIE['username'] . "_" . mysql_real_escape_string($wildcard_name) . "
(
example int,
example2 varchar(999),
example3 varchar(999),
example4 varchar(999)
)";
mysql_query($sql,$con);

尝试添加斜杠:

$con = mysql_connect("server","user","pass");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
  $scrapbook_name = $_POST["scrapbook_name"];
$scrapbook_name = mysql_real_escape_string($scrapbook_name);
$scrapbook_name = addcslashes($scrapbook_name, '%_');
// Create table
mysql_select_db("user_scrapbooks", $con);
$sql = "CREATE TABLE " . $_COOKIE['user'] . "_" . $scrapbook_name . "
(
id int,
name varchar(999),
description varchar(999),
link varchar(999)
)";
mysql_query($sql,$con);

5 个答案:

答案 0 :(得分:2)

您可以使用'addcslashes'函数来转义通配符。

$x = mysql_real_escape_string($x);
$x = addcslashes($x, '%_');

addcslashes doc

答案 1 :(得分:0)

您应该使用`quote。

创建表

答案 2 :(得分:0)

    @mysql_select_db('mydb') or die(DBCUSTOMERROR);
$mydata = ' * * ? % ';
$query = "INSERT INTO `mydb`.`mytable` ( `MyVarCharField`) VALUES  ('". $mydata.  "' );";

答案 3 :(得分:0)

$sql = "CREATE TABLE " . $_COOKIE['username'] . "_" 
       . mysql_real_escape_string($wildcard_name) . "

您似乎没有尝试使用特殊字符存储,实际上您正在尝试使用特殊字符创建表标识符

您可以在SQL中分隔标识符,因此您可以允许使用特殊字符,空格,国际字符,SQL关键字等。在MySQL中,标识符分隔符是一个反向标记。在ANSI SQL(或带有SET SQL_MODE='ANSI'的MySQL)中,标识符分隔符是双引号。

因此,您可以创建一个表名,如果您在使用它时随时将其分隔,该表名通常无效:

CREATE TABLE `SELECT - ORDER` ( ... );
INSERT INTO `SELECT - ORDER` VALUES ( ... );
SELECT ... FROM `SELECT - ORDER`;

但是,mysql_real_escape_string()不是用于准备要安全用作标识符的字符串的正确函数。该函数用于字符串值,以使其在单引号字符串中安全。 mysql_real_escape_string()无法回退。因此,如果您的表名包含反向标记,则可能会出现问题,即使您尝试将其转义并将其分隔:

$user_name = "foo` bar";
$sql = "CREATE TABLE `" . mysql_real_escape_string($username) ...

导致无效的SQL语句:

CREATE TABLE `foo` bar` ...

您应该真正过滤掉Cookie内容,删除无效字符。然后你可以更加确信它不会导致问题。

$user_name = preg_replace('/`/u', '', $_COOKIE['username']);
$table_name = "{$username}_{$wildcard_name}";
$sql = "CREATE TABLE `{$table_name}` ...";

您不需要为表名转义单引号或双引号或LIKE通配符。

答案 4 :(得分:0)

我可能错了(如果我是的话请纠正我),但你不能用serialize来做这个吗?