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

标签 php sql sql-server database pdo

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

我正在清理 GET 和 POST 输入数据。我的数据库连接字符串位于 Web 根目录之外的单独文件中。我正在使用 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;

最佳答案

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

To return an INOUT parameter from a stored procedure, use the bitwise OR operator to set the 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?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11242396/

相关文章:

php - Microsoft Graph API(日历)间歇性 503 错误

mysql - MySql 中的 STATISTICS IO 等价物是什么?

sql-server - 滑动窗口场景 - 使分区脱机

javascript - 我如何使每个查询折叠 php

php - 用于可扩展性的宾果游戏数据库表示

php - 在 PHP 页面上使用 Casperjs 和 exec 时出现随机错误

php - MySql 如果条件匹配则选择值,如果不匹配则选择第一个

sql - 需要sql中一个结果集的多个副本而不使用循环

sql-server - 如何将 MS SQL 数据类型 numeric(19, 0) 映射到 .NET 类型

sql - 为什么我的代码错误(mssql : Violation of PRIMARY KEY constraint 'PK_SMSBlast2' . 无法在对象 'dbo.SMSBlast2' 中插入重复键)?