为什么我的所有结果都从我准备好的陈述中得到了两次?

Why do I have all of my results twice from my prepared statement?

我是第一次使用 sqlsrv_prepare()/sqlsrv_execute()。到目前为止,我一直在使用 sqlsrv_query()。到目前为止,我能够获得我需要的数据并且能够有效地使用这些数据。问题是我的结果数组中的每个值都有两次。

很明显,我正在做一些事情来实现这一目标。也许我忽略了一些明显的东西,或者我不太明白 sqlsrv_prepare()/sqlsrv_execute() 是如何工作的。

这是我的例子 PHP:

<?php
header("Content-type: text/javascript");

include($_SERVER['DOCUMENT_ROOT'] . "inc/dbconn.php");
include($_SERVER['DOCUMENT_ROOT'] . "inc/formaterrors.php");

// array populated from checkbox values
$items = (isset($_GET['checked'])) ? $_GET['checked'] : array();

// holds value of $i in foreach below - $i can't be used in sqlsrv_prepare() since it doesn't exist in this scope
$placeholder = '';

// variable from included dbconn.php file
$connectionOptions['Database'] = 'example_db';
$conn = sqlsrv_connect($serverName, $connectionOptions)
        or die("Couldn't establish a database connection<br/>" . FormatErrors(sqlsrv_errors()));

$query = "
        SELECT
        detail.BILLNO,
        detail.BILLTYPE,
        detail.COMPONENTITEMCODE,
        detail.QUANTITYPERBILL,
        detail.REVISION,
        header.BILLDESC1
        FROM (BM_BILLDETAIL detail
        JOIN BM_BILLHEADER header
        ON (detail.BILLNO = header.BILLNO)
        AND (detail.BILLNO = ?)
        AND (header.REVISION = header.CURRENTBILLREVISION)
        AND (detail.REVISION = header.CURRENTBILLREVISION)
        and (detail.ENGINEERINGCHANGEDELNO = ''))
        ";

$results = array();
$stmt = sqlsrv_prepare($conn, $query, array(&$placeholder));

if(!$stmt)
{
        die(print_r(sqlsrv_errors(), true));
}

foreach($items as $i)
{
        $placeholder = $i;
        if(sqlsrv_execute($stmt))
        {
                while($row = sqlsrv_fetch_array($stmt))
                {
                        $results[] = $row;
                }
        } else
        {
                die(print_r(sqlsrv_errors(), true));
        }
}

// diplay results as JSON
echo(var_dump(json_encode($results, JSON_PRETTY_PRINT)));
?>

这是我在 JSON 中的结果示例:

{
        "0": "TRC4009-C005",
        "BILLNO": "TRC4009-C005",
        "1": "",
        "BILLTYPE": "",
        "2": "110500001153-00",
        "COMPONENTITEMCODE": "110500001153-00",
        "3": "1.000000",
        "QUANTITYPERBILL": "1.000000",
        "4": "001",
        "REVISION": "001",
        "5": "TRC4009, 8155, Red 800W",
        "BILLDESC1": "TRC4009, 8155, Red 800W"
    }

所以我有 key => value 对,这就是我想要的。不过我不想要 "numbered" 键。仅字段名称键,即 "BILLNO"、"REVISION" 等

最终,我的工具仍然是这样工作的;但是,我不想每次 sending/receiving/processing 的结果数量加倍。在大多数情况下,这将执行数百或数千次,结果的数量可能会有很大差异。

任何 help/insight 表示赞赏。

如果您只想获取文本键,则必须为 sqlsrv_fetch_array 指定提取类型。默认获取类型是 SQLSRV_FETCH_BOTH,这就是为什么您同时获取文本和数字键的原因。

您想改用 sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)