【问题标题】:PDO PHP insert not workingPDO PHP插入不起作用
【发布时间】:2014-04-09 11:54:10
【问题描述】:
$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')");

顺便问一下,第一种方法更安全还是没关系?

【问题讨论】:

  • 第一种方法更安全,因为 bindParam 可以保护您免受 Sql 注入。
  • bindValue() 除非您从语句中绑定返回值,并使用 :id:agent 等名称作为占位符。我猜只是数字标识符是无效的。您还可以将 PDO 设置为对错误使用异常,以便在错误时引发异常。否则,您可以在声明中使用errorInfo() 以获取更多信息。这对调试很有用。
  • errorInfo 显示了这个数组 ( [0] => 00000 [1] => [2] => )
  • 不使用数字没有区别

标签: php pdo


【解决方案1】:

您是否考虑过使用? 占位符代替:<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 注入。如果这些数据来自“可靠来源”(例如:硬编码到您的应用程序中),那么它们之间在安全性方面没有区别先验

但是,如果某人(任何人)有权访问该数据,他可能会对其进行更改,从而使您的系统易受攻击。因此,更明智的选择是始终使用准备好的语句。这比没有“更安全”,但根本不安全,准备好的语句没有考虑其他几个问题。

【讨论】:

  • 他正在命名他的参数
  • 您关于将数据分为“更安全”和“更不安全”的理论本质上是错误的
  • 他在用整数“命名”,这意味着根本没有命名......对不起,只是说错了,downvote 是不够的......
  • 对不起,只是说“你没有命名你的参数”并将其发布为答案是不够的
  • 用整数命名参数有什么意义?这甚至不受支持...
猜你喜欢
  • 2013-08-06
  • 2018-11-28
  • 2012-05-05
  • 2015-09-14
  • 1970-01-01
  • 2013-10-17
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多