【问题标题】:PHP ODBC Stored Procedure Invalid Parameter NumberPHP ODBC 存储过程参数号无效
【发布时间】:2012-06-07 16:01:39
【问题描述】:

我对这个 SQL/PHP/ODBC/FBI/TLA 等世界 100% 是全新的,所以如果我所问的内容非常基本,我深表歉意。

我正在使用一个存储过程,该存储过程使用一个经纬度邮政编码数据库将一个中心邮政编码和一个给定的英里半径作为 2 个输入参数,然后返回一个在给定英里半径内的邮政编码数组。当我在我的 SQL 查看器中运行它时它工作得很好,但是当我尝试使用 php 来做同样的事情时,我只会得到无效的参数错误。

$connstr = "Driver={SQL Server};Server=MyServer;Database=MyDatabase;";
$conn = odbc_connect($connstr, "Name", "PW");

$query_string = " CALL FindZipCodeWithinRadius(?,?)  ";

$sp = odbc_prepare($conn, $query_string);
$zipcodes = odbc_execute($sp,array(" 14602, 35"));

print_r($zipcodes);

当我运行这样的代码时,我收到错误“参数不足(1 应该是 2)”

我在这些输入参数周围尝试了不同的双引号/单引号迭代,但它们要么给我上述错误,要么给我这个错误:

“SQL 错误:[Microsoft][ODBC SQL Server Driver]参数号无效,SQL 状态 S1093”

快速谷歌搜索让我相信第二个错误意味着有太多参数被读入 proc,那么我是如何在跳过所需的 2 时从 1 变为 many 的?

如果有区别的话,数据库是在 SQL 2000 上的。

有什么想法吗?感谢您的任何帮助,您可以提供。

【问题讨论】:

  • 请发布您的存储过程。我们可能整天都在这里猜测它需要什么。你试过array("14602", 35)吗?

标签: php stored-procedures odbc


【解决方案1】:
$zipcodes = odbc_execute($sp,array(" 14602, 35"));

应该是

$zipcodes = odbc_execute($sp,array("14602", "35"));

在您的执行中,您传递了 1 个数组值“14602, 35”,而您准备好的语句正在寻找 2。

【讨论】:

  • 感谢您的快速回复!当我尝试这样做以及引号/单引号的其他变体时,我收到错误“[Microsoft][ODBC SQL Server Driver]Invalid parameter number, SQL state S1093”
  • 值是字符串还是整数?试试array('"14602"', '"35"')
  • 当我运行 odbc_procedurecolumns 时,它返回 TYPE_NAME => char 作为第一个参数,TYPE_NAME => int 作为第二个参数
  • 我试过 array( 14602, 35) array( '14602', '35') array( "'14602;", "35") array( '"14602"', '" 35"') array('"14602"', '35') 等,但它们都返回相同的 SQL 状态 S1093,或“1 而不是 2”,错误。我需要使用绑定参数命令吗?
  • 你的错误说第一个参数应该是TYPE_NAME => char。 MSDN 文档说,“char[(n)] 长度为 n 字节的固定长度非 Unicode 字符数据。n 必须是从 1 到 8,000 的值。”我觉得 14602 太大了。
【解决方案2】:
Below is the Code to execute MS SQL Stored Procedure in PHP

$DBConnString="DRIVER={SQL Server};SERVER=localhost;DATABASE=ERPDev";
$DBUsername="sa";
$DBPswd="";
$DBConnect = odbc_connect($DBConnString, $DBUsername, $DBPswd);  

$Param1 = '2';
$query_string = "P_Test[$Param1]";
$ResultSet = odbc_prepare($DBConnect, $query_string);
odbc_execute($ResultSet);
// odbc_result_all($ResultSet);
while($obRows = odbc_fetch_object($ResultSet))
{
    print $obRows->UserId." - ";
    print $obRows->UserFirstName." - ";
    print $obRows->UserLastName."<br />";
}
odbc_free_result($ResultSet);
odbc_close($DBConnect); 

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多