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

Php 如何在MySQL表中创建带有空格和通配符的SQL表名?,php,mysql,wildcard,Php,Mysql,Wildcard,我正在寻找一种在MySQL表中存储带有空格和通配符的值的方法。如何做到这一点?我尝试过使用mysql\u real\u escape\u string,但由于某些原因,它仍然无法创建带有通配符的表。我一直在做一些研究,我知道这并不复杂,但找不到我想要的 插入示例: $sql = "CREATE TABLE " . $_COOKIE['username'] . "_" . mysql_real_escape_string($wildcard_name) . " ( example int, exa

我正在寻找一种在MySQL表中存储带有空格和通配符的值的方法。如何做到这一点?我尝试过使用
mysql\u real\u escape\u 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);

可以使用“addcslashes”函数对通配符进行转义

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

您应该使用'quote'创建表

    @mysql_select_db('mydb') or die(DBCUSTOMERROR);
$mydata = ' * * ? % ';
$query = "INSERT INTO `mydb`.`mytable` ( `MyVarCharField`) VALUES  ('". $mydata.  "' );";
看起来您并没有试图使用特殊字符存储值,实际上您是在尝试使用特殊字符创建表标识符

$x = mysql_real_escape_string($x);
$x = addcslashes($x, '%_');
您可以在SQL中分隔标识符,因此可以允许使用特殊字符、空格、国际字符、SQL关键字等。在MySQL中,标识符分隔符是一个反勾号。在ANSI SQL(或带有
设置SQL的MySQL_MODE='ANSI'
)中,标识符分隔符是双引号

因此,您可以创建一个通常无效的表名,如果您在任何时候使用它进行分隔:

CREATE TABLE `SELECT - ORDER` ( ... );
INSERT INTO `SELECT - ORDER` VALUES ( ... );
SELECT ... FROM `SELECT - ORDER`;
但是,
mysql\u real\u escape\u string()
不是用于准备字符串以安全地用作标识符的正确函数。该函数用于字符串值,以使它们在单引号字符串中安全
mysql\u real\u escape\u 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}` ...";

您不需要为表名转义单引号、双引号或类似的通配符。

我可能在这方面有错误(如果有,请纠正我),但您不能使用它吗?

您有插入的示例吗?空格不应该是个问题。@Vache在上面的问题中添加了空格。是否确实要创建一个新表,而不是插入其中?(如果这听起来像个愚蠢的问题,很抱歉,但我不知道你从你的例子中想说什么…)对不起,这是个好问题。这只是代码的一部分,但我想问的问题是如何使用通配符“string”并将其用于MySQL。稍后我也会在代码中插入它。这很重要,因为您可以用于表名和存储数据的字符非常不同。但这是否适用于url?这还会修复SQL注入攻击可能出现的问题吗?该函数可用于任何字符串,URL不应该有问题。基本上,函数的第二个参数是要手动转义的字符。这有助于防止SQL注入,因为您添加了转义。希望这能有所帮助。我尝试添加斜杠(见上文),但它仍然无法创建表或数据行(忽略)。为什么会这样?剪贴簿_名称表示通配符字符串(hello moto)。谢谢你的帮助。我认为这个问题与你实际想做的不相符。要在表中插入字符串,可以使用mysql\u real\u escape\u string和addcslashes。然而,从代码来看,您实际上是在尝试创建一个表(而不是在其中插入数据)。为了创建表名,您必须去除(而不是转义)这些字符。我如何去除这些字符?