PDO PHP插入不起作用

时间:2014-04-09 11:54:11

标签: php pdo

$pdo = $db_con->prepare("INSERT INTO agents (Agent_ID,Agent_Name,Agent_Branch) VALUES (:1, :2, :3)");
$pdo->bindParam(':1', $id);
$pdo->bindParam(':2', $agent);
$pdo->bindParam(':3', $branch);
$pdo->execute();

没有错误,这确实有效

$db_con->exec("INSERT INTO agents (Agent_ID,Agent_Name,Agent_Branch) VALUES ('fd','dd','d')");

顺便提一下,第一种方法更安全还是无关紧要?

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用?占位符代替:<n>

由于您没有为占位符提供描述性名称,因此没有必要像您这样做。我在docs找不到任何表明可以将参数命名为整数的内容。

我的建议:

$pdo = $db_con->prepare("INSERT INTO agents (Agent_ID,Agent_Name,Agent_Branch) VALUES (?, ?, ?)");
// Params are 1-indexed!!!
$pdo->bindParam(1, $id);
$pdo->bindParam(2, $agent);
$pdo->bindParam(3, $branch);
$pdo->execute();

由于您只是忽略参数类型(在大多数情况下都可以),您最好这样做:

$pdo = $db_con->prepare("INSERT INTO agents (Agent_ID,Agent_Name,Agent_Branch) VALUES (?, ?, ?)");
$pdo->execute(array($id, $agent, $branch));

然后所有三个参数都将被视为字符串。


关于哪一个更安全的问题,如果$id$agent$branch是用户提供的信息,则第一个更安全的方法,因为它使用预准备语句,因此至少会对SQL注入进行防范。如果这些数据来自“可靠的来源”(例如:硬编码到您的应用程序中),则它们在安全先验方面没有区别。

但是,如果有人(任何人)可以访问该数据,他可以更改它,使您的系统容易受到攻击。因此,更明智的选择是始终使用预准备语句。这比没有任何东西“更安全”,但根本不安全,还有一些其他问题,准备陈述不考虑考虑。