我是PDO的新手,对不起,如果你觉得我在问愚蠢的问题.
没有Bind_param的普通和简单的PDO Prepared语句:
$sql = $db->prepare('SELECT * FROM employees WHERE name = ?');
$sql->execute(array($name));
$rows = $sql->fetchAll();
Run Code Online (Sandbox Code Playgroud)
与Bind_param:
$sql->bind_param("s", $name); //s means the database expects a string
Run Code Online (Sandbox Code Playgroud)
我听人说:"保护来自于使用绑定参数,而不是使用预处理语句".我可以知道什么是绑定参数?Bind_param是绑定参数?如果是,那么没有Bind_param的正常和简单的PDO Prepared语句不能完全阻止SQL注入?
保护来自使用绑定参数,而不是来自使用准备好的语句
意味着仅使用prepare()但保留查询中的所有变量是不够的:
$sql = $db->prepare("SELECT * FROM employees WHERE name ='$name'");
$sql->execute();
$rows = $sql->fetchAll();
Run Code Online (Sandbox Code Playgroud)
有人说这意味着“尽管从技术上讲,您使用的是准备好的语句,但您并没有将变量绑定到它”。所以它使查询同样容易受到攻击。
要受到保护,您必须用占位符替换查询中的所有变量,然后绑定它们:
$sql = $db->prepare("SELECT * FROM employees WHERE name = ?");
$sql->bindParam(1, $name);
$sql->execute();
$rows = $sql->fetchAll();
Run Code Online (Sandbox Code Playgroud)
但是,PDO 有一个很好的绑定简写,允许您避免重复调用bindParam()/ bindValue(),当您将变量发送到 时在内部执行所有这些调用execute():
$sql = $db->prepare('SELECT * FROM employees WHERE name = ?');
$sql->execute(array($name));
$rows = $sql->fetchAll();
Run Code Online (Sandbox Code Playgroud)
它本质上与bindParam()/绑定相同bindValue()。因此您的代码正在使用绑定,因此是安全的
最后,bind_param()实际上是一个与 PDO 无关的 mysqli 函数。