我正在寻找一种在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);
您可以使用"addcslasms"函数来转义通配符。
$x = mysql_real_escape_string($x);
$x = addcslashes($x, '%_');
addcslasms文档
您应该使用`quote创建表。
@mysql_select_db('mydb') or die(DBCUSTOMERROR);
$mydata = ' * * ? % ';
$query = "INSERT INTO `mydb`.`mytable` ( `MyVarCharField`) VALUES ('". $mydata. "' );";
$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通配符。
我可能错了(如果我错了,请纠正我(,但你不能为此使用序列化吗?