0

我有这个代码:

$query = "select id from votes where username = '$user' and article_id  = $this->id";

我试过这段代码来清理它:

$query = sprintf("select id from votes where username = '$user' and article_id = $this->id", 
    mysql_real_escape_string($user), 
    mysql_real_escape_string($password));

但我得到了 mysql_real_escape 行的这个错误:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 146 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 146

我在这里得到用户名,我不知道它是否足够安全:

function getUsername(){ return $this->username; }

谢谢

4

7 回答 7

8

您需要一个 mysql 连接才能使用 mysql_real_escape_string。

于 2009-06-05T17:06:47.703 回答
7

我建议为此使用准备好的语句而不是sprintf

于 2009-06-05T17:09:21.833 回答
3

不确定这是否是导致您的问题的原因,但我相信您的 sprintf 语句中的变量不应该是“$user”和“$this->id”,而应该是“%s”

http://us2.php.net/sprintf

于 2009-06-05T17:07:11.633 回答
3

警告:mysql_real_escape_string() [function.mysql-real-escape-string]:用户'mexautos'@'localhost'的访问被拒绝(使用密码:否)

警告:mysql_real_escape_string() [function.mysql-real-escape-string]:无法建立到服务器的链接

你检查链接了吗?它是活跃的吗?使用mysql_real_escape_string()之前需要连接上 你不会忘记设置密码吗?

尝试:

mysql -u mexautos -p

(如果没有密码,请输入 Enter)

另外,检查你的sprintf()函数,你需要使用 %s 来绑定你的变量

$a = 'Foo';
$b = 'Bar';
$foo = sprintf('Foo Bar %s %s', $a, $b);
于 2009-06-05T17:10:57.137 回答
2

你需要一个连接来使用 mysql_real_escape_string() 因为它使用服务器的编码类型来帮助清理。

sprintf() 也应该看起来像这样

$query = sprintf("SELECT id FROM votes WHERE username = '%s' and article_id = %d", 
    mysql_real_escape_string($user), 
    mysql_real_escape_string($password));
于 2009-06-05T17:08:25.843 回答
1

我建议使用像Zend_Db这样的成熟数据库抽象层(那里有很多)。对于生产系统,我不建议实施您自己的自制解决方案。

于 2009-06-05T17:08:01.290 回答
0

就像另一个说的那样,不是'$user'而是'%s',你需要一个开放的连接。

@Tomalak sprintf 更快——这就是使用它的原因——它是一个原生 C 函数。

于 2009-06-05T17:15:08.143 回答