0

MS SQL データベースからストアド プロシージャを実行しようとしています。ストアド プロシージャは、自動車部品店の POS (販売時点管理システム) のデータベースからのものです。したがって、プロシージャは正しく記述されており、POS システムで既に機能することが証明されています。

このストアド プロシージャを実行しようとすると、エラーが発生し続けます - SQLSTATE[HY093] - 無効なパラメーター番号: 範囲外の変数の数がトークンの数と一致しません。

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

$db = new PDO($dsn, $user, $password);

$stmt = $db->prepare("CALL insertworkorder(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); ");

$WorkOrderID = 4;
$StoreNumber = 4;
$YardNumber = 4;
$WorkOrderNumber = 3;
$EstimateNumber = '4';
$AccountNumber = 4;
$CustomerNumber = 4;
$CreatedBy = 5;
$DeliveryDate = 4332;
$BillToBusinessName = 'example';
$BillToContactName = 'example';
$BillToAttentionLine = 'example';
$BillToAddress1 = 'example';
$BillToAddress2 = 'example';
$BillToCity = 'example';
$BillToCounty = 'example';
$BillToStateOrProvince = 'example';
$BillToPostalCode = 'example';
$BillToCountry = 'USA';
$BillToContactFAX = 5466;
$BillToContactPhone = example;
$BillToContactOtherPhone = v; 
$BillToContactEMail = 'example@example.net';
$ShipToBusinessName = 'example';
$ShipToContactName = 'example';
$ShipToAttentionLine = 'example';
$ShipToAddress1 = 'example';
$ShipToAddress2 = 'example';
$ShipToCity = 'example';
$ShipToCounty = 'USA';
$ShipToStateOrProvince = 'CT';
$ShipToPostalCode = 'example';
$ShipToCountry = 'USA';
$ShipToContactFax = 'example';
$ShipToContactPhone = 'example';
$ShipToContactOtherPhone = 'example';
$ShipToContactEMail = '';
$ShipVIA = '22';
$CustomerPO = '22';
$WorkOrderStatus = '22';
$WorkOrderNotes = '2';
$Amount = '2';
$TotalDiscountAmount = '2';
$TotalFreightAmount = '2';
$ApplyCustomerTaxRate = '22';
$TotalFreightTaxAmount = '22';
$FreightIsTaxable = '2';
$GSTTaxExempt = '22';
$TotalPartsAmount = '22';
$TotalServicesAmount = '22';
$TotalCoreAmount = '';
$TotalLineItemTaxAmount = '22';
$OrderSource = 'website';
$TrackingNumber = '1226412258223';
$ReasonForVoid = '2';
$EComRequestID = 22;
$CurrentUserID = 22;
$PaypalTransactionID = '3';
$TaxExemptID = '3';
$LegalTraceID = '3';
$BillToContactPhoneExt = '3';
$BillToContactOtherPhoneExt = '3';
$ShipToContactPhoneExt = '3';
$ShipToContactOtherPhoneExt = '3';


