【问题标题】:How can I create an SQL table name with spaces and wildcard characters in a MySQL table?如何在 MySQL 表中创建包含空格和通配符的 SQL 表名?
【发布时间】:2011-08-19 20:10:45
【问题描述】:

我正在寻找一种在 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);

【问题讨论】:

  • 你有插入的例子吗?空间应该不是问题。
  • @Vache 添加到上述问题。
  • 您确定要创建一个新表而不是插入其中吗? (对不起,如果这听起来像一个愚蠢的问题,但我不知道你从你的例子要去哪里......)
  • 抱歉,这是个好问题。这只是代码的一部分,但我想问的问题的重点是如何使用通配符“字符串”并将其与 MySQL 一起使用。我稍后也会在代码中插入它。
  • 这很重要,因为您可以用于表名和存储数据的字符非常不同。

标签: php mysql wildcard


【解决方案1】:

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

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

addcslashes doc

【讨论】:

  • 这对 url 有效吗?这也能解决 SQL 注入攻击的任何可能问题吗?
  • 该函数可用于任何字符串,不应该是 URL 的问题。基本上,该函数的第二个参数是您要手动转义的字符。它可以帮助防止 SQL 注入,因为您添加了转义。希望对您有所帮助。
  • 我尝试添加斜杠(见上文),但它仍然不会创建表或数据行(忽略)。为什么是这样?剪贴簿名称代表通配符字符串 (hello moto)。感谢您的帮助。
  • 我认为这个问题与您实际尝试做的不符。要将字符串插入表中,您可以使用 mysql_real_escape_string 和 addcslashes。但是,从查看代码来看,您实际上是在尝试创建一个表(而不是将数据插入其中)。您必须删除(而不是转义)这些字符才能创建表名。
  • 我如何去掉这些字符?
【解决方案2】:

您应该使用 `quote 创建表。

【讨论】:

    【解决方案3】:
        @mysql_select_db('mydb') or die(DBCUSTOMERROR);
    $mydata = ' * * ? % ';
    $query = "INSERT INTO `mydb`.`mytable` ( `MyVarCharField`) VALUES  ('". $mydata.  "' );";
    

    【讨论】:

      【解决方案4】:
      $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 通配符。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-21
          • 2017-11-27
          • 1970-01-01
          • 1970-01-01
          • 2012-09-15
          相关资源
          最近更新 更多