如何在PHP中使用mysql_real_escape_string函数

时间:2011-04-17 04:30:12

标签: php mysql mysql-real-escape-string

所以在我编写的这个程序中,我实际上是使用表单从用户那里获取SQL查询。然后我继续在我的数据库上运行该查询。

我知道不要“信任”用户输入,所以我想对输入进行清理。我正在尝试使用mysql_real_escape_string,但却未能成功使用它。

根据输入,这是我正在尝试的内容: select * from Actor;

//"query" is the input string: 
$clean_string = mysql_real_escape_string($query, $db_connection); 
$rs = mysql_query($clean_string, $db_connection); 
if (!$rs) 
{ 
    echo "Invalid input!"; 
} 

这总是给我

  

“输入无效!”

错误。

当我取出clean_string部分并在查询时运行mysql_query时,

  

“无效   输入“

消息未输出。相反,当我这样做时:

$rs = mysql_query($query, $db_connection); 
if (!$rs) 
{ 
   echo "Invalid input!"; 
} 

不输出

  

“输入无效”。

但是,我需要使用mysql_real_escape_string功能。我做错了什么?

更新

鉴于 select * from Actor;作为输入,我发现了以下内容。

使用echo语句我已经 发现在清理之前,字符串包含值: select * from Actor; 哪个是对的。然而,在消毒之后它持有不正确的 值select *\r\nfrom Actor;,因此出现错误消息。为什么是 mysql_real_escape_string这样做?

6 个答案:

答案 0 :(得分:13)

在查询中的实际值上使用它,而不是整个查询字符串本身。

示例:

$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);

答案 1 :(得分:1)

切换到PDO,而不是使用过时的mysql扩展名。 Prepared statement参数不容易被注入,因为它们将值与语句分开。准备好的声明和PDO还有其他优点,包括性能,易用性和附加功能。如果您需要教程,请尝试“Writing MySQL Scripts with PHP and PDO”。

答案 2 :(得分:1)

mysql_real_escape_string()字符串转义函数。它不会使任何输入安全,只是字符串,而不是与LIKE子句一起使用,并且整数需要以不同的方式处理。

更简单,更通用的例子可能是:

 $post = array_map("mysql_real_escape_string", $_POST);
 // cleans all input variables at once

 mysql_query("SELECT * FROM tbl WHERE id='$post[id]' 
                OR name='$post[name]' OR mtime<'$post[mtime]' ");
 // uses escaped $post rather than the raw $_POST variables

请注意每个变量必须仍由' SQL字符串的单引号括起来。 (否则逃避将毫无意义。)

答案 3 :(得分:0)

您应该使用mysql_real_escape_string来转义查询的参数,而不是整个查询本身。

例如,假设您从表单收到两个变量。然后,您的代码将如下所示:

$Query = sprintf(
    'INSERT INTO SomeTable VALUES("%s", "%s")', 
    mysql_real_escape_string($_POST['a'], $DBConnection),
    mysql_real_escape_string($_POST['b'], $DBConnection)
);

$Result = mysql_query($Query, $DBConnection);

答案 4 :(得分:0)

手动mysql_real_escape_string()

  

转义字符串中的特殊字符   用于SQL语句

所以你无法逃避整个查询,只是数据...因为它会转义所有不安全的字符,如引号(查询的有效部分)。

如果您尝试这样的事情(以逃避整个查询)

echo mysql_real_escape_string("INSERT INTO some_table VALUES ('xyz', 'abc', '123');");

输出

  

插入some_table VALUES(\'xyz \',   \'abc \',\'123 \');

无效查询

答案 5 :(得分:0)

这对我有用。 dwolf(wtec.co)

<?php
// add data to db
require_once('../admin/connect.php');

$mysqli = new mysqli($servername, $username, $password, $dbname);

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$post = $mysqli->real_escape_string($_POST['name']);
$title = $mysqli->real_escape_string($_POST['message']);


/* this query with escaped $post,$title will work */
if ($mysqli->query("INSERT into press (title, post) VALUES ('$post', '$title')")) {
    printf("%d Row inserted.\n", $mysqli->affected_rows);
}

$mysqli->close();


//header("location:../admin"); 
?>