我正在寻找一种在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);
答案 0 :(得分:2)
您可以使用'addcslashes'函数来转义通配符。
$x = mysql_real_escape_string($x);
$x = addcslashes($x, '%_');
答案 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来做这个吗?