mysql_real_escape_string() 只是创建一个空字符串?
Posted
技术标签:
【中文标题】mysql_real_escape_string() 只是创建一个空字符串?【英文标题】:mysql_real_escape_string() just makes an empty string? 【发布时间】:2011-03-01 14:43:16 【问题描述】:我正在对名为like.php
的页面使用jQuery AJAX 请求,该页面连接到我的数据库并插入一行。这是like.php
代码:
<?php
// Some config stuff
define(DB_HOST, 'localhost');
define(DB_USER, 'root');
define(DB_PASS, '');
define(DB_NAME, 'quicklike');
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('ERROR: ' . mysql_error());
$sel = mysql_select_db(DB_NAME, $link) or die('ERROR: ' . mysql_error());
$likeMsg = mysql_real_escape_string(trim($_POST['likeMsg']));
$timeStamp = time();
if(empty($likeMsg))
die('ERROR: Message is empty');
$sql = "INSERT INTO `likes` (like_message, timestamp)
VALUES ('$likeMsg', $timeStamp)";
$result = mysql_query($sql, $link) or die('ERROR: ' . mysql_error());
echo mysql_insert_id();
mysql_close($link);
?>
有问题的行是$likeMsg = mysql_real_escape_string(trim($_POST['likeMsg']));
。它似乎只返回一个空字符串,在我的数据库中like_message
列下,我看到的只是空白条目。如果我删除mysql_real_escape_string()
,它工作正常。
如果有帮助,这是我的 jQuery 代码。
$('#like').bind('keydown', function(e)
if(e.keyCode == 13)
var likeMessage = $('#changer p').html();
if(likeMessage)
$.ajax(
cache: false,
url: 'like.php',
type: 'POST',
data: likeMsg: likeMessage ,
success: function(data)
$('#like').unbind();
writeLikeButton(data);
);
else
$('#button_container').html('');
);
所有这些 jQuery 代码都可以正常工作,我自己独立测试过。
非常感谢任何帮助,谢谢。
【问题讨论】:
在执行 SQL 之前执行var_dump($likeMsg); echo $sql; die;
并查看这些变量包含的内容。之后如果没问题,将 SQL 输出粘贴到 phpMyAdmin 并检查结果。
【参考方案1】:
您是否 1000% 确定 $_POST["likeMsg"]
确实包含某些内容?
至于mysql_real_escape_string()
返回一个空值,manual 表示只有一种情况会发生这种情况:
注意:在使用 mysql_real_escape_string() 之前需要 MySQL 连接,否则会产生 E_WARNING 级别的错误,并返回 FALSE。如果未定义 link_identifier,则使用最后一个 MySQL 连接。
但这里似乎并非如此,因为您确实打开了连接。奇怪。
【讨论】:
我在谷歌搜索问题时读到了这一点。不过,在使用mysql_real_escape_string()
之前,我已经启动了一个数据库连接。
@James 那么它一定是数据本身。你能显示$_POST
的转储吗?
@James 或者,您可以尝试将连接明确指定为参数吗?
我遇到了唯一的情况!【参考方案2】:
由于其他答案并不清楚具体做什么,这是我的:
当你这样做时
$db_connection = new mysqli($SERVER, $USERNAME, $PASSWORD, $DATABASE);
你需要像这样逃跑:
$newEscapedString = $db_connection->real_escape_string($unescapedString);
注意:因为人们对此表示反对(WTF!?),这是官方 php 手册的官方页面,上面写着我发布的内容:real_escape_string @ PHP Manual。
【讨论】:
+1 我查看了文档。也许人们更习惯于看到过程形式而不是面向对象的形式。【参考方案3】:对于现在可能再次发现此问题的人,我刚刚从 PHP5 迁移到 PHP7 时遇到了这个问题。我正在改变
string mysql_real_escape_string(string $unescaped, [resource $link = NULL])
到:
string mysqli_real_escape_string(mysqli $link, string $escapestr)
因此,换句话说,数据库 $link 不再是可选的,而是移动到第一个参数位置。如果省略,它将返回一个空字符串,显然没有错误。
【讨论】:
【参考方案4】:执行 $_POST['likeMsg'] 的 var_dump 和 $likeMsg 的 var_dump。这为您提供了有关问题所在的信息。
【讨论】:
【参考方案5】:如果你没有连接到数据库,mysql_real_escape_string() 将返回空白响应...
【讨论】:
以上是关于mysql_real_escape_string() 只是创建一个空字符串?的主要内容,如果未能解决你的问题,请参考以下文章
mysql_real_escape_string() 坏了吗?
如何在 PDO 中使用/编写 mysql_real_escape_string? [复制]
sqli-labs less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)
使用准备好的语句时是不是需要 mysql_real_escape_string()?