Php 把我的网站翻译成PDO,对吗?

Php 把我的网站翻译成PDO,对吗?,php,pdo,Php,Pdo,我最近刚开始研究pdo,因为我一直使用mysql太久了。 现在我正在把一些脚本翻译成PDO 这个注射完全安全吗 $name = isset($_GET['name']) ? $_GET['name'] : null; $stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'"); $stmt->execute(); $row = $stmt->fetch(); $stmt = $db->

我最近刚开始研究pdo,因为我一直使用mysql太久了。 现在我正在把一些脚本翻译成PDO

这个注射完全安全吗

$name = isset($_GET['name']) ? $_GET['name'] : null;

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'");
$stmt->execute();
$row = $stmt->fetch();



$stmt = $db->query("SELECT *, tr.name, t.name AS teamName FROM player AS p 
                LEFT JOIN team_ranks AS tr ON tr.id = p.rank_id 
                LEFT JOIN teams AS t on t.id = tr.team_id
                WHERE p.id = {$row['id']}");
$row = $stmt->fetch();

简短回答:没有。你误解了事先准备好的陈述

这一行仍然只是使用PHP双引号扩展创建一个静态SQL字符串。PDO/MySQL无法知道变量的位置,因此无法防止注入

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'");
您需要做的是:

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = :name");
这里,
:name
是一个传递到数据库的占位符,表示“当这个语句实际运行时,这里将有一个变量”。然后,要执行它,需要为该占位符传递一个值,就像将参数传递给函数一样:

$stmt->execute(array(':name' => $name));
或者,您可以使用为PDO提供有关参数的更多信息:

$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->execute();

数据库现在知道传入的变量应该作为一个字符串处理,而不是解释为SQL,因此无法将代码注入查询。

简短回答:不。您误解了准备好的语句

这一行仍然只是使用PHP双引号扩展创建一个静态SQL字符串。PDO/MySQL无法知道变量的位置,因此无法防止注入

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'");
您需要做的是:

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = :name");
这里,
:name
是一个传递到数据库的占位符,表示“当这个语句实际运行时,这里将有一个变量”。然后,要执行它,需要为该占位符传递一个值,就像将参数传递给函数一样:

$stmt->execute(array(':name' => $name));
或者,您可以使用为PDO提供有关参数的更多信息:

$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->execute();
数据库现在知道传入的变量应被视为一个字符串,而不是解释为SQL,因此无法将代码注入查询