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"
}