Php 为什么我的所有结果都来自我准备好的陈述?

Php 为什么我的所有结果都来自我准备好的陈述?,php,prepared-statement,sqlsrv,Php,Prepared Statement,Sqlsrv,我第一次使用了sqlsrv\u prepare()/sqlsrv\u execute()。到目前为止,我一直在使用sqlsrv\u query()。到目前为止,我能够获得我需要的数据,并且能够有效地使用这些数据。问题是我的结果数组中的每个值都有两次 显然,我正在做一些事情来实现这一点。也许我忽略了一些显而易见的事情,或者也许我还不太明白sqlsrv\u prepare()/sqlsrv\u execute()是如何工作的 以下是我的PHP示例: <?php header("Content-

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

显然,我正在做一些事情来实现这一点。也许我忽略了一些显而易见的事情,或者也许我还不太明白
sqlsrv\u prepare()
/
sqlsrv\u 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)));
?>
所以我得到了
key=>value
对,这就是我想要的。但我不想要“编号”的钥匙。仅字段名称键,即“BILLNO”、“REVISION”等

最终,我的工具仍然是这样工作的;但是,我不想每次发送/接收/处理的结果数量翻一番。在大多数情况下,这将执行数百或数千次,结果的数量可能会有很大差异


感谢您的帮助/见解

如果只想获取文本键,则必须为
sqlsrv\u fetch\u array
指定提取类型。默认的获取类型是,这就是您同时获取文本键和数字键的原因


您想改为使用
sqlsrv\u fetch\u数组($stmt,sqlsrv\u fetch\u ASSOC)

用于循环查询结果的项中的每个项。RTM:in中第二个参数(fetchType)的默认值是sqlsrv\u fetch\u BOTH,它返回一个既有关联键又有数字键的数组。讽刺的是,我一直在使用sqlsrv_fetch_数组($results,sqlsrv_fetch_ASSOC)和sqlsrv_查询。老实说,我没有想到这会是个问题。此外,我还对sqlsrv_prepare()/sqlsrv_execute()进行了RTM,但它们都假设操作数据,而不是检索数据。我发现的使用SELECT语句检索的数据的手动示例保留在注释中,没有解决这个问题。我(错误地)假设默认值将按预期工作。谢谢你的意见。这就是我问题的解决办法。谢谢你的帮助!几天来,我一直在调整while()块的位置,重写我的foreach(),并重新阅读PHP手册页中的语句函数,看看是否遗漏了什么。我没有想到我应该一直改变这个论点。我知道当你认为问题不存在时,RTM是如何不起作用的。在有些事情没有意义,而“R”和“M”没有帮助的情况下,我认为有两件事确实有助于加快问题解决过程。一种方法是不要过于拘泥于问题所在的理论,另一种方法是使用step调试器并观察代码在运行过程中实际执行的操作。
{
        "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"
    }