$stmt->bindValue(':@StoreNumber', $StoreNumber, PDO::PARAM_INT); //REQUIRED
$stmt->bindValue(':@YardNumber', $YardNumber, PDO::PARAM_INT); //REQUIRED
$stmt->bindValue(':@EstimateNumber', $EstimateNumber, PDO::PARAM_STR);
$stmt->bindValue(':@AccountNumber', $AccountNumber, PDO::PARAM_INT); //REQUIRED
$stmt->bindValue(':@CustomerNumber', $CustomerNumber, PDO::PARAM_INT); //REQUIRED
$stmt->bindValue(':@CreatedBy', $CreatedBy, PDO::PARAM_INT); //REQUIRED
$stmt->bindValue(':@DeliveryDate', $DeliveryDate, PDO::PARAM_INT);
$stmt->bindValue(':@BillToBusinessName ', $BillToBusinessName, PDO::PARAM_STR);
$stmt->bindValue(':@BillToContactName', $BillToContactName, PDO::PARAM_INT);
$stmt->bindValue(':@BillToAttentionLine ', $BillToAttentionLine , PDO::PARAM_STR);
$stmt->bindValue(':@BillToAddress1', $BillToAddress1, PDO::PARAM_STR);
$stmt->bindValue(':@BillToAddress2 ', $BillToAddress2 , PDO::PARAM_STR);
$stmt->bindValue(':@BillToCity', $BillToCity, PDO::PARAM_STR);
$stmt->bindValue(':@BillToCounty', $BillToCounty, PDO::PARAM_STR);
$stmt->bindValue(':@BillToStateOrProvince', $BillToStateOrProvince, PDO::PARAM_STR);
$stmt->bindValue(':@BillToPostalCode', $BillToPostalCode, PDO::PARAM_STR);
$stmt->bindValue(':@BillToCountry', $BillToCountry, PDO::PARAM_STR);
$stmt->bindValue(':@BillToContactFAX', $BillToContactFAX, PDO::PARAM_STR);
$stmt->bindValue(':@BillToContactPhone', $BillToContactPhone, PDO::PARAM_STR);
$stmt->bindValue(':B@illToContactOtherPhone', $BillToContactOtherPhone, PDO::PARAM_STR);
$stmt->bindValue(':@BillToContactEMail', $BillToContactEMail, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToBusinessName', $ShipToBusinessName, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToContactName', $ShipToContactName, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToAttentionLine', $ShipToAttentionLine, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToAddress1', $ShipToAddress1, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToAddress2', $ShipToAddress2, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToCity', $ShipToCity, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToCounty', $ShipToCounty, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToStateOrProvince', $ShipToStateOrProvince, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToPostalCode', $ShipToPostalCode, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToCountry', $ShipToCountry, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToContactFax', $ShipToContactFax, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToContactPhone', $ShipToContactPhone, PDO::PARAM_STR);
$stmt->bindValue(':@ToContactOtherPhone', $ShipToContactOtherPhone, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToContactEMail', $ShipToContactEMail, PDO::PARAM_STR);
$stmt->bindValue(':@ShipVIA', $ShipVIA, PDO::PARAM_STR);
$stmt->bindValue(':@CustomerPO', $CustomerPO, PDO::PARAM_STR);
$stmt->bindValue(':@WorkOrderStatus', $WorkOrderStatus, PDO::PARAM_STR);
$stmt->bindValue(':@WorkOrderNotes', $WorkOrderNotes, PDO::PARAM_STR);
$stmt->bindValue(':@Amount', $Amount, PDO::PARAM_STR); //REQUIRED
$stmt->bindValue(':@TotalDiscountAmount', $TotalDiscountAmount, PDO::PARAM_STR); //REQUIRED
$stmt->bindValue(':@TotalFreightAmount', $TotalFreightAmount, PDO::PARAM_STR);
$stmt->bindValue(':@ApplyCustomerTaxRate', $ApplyCustomerTaxRate, PDO::PARAM_STR); //REQUIRED
$stmt->bindValue(':@TotalFreightTaxAmount', $TotalFreightTaxAmount, PDO::PARAM_STR); //REQUIRED
$stmt->bindValue(':@FreightIsTaxable', $FreightIsTaxable, PDO::PARAM_BOOL); //REQUIRED
$stmt->bindValue(':@GSTTaxExempt', $GSTTaxExempt, PDO::PARAM_BOOL); //REQUIRED
$stmt->bindValue(':@TotalPartsAmount', $TotalPartsAmount, PDO::PARAM_STR);
$stmt->bindValue(':@TotalServicesAmount', $TotalServicesAmount, PDO::PARAM_STR); //REQUIRED
$stmt->bindValue(':@TotalCoreAmount', $TotalCoreAmount, PDO::PARAM_STR);
$stmt->bindValue(':@TotalLineItemTaxAmount', $TotalLineItemTaxAmount, PDO::PARAM_STR);
$stmt->bindValue(':@OrderSource', $OrderSource, PDO::PARAM_STR);
$stmt->bindValue(':@TrackingNumber', $TrackingNumber, PDO::PARAM_STR);
$stmt->bindValue(':@ReasonForVoid', $ReasonForVoid, PDO::PARAM_STR);
$stmt->bindValue(':@EComRequestID', $EComRequestID, PDO::PARAM_INT);
$stmt->bindValue(':@CurrentUserID', $CurrentUserID, PDO::PARAM_INT);
$stmt->bindValue(':@PaypalTransactionID', $PaypalTransactionID, PDO::PARAM_STR);
$stmt->bindValue(':@TaxExemptID', $TaxExemptID, PDO::PARAM_STR);
$stmt->bindValue(':@LegalTraceID', $LegalTraceID, PDO::PARAM_STR);
$stmt->bindValue(':@BillToContactPhoneExt', $BillToContactPhoneExt, PDO::PARAM_STR);
$stmt->bindValue(':@BillToContactOtherPhoneExt', $BillToContactOtherPhoneExt, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToContactPhoneExt', $ShipToContactPhoneExt, PDO::PARAM_STR);
$stmt->bindValue(':@ShipToContactOtherPhoneExt', $ShipToContactOtherPhoneExt, PDO::PARAM_STR);
$stmt->bindParam(':@WorkOrderID', $WorkOrderID, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(':@WorkOrderNumber', $WorkOrderNumber, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);

$result = $stmt->execute();

print_r($stmt->errorInfo());

そして、ここにSQL手順があります:

ALTER procedure [dbo].[insertworkorder]
    (
    @StoreNumber                int,
    @YardNumber                 int,
    @EstimateNumber             varchar(20),
    @AccountNumber              accountnumber,
    @CustomerNumber             customernumber,
    @CreatedBy                  int,
    @DeliveryDate               datetime,
    @BillToBusinessName         contactlong,
    @BillToContactName          contactlong,
    @BillToAttentionLine        contactlong,
    @BillToAddress1             AddressLong,
    @BillToAddress2             AddressLong,
    @BillToCity                 CityLong,
    @BillToCounty               varchar(25),
    @BillToStateOrProvince      stateorprovince,
    @BillToPostalCode           postalcode,
    @BillToCountry              country,
    @BillToContactFAX           phonenumber,
    @BillToContactPhone         phonenumber,
    @BillToContactOtherPhone    phonenumber,
    @BillToContactEMail         email,
    @ShipToBusinessName         contactlong,
    @ShipToContactName          contactlong,
    @ShipToAttentionLine        contactlong,
    @ShipToAddress1             AddressLong,
    @ShipToAddress2             AddressLong,
    @ShipToCity                 CityLong,
    @ShipToCounty               varchar(25),
    @ShipToStateOrProvince      stateorprovince,
    @ShipToPostalCode           postalcode,
    @ShipToCountry              country,
    @ShipToContactFax           phonenumber,
    @ShipToContactPhone         phonenumber,
    @ShipToContactOtherPhone    phonenumber,
    @ShipToContactEMail         email,
    @ShipVIA                    varchar(20),
    @CustomerPO                 varchar(20),
    @WorkOrderStatus            status,
    @WorkOrderNotes             notes,
    @Amount                     money,
    @TotalDiscountAmount        money,
    @TotalFreightAmount         money,
    @ApplyCustomerTaxRate       boolean,
    @TotalFreightTaxAmount      money,
    @FreightIsTaxable           boolean,
    @GSTTaxExempt               boolean,
    @TotalPartsAmount           money,
    @TotalServicesAmount        money,
    @TotalCoreAmount            money,
    @TotalLineItemTaxAmount     money,
    @OrderSource                char(1),
    @TrackingNumber             varchar(50),
    @ReasonForVoid              varchar(255),
    @EComRequestID              int,
    @CurrentUserID              int,
    @PaypalTransactionID        varchar(30),
    @TaxExemptID                varchar(24),
    @LegalTraceID               varchar(24),
    @BillToContactPhoneExt      PhoneExt,
    @BillToContactOtherPhoneExt PhoneExt,
    @ShipToContactPhoneExt      PhoneExt,
    @ShipToContactOtherPhoneExt PhoneExt,
    @WorkOrderID                int output,
    @WorkOrderNumber            int output
    )
as

    set nocount on

    exec dbo.getnextcounter 'WORKORDER', 'WorkOrderID', @WorkOrderID output
    exec dbo.getnexttransactioncounter @YardNumber, @StoreNumber, 'WORKORDER', 'WorkOrderNumber', @WorkOrderNumber output



    insert dbo.WORKORDER
        (
        WorkOrderID,
        StoreNumber,
        Revision,
        YardNumber,
        WorkOrderNumber,
        EstimateNumber,
        AccountNumber,
        CustomerNumber,
        CreatedBy,
        DeliveryDate,
        DateCreated,
        BillToBusinessName,
        BillToContactName,
        BillToAttentionLine,
        BillToAddress1,
        BillToAddress2,
        BillToCity,
        BillToCounty,
        BillToStateOrProvince,
        BillToPostalCode,
        BillToCountry,
        BillToContactFAX,
        BillToContactPhone,
        BillToContactOtherPhone,
        BillToContactEMail,
        ShipToBusinessName,
        ShipToContactName,
        ShipToAttentionLine,
        ShipToAddress1,
        ShipToAddress2,
        ShipToCity,
        ShipToCounty,
        ShipToStateOrProvince,
        ShipToPostalCode,
        ShipToCountry,
        ShipToContactFax,
        ShipToContactPhone,
        ShipToContactOtherPhone,
        ShipToContactEMail,
        ShipVIA,
        CustomerPO,
        WorkOrderStatus,
        WorkOrderNotes,
        Amount,
        TotalDiscountAmount,
        TotalFreightAmount,
        ApplyCustomerTaxRate,
        TotalFreightTaxAmount,
        FreightIsTaxable,
        GSTTaxExempt,
        TotalPartsAmount,
        TotalServicesAmount,
        TotalCoreAmount,
        TotalLineItemTaxAmount,
        OrderSource,
        TrackingNumber,
        ReasonForVoid,
        EComRequestID,
        IsLastRevision,
        CurrentUserID,
        PaypalTransactionID,
        TaxExemptID,
        LegalTraceID,
        BillToContactPhoneExt,
        BillToContactOtherPhoneExt,
        ShipToContactPhoneExt,
        ShipToContactOtherPhoneExt
        )

    values
        (
        @WorkOrderID,
        @StoreNumber,
        0,                      /* Revision         */
        @YardNumber,
        @WorkOrderNumber,
        @EstimateNumber,
        @AccountNumber,
        @CustomerNumber,
        @CreatedBy,
        @DeliveryDate,
        getdate(),              /* @DateCreated     */
        @BillToBusinessName,
        @BillToContactName,
        @BillToAttentionLine,
        @BillToAddress1,
        @BillToAddress2,
        @BillToCity,
        @BillToCounty,
        @BillToStateOrProvince,
        @BillToPostalCode,
        @BillToCountry,
        @BillToContactFAX,
        @BillToContactPhone,
        @BillToContactOtherPhone,
        @BillToContactEMail,
        @ShipToBusinessName,
        @ShipToContactName,
        @ShipToAttentionLine,
        @ShipToAddress1,
        @ShipToAddress2,
        @ShipToCity,
        @ShipToCounty,
        @ShipToStateOrProvince,
        @ShipToPostalCode,
        @ShipToCountry,
        @ShipToContactFax,
        @ShipToContactPhone,
        @ShipToContactOtherPhone,
        @ShipToContactEMail,
        @ShipVIA,
        @CustomerPO,
        @WorkOrderStatus,
        @WorkOrderNotes,
        @Amount,
        @TotalDiscountAmount,
        @TotalFreightAmount,
        @ApplyCustomerTaxRate,
        @TotalFreightTaxAmount,
        @FreightIsTaxable,
        @GSTTaxExempt,
        @TotalPartsAmount,
        @TotalServicesAmount,
        @TotalCoreAmount,
        @TotalLineItemTaxAmount,
        @OrderSource,
        @TrackingNumber,
        @ReasonForVoid,
        @EComRequestID,
        1,
        @CurrentUserID,                       /* IsLastRevision   */
        @PaypalTransactionID,
        @TaxExemptID,
        @LegalTraceID,
        @BillToContactPhoneExt,
        @BillToContactOtherPhoneExt,
        @ShipToContactPhoneExt,
        @ShipToContactOtherPhoneExt
        )

    set nocount off

    return (0)

ご協力ありがとうございました!!

ヴァス

4

2 に答える 2

1

あなたには2つの大きな問題があります。1) クエリは疑問符のプレースホルダーを->bindValue使用し、関数は名前付きパラメーターを使用します。2) 疑問符は 20 個しかなく、約 60 個の値をバインドしようとしています (約 40 個のカウントを停止しました)。

名前付きパラメーターを使用する場合は、次のようにコードを実行する必要があります。

$stmt = $db->prepare("CALL insertworkorder(:StoreNumber, :YardNumber, ... etc ... ");

$stmt->bindValue(':StoreNumber', $StoreNumber, PDO::PARAM_INT); //REQUIRED
$stmt->bindValue(':YardNumber', $YardNumber, PDO::PARAM_INT);
// ... etc ...

疑問符のプレースホルダーを使用する場合は、次のようにします。

$stmt = $db->prepare("CALL insertworkorder(?, ?, ?, ... etc ...");

$stmt->bindValue(1, $StoreNumber, PDO::PARAM_INT);
$stmt->bindValue(2, $YardNumber, PDO::PARAM_INT);
// ... etc ...

疑問符 (または名前付きパラメーター) と同じ数の bindValues があることを確認する必要があります。そうしないと、Invalid Parameter number: number out of bound variables does not match number of tokens.エラーが発生します。

于 2013-06-25T03:16:47.233 に答える
0

これが古い投稿であることは知っていますが、これで終わった場所の更新にすぎません。

私が何時間も費やした後 (そして別の従業員が何時間もかけて試した後)、Microsoft Sql ストアド プロシージャは、PDO コネクタを使用する PHP では機能しないと判断しました。

最終的に、すべてを XML ファイルにダンプするエクスポート機能を PHP で作成し、CRON で毎分実行される Java プログラムを開発しました。このプログラムは、XML ファイルのフォルダーをスキャンし、JDBC ドライバーを使用して Ms SQL ストアド プロシージャを実行し、 XML ファイルからコンテンツを読み取ってから、XML ファイルを削除します...

彼らがこれを修正したかどうかはわかりませんが、私の経験では、PHP は Microsoft SQL ストアド プロシージャでは動作しません

乾杯

于 2015-04-20T15:23:26.240 に答える