如果使用存储过程需要 PHP PDO PARAMS?

Posted

技术标签:

【中文标题】如果使用存储过程需要 PHP PDO PARAMS?【英文标题】:PHP PDO PARAMS required if using stored procedures? 【发布时间】:2012-06-29 20:10:27 【问题描述】:

我是 php 新手,但不是编程新手。来自 ASP [经典] 背景。简而言之,我使用的是 PHP 5.4,在 IIS7 和 SQL Server 2005 Express 上使用 FastCGI。我已经了解了基础知识,并且花了相当长的时间研究安全性。

我正在清理 GET 和 POST 输入数据。我的数据库连接字符串位于 Web 根目录之外的单独文件中。我正在使用带有命名占位符以及 db 存储过程的 PDO 准备语句 [尽管我听说查询 + 引用执行得更快]。

我试图理解为什么我需要在 bindParam 函数中使用其他参数,尤其是数据类型选项“PDO::PARAM_STR, 12”[该示例中的第二个参数表示数据长度对吗?]。

在 bindParam 中指定数据类型和长度有什么好处?如果我正在使用已经指定数据类型和长度的存储过程,是否需要它?另外,我相信我需要使用“PDO::PARAM_INPUT_OUTPUT”之类的东西来从存储的过程中返回一个值?

谢谢!

** 编辑 ** 出于某种原因,如果我使用 PDO::PARAM_STR 参数,我存储的过程似乎不会将数据写入数据库。所以我省略了那个论点。这是我的代码:

$sql1 = $conn->prepare("EXEC insert_platts :userAgent, :userIp, 1, :source");
$sql1->bindParam(':userAgent', $userAgent);
$sql1->bindParam(':userIp', $userIp);
$sql1->bindParam(':source', $source);
$sql1->execute();

另外,我没有从存储的过程中返回标识值,而是使用 lastInsertId():

$lastRow = $conn->lastInsertId();
print $lastRow;

【问题讨论】:

您好...请问没有人提供这方面的任何信息吗?我还注意到,通过使用 PDO,它可以将 [say] 一个撇号保存为 & # 3 9 ;这是将特殊字符保存到数据库中的正确方法吗?在我的 ASP 时代,我只会将 ' 加倍 ' 到 '' - 谢谢 【参考方案1】:

不,不需要数据类型和数据长度。我正在使用 mysql 存储过程,并且参数从不输入值,尽管我当然会验证它们。我想原因是额外的安全性和 INOUT 参数。引用:

要从存储过程返回 INOUT 参数,请使用按位 OR 运算符设置 PDO::PARAM_INPUT_OUTPUT

你试过了吗?

$params = array(
            ':userAgent'=>$userAgent,
            ':userIp' => $userIp,
            ':source' => $source
          );
$sql1 = $conn->prepare("EXEC insert_platts :userAgent, :userIp, 1, :source");
$sql1->execute($params);

关于特殊字符:您是否使用了正确的编码?我的意思是,php 应用程序和数据库中的相同编码......有时很难在脚本中使用一种编码,而在数据库中使用另一种编码......并且经常会出现类似的问题......

【讨论】:

以上是关于如果使用存储过程需要 PHP PDO PARAMS?的主要内容,如果未能解决你的问题,请参考以下文章

php pdo预处理语句与存储过程

使用 PHP PDO 将参数传递给 SQL Server 存储过程

PHP MySQL PDO 存储过程和 INOUT 参数

从 PHP PDO 调用 SQL 存储过程

在 PHP 中使用 PDO 创建存储过程

使用 php PDO 调用多个存储过程