2

新しいレコードをデータベースに挿入する前に、SSN のユーザー入力を検証する機能を会社の Web ページの 1 つに追加することで、PHP を学んでいます。その部分はうまく機能しています。データベースの挿入には、後続のプロセスで使用する新しいレコードの GUID を返す出力パラメーターを持つ SQL Server ストアド プロシージャの呼び出しが含まれます。データベースの挿入部分は機能しますが、返されたパラメーターの値をエコーすると、空の文字列になります。

関連する詳細は次のとおりです。 別のサーバーで実行されている SQL Server 2008 Windows 64 PC で実行されている WAMP Server 2.2 PHP 5.3.1 Apache 2.2.22

ここに私のPHPコードがあります:

$conn = new PDO( "odbc:Driver={SQL Server};Server=xxx.xxx.xx.xx;Database=xxxxx;charset=UTF-8'", "uid", "pwd");

if(!$conn) {
    die( "<br />Error connecting to SQL Server");
}

$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$resource_id = "";

$stmt = $conn->prepare("{CALL xxxx.dbo.app_sp_insert_rq(?, ?, ?, ?, ?, ?, ?, ?)}");

$stmt->bindParam(1, $survey_text, PDO::PARAM_STR);
$stmt->bindParam(2, $event_date, PDO::PARAM_STR);
$stmt->bindParam(3, $type_id, PDO::PARAM_STR);
$stmt->bindParam(4, $description, PDO::PARAM_STR);
$stmt->bindParam(5, $folder_id, PDO::PARAM_STR);
$stmt->bindParam(6, $has_details, PDO::PARAM_STR);
$stmt->bindParam(7, $uid, PDO::PARAM_STR);
$stmt->bindParam(8, $resource_id, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 100); 

$stmt->execute();

echo $resource_id;

ストアド プロシージャの定義は次のとおりです。

CREATE PROCEDURE [dbo].[app_sp_insert_rq]
    @survey_text nvarchar(max),
    @event_date nvarchar(20),
    @type_id nvarchar(100),
    @description nvarchar(100),
    @folder_id nvarchar(100),
    @has_details nchar(1),
    @uid nvarchar(100),
    @resource_id nvarchar(100) output

AS

select @resource_id = NEWID()

insert into
    xxxxx.dbo.app_events (
        resource_id,
        event_date, 
        [type_id], 
        [description], 
        folder_id, 
        has_details, 
        [uid], 
        survey_text
    )
    values (
        @resource_id,
        @event_date, 
        @type_id, 
        @description, 
        @folder_id, 
        @has_details, 
        @uid, 
        @survey_text
    )

どんな助けでも大歓迎です。私は複数回の検索でここまでたどり着きましたが、これは私が回避策を見つけることができなかった1つの障害です。

4

1 に答える 1

1

PDOのドキュメントによると、動作するはずです。しかし、を使用している間、 はパラメーターをPDO::PARAM_INPUT_OUTPUT表すと言われています。INOUTOUT

この方法を試すことができます-$lengthパラメーターを明示的に設定すると(を離れている間)、モードPDO::PARAM_INPUT_OUTPUTがトリガーされます。OUT

$stmt->bindParam(8, $resource_id, PDO::PARAM_STR, 100);

しかし、それもうまくいくはずINOUTだと思います(最初にコードを書いたように)。

おそらく、C レベルの PDO ドライバー (または ODBC ドライバー) は、(PDO-MySQL のように) 出力パラメーターのバインドをサポートしていません。

ただし、これがOUTプロシージャ内の唯一のパラメーターである場合は、関数を使用できます。

SELECT func(?, ?, ..., ?) AS result

+1: php.net のこのコメントに興味があるかもしれません

于 2012-12-11T20:56:59.167 に答える