1

私はphpでWebアプリケーションを作成しており(これについては十分な知識があります)、SQL Serverデータベースのストアドプロシージャへのクエリが与えられています。これは私がそれらの1つを使用した方法です:

     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 で見逃したものがあるかどうか疑問に思っていました-私が知る限り、それらは値 0 と 1 を取ることができるブール値 (bit:s) のようなものです.true/false の整数を使用してみましたこれらの値の文字列、どれも機能しませんでした。このクエリを SQL Server Manager で実行すると、正常に動作します。

ありがとう!

編集:

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

できれば SQLSRV または PDO エクステンションを使用して、PHP から SQL Server への接続を作成する必要があります。(これは基本的にSQL Server Managerが行うことです)

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

... の代わりに、必要な引数を指定する必要があります。

見る:

編集:スタックオーバーフローでいくつかの例を見つけました:

それらにも問題はありますが、ストアド プロシージャを実行するために何が必要かについて良い印象を与えます。

Edit2: sqlsrv_* を使用した別の例:

于 2013-01-03T13:45:55.733 に答える