如果使用存储过程,则需要 PHP PDO 参数


PHP PDO PARAMS required if using stored procedures?

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

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

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

在绑定参数中指定数据类型和长度有什么好处?如果我使用的是已指定数据类型和长度的存储过程,是否需要它?另外,我认为我需要使用类似"PDO::P ARAM_INPUT_OUTPUT"的东西来从存储的过程返回值?

谢谢!

**

编辑 **
出于某种原因,如果我使用 PDO::P ARAM_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;

不需要,不需要数据类型和数据长度。我使用的是 mysql 存储的过程,参数从来都不是类型化的值,尽管我当然会验证它们。我想原因是额外的安全性和 INOUT 参数。报价:

若要从存储过程返回 INOUT 参数,请使用按位 OR 运算符来设置 PDO::P ARAM_输入_输出

你试过这个吗?

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

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