1

我正在用 php 编写一个 Web 应用程序(我对此有相当的了解),并且已经获得了对 SQL Server 数据库中存储过程的查询。这就是我使用其中之一的方式:

     function exampleFunction ($productId, $serialNbr, $companyName1, $companyName2, $companyName3) {

    return ' exec dbo.getStuffFromDatabase @product_id = ' . $productId . ', 
                                            @serial_id = ' . $serialNbr . ',
                                        @is_company_name1 = ' . $companyName1 . ', 
                                            @is_company_name2 = ' . $companyName2 . ',

@is_company_name3 = ' . $companyName3;
    }  

我以前从未使用过数据库编程,可能我犯了一些简单的错误,但我无法让它工作。我想知道 $companyName 变量是否遗漏了一些东西 - 据我所知,它们就像布尔值(位:s),可以取值 0 和 1。我尝试使用真/假整数和这些值的字符串,没有一个工作。当我在 SQL Server 管理器中执行此查询时,它工作正常。

谢谢!

编辑:

Server Management Studio 中的脚本:

declare @product_id varchar(16)
declare @serial_id int
declare @is_company_name1 bit
declare @is_company_name2 bit
declare @is_company_name2 bit

set @product_id = 'all'
set @serial_id = 9999999
set @is_company_name1 = 0
set @is_company_name2 = 0
set @is_company_name2 = 1


exec [dbo].[getStuffFromDatabase] 
@product_id = @product_id,
@serial_id = @serial_id,
@is_company_name1 = @is_company_name1,
@is_company_name2 = @is_company_name2,
@is_company_name3 = @is_company_name3
4

2 回答 2

2

你需要一些引号product_id

return ' exec dbo.getStuffFromDatabase @product_id = \'' . $productId . '\', 
                                        @serial_id = ' . $serialNbr . ',
                                    @is_company_name1 = ' . $companyName1 . ', 
                                        @is_company_name2 = ' . $companyName2 . ',

@is_company_name3 = ' . $companyName3;

但是,您可能想查看是否有工具可以使用参数而不是将 SQL 构建为单个字符串。这将大大有助于避免 SQL 注入的可能性。

于 2013-01-03T14:27:08.470 回答
0

您需要创建从 PHP 到 SQL Server 的连接,最好使用 SQLSRV 或 PDO 扩展。(这基本上就是 SQL Server Manager 为您做的事情)

$pdo = new PDO(...);
$stmt = $pdo->prepare('exec dbo.getStuff ...');
$res = $stmt->execute(array($productId, $serialNbr, ...));
return $res;

代替 ... 您需要提供所需的参数。

看:

编辑:在stackoverflow上找到了一些例子:

尽管它们也有问题,但它们确实对执行存储过程所需的内容给出了很好的印象。

Edit2:另外几个使用 sqlsrv_* 的例子:

于 2013-01-03T13:45:55.733 回答