如何在PDO中使用/编写mysql_real_escape_string函数?

30 浏览
0 Comments

如何在PDO中使用/编写mysql_real_escape_string函数?

在我的代码中,我试图将mysql_real_escape_string转换为PDO语句。有人知道如何在PDO中编写mysql_real_escape_string吗?

我在两行中使用了mysql_real_escape_string:

$userName = mysql_real_escape_string($_POST['username']);

$password = sha1(mysql_real_escape_string($_POST['password']));

ob_start();

session_start();

include("../database/db.php");

$userName = mysql_real_escape_string($_POST['username']);

$password = sha1(mysql_real_escape_string($_POST['password']));

echo "
user: " . $userName;

echo "
pw: " . $password;

$query = "select * from tbladmin where admin_usr_name='$userName' and admin_pwd='$password'";

$res = mysql_query($query);

$rows = mysql_fetch_assoc($res);

echo "
numrows" . mysql_num_rows($res) . "
";

if(mysql_num_rows($res)>0)

{

$_SESSION['userName'] = $rows['admin_usr_name'];

$_SESSION['admin_id'] = $rows['admin_id'];

header("location: ../pages/content.php");

}

else

{

echo 'Username and password dont match
Try again';

header("location: ../index.php?loginerror=yes");

}

?>

我希望用PDO做到这一点

$host = "localhost";

$user = "root";

$password = "root";

$db = "blog";

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";

$opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC);

$pdo = new PDO($dsn,$user,$password, $opt);

$username = $_POST['username'];

$password = $_POST['password'];

$query = "select * from tbladmin where admin_usr_name=:userName and admin_pwd=:passWord";

try

{

$databas = new PDO($dsn, $user, $password);

}

catch (PDOException $e)

{

echo 'Connection failed: ' . $e->getMessage();

}

$statement = $databas->prepare($query);

$statement->execute(array(':userName'=>$username, ':passWord'=> $password));

$row = $statement->fetch();

我总是得到这个错误:

Call to a member function prepare() on a non-object

0
0 Comments

使用PDO时,不需要使用mysql_real_escape_string函数,至少很少需要使用。可以使用参数化SQL和绑定参数的方式来避免SQL注入攻击。PDO::QUOTE方法会自动转义字符串,可以在需要时使用。不过,强烈建议使用准备好的语句来避免使用PDO::QUOTE方法。

有时,可能会遇到缺乏正确字符串格式的文本,但使用准备好的语句时,不需要使用PDO::QUOTE方法。我将其作为一个选项提供,并提供了前两个链接作为静态参考。

有人问道,什么时候才需要使用PDO::QUOTE方法?我同意使用PDO::QUOTE方法作为最后的选择。

有人回答说,你永远不知道,有时最严重的问题可能是唯一的选择。

总之,在使用PDO时,使用参数化SQL和绑定参数的方式是最安全的方式,可以避免使用mysql_real_escape_string函数。而使用PDO::QUOTE方法作为备选方案,但强烈建议使用准备好的语句来避免使用PDO::QUOTE方法。

0
0 Comments

在使用PDO时,不需要使用mysql_real_escape_string进行转义,因为通过使用?绑定值或在sql语句中使用冒号进行命名可以更安全地处理转义。下面是一个示例代码:

getMessage();
}
$statement = $db->prepare($query);
//:userName and :passWord is set when actually executing the query
$statement->execute(array(':userName'=>$username, ':passWord'=> $password)); 
$row = $statement->fetch();
?>

注意,fetch()只会返回一行记录(结果集中的下一行)。如果要访问整个记录集,有两种方法:

1. 使用while() { }循环遍历结果集。

2. 使用$rows = $statement->fetchAll();,然后遍历数组$rows。

对于较大的结果集,使用方法1;对于较小的结果集(并且知道结果集不会增长很多),使用方法2。

此外,需要考虑是否设置PDO::ATTR_EMULATE_PREPARES属性。关于此属性的更多信息,请参考PDO MySQL: Use PDO::ATTR_EMULATE_PREPARES or not?

在代码运行时,有用户报告了一个错误信息:Fatal error: Call to a member function prepare() on a non-object,并询问了代码中的$db是什么。原因是代码中没有为$db赋值。为了解决这个问题,我添加了一些示例代码。$db是PDO对象,$dsn是主机和数据库名称,$un是连接数据库的用户名,$pw是连接数据库的密码。可以参考php.net/manual/en/pdo.construct.php获取有关创建PDO对象的更多信息。

用户对此回答表示感谢,并准备尝试修改后的代码。

如果在使用过程中遇到问题,请随时提问。

用户反馈在运行修改后的代码时仍然遇到了错误:Call to a member function prepare() on a non-object。用户要求再次查看代码。

0
0 Comments

在使用预处理语句和绑定值的情况下,不需要使用mysql_real_escape_string等函数。

请查看PDO文档以了解如何使用绑定值和预处理语句。

你可以按照以下方式编写SQL查询语句:

$query = $pdo->prepare("SELECT * FROM users WHERE username = ? and password = ?");

然后,你可以将绑定值传递给?符号的位置,这样查询语句就只会按照字面意思运行:

$query->bindParam(1, $username);
$query->bindParam(2, $password);

任何尝试进行SQL注入的企图,例如1'; DROP users --,都不起作用,因为它们会被当作字面值调用。

谢谢,非常好的回答。我会查看PDO文档。

一旦你使用PDO来运行数据库查询,你会感到更加安全。如果你需要任何帮助,请随时告诉我!

0