假设我有这样的代码:
$dbh = new PDO("blahblah");
$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );
Run Code Online (Sandbox Code Playgroud)
PDO文件说:
准备语句的参数不需要引用; 司机为你处理.
这真的是我需要做的就是避免SQL注入吗?这真的很容易吗?
如果它有所作为,你可以假设MySQL.另外,我真的只是对使用针对SQL注入的预处理语句感到好奇.在这种情况下,我不关心XSS或其他可能的漏洞.
我被告知我会更好地使用PDOMySQL转义,而不是mysql_real_escape_string.
也许我有一个脑死亡的日子(或者可能是因为我没有想象力是一个天生的程序员,而且我仍然处于PHP的新手阶段),但是检查了PHP手册并阅读了关于PDO的条目,我仍然不清楚PDO究竟是什么以及为什么它比使用更好mysql_real_escape_string.这可能是因为我还没有真正掌握OOP的复杂性(我假设它与OOP有关),但除了变量和数组值似乎在其前面有冒号之外,我仍然不确定它到底是什么以及你如何使用它(以及为什么它比它好mysql_real_escape_string.(它也可能与我没有真正理解'类'是什么的事实有关,所以,当我读到"PDO课程"时,我真的不是更聪明的.
在MySQL网站的"开发者专区"中读过一两篇文章后,我仍然不清楚.由于我现在甚至无法弄清楚它到底是什么,我认为现在可能使用它有点超出我的范围,但我仍然有兴趣扩大我的教育并找出如何改进的方法.
任何人都可以用"简单的英语"向我解释PDO是什么(或指向我用简单英语写的主题的方向),以及你如何使用它?
对于这个查询,有必要使用mysql_real_escape_string吗?
任何改进或查询都没问题?
$consulta = $_REQUEST["term"]."%";
($sql = $db->prepare('select location from location_job where location like ?'));
$sql->bind_param('s', $consulta);
$sql->execute();
$sql->bind_result($location);
$data = array();
while ($sql->fetch()) {
$data[] = array('label' => $location);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,查询速度很重要.
我知道这是一个非常受欢迎的问题,并且已经研究了很多小时,我仍然对明确的答案有点不确定。我不是 PHP 专业人士,并且已经自学了一段时间。我最近刚刚了解 MYSQLi 准备好的语句(已经习惯了旧的做法)。
我的主要问题是试图找到关于在使用准备好的语句时使用真正的转义字符串(或任何其他安全性)的要求的明确答案。
我已经准备好通过以下问题:
但在使用准备好的语句时似乎存在支持和反对转义数据的争论。还有很多关于 PDO 的提及,这对我来说非常令人困惑,因为我不是 PHP 天才。
我期待这个伟大的社区帮助我完全理解并给我一个答案(以我希望理解的方式),以便我取得进步。
为此,我有以下示例,并询问是否有人可以用通俗易懂的术语解释使用哪些,不使用哪些,更重要的是,为什么?
我目前在我的代码中使用它:
$id = $conn->real_escape_string($_POST['id']);
$name = $conn->real_escape_string($_POST['name']);
$message = $conn->real_escape_string($_POST['message']);
$qry = $conn->prepare('INSERT INTO status (id, name, message, date) VALUES (?, ?, ?, NOW())');
$qry->bind_param('iss', $id, $name, $message);
$qry->execute();
$qry->close();
Run Code Online (Sandbox Code Playgroud)
但是,我对上述示例问题的有限理解告诉我,使用以下代码是安全/可以的:
$qry = $conn->prepare('INSERT INTO status (id, name, message, date) VALUES (?, ?, ?, NOW())');
$qry->bind_param('iss', $_POST['id'], $_POST['name'], $_POST['message']);
$qry->execute();
$qry->close();
Run Code Online (Sandbox Code Playgroud)
那么,哪种方法是最好的方法呢?抱歉问了这么长的问题。在研究并试图理解它之后,我只想确定并理解其原因。
感谢大家的时间和支持,我非常感谢所提供的任何帮助。