查询适用于SQL服务器,但不适用于php-input

时间:2013-01-03 13:38:11

标签: php sql-server

我正在用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-variables - 据我所知它们就像布尔(bit:s)可以取值0和1.我尝试过使用true / false,整数和这些值的字符串,没有工作。 当我在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

2 个答案:

答案 0 :(得分: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注入的可能性大有帮助。

答案 1 :(得分: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 _ *的另外几个例子: