我有两个嵌套的while循环,在里面,我打算在每个内部都有一个查询,但是当我嵌套2个while时,在第二个查询php返回“连接到SQL SERVER时出现问题.SQLSTATE [IMSSP]:没有更多的行在活动结果集中。由于此结果集不可滚动,因此无法检索到更多数据“
我正在使用mssql2014在Windows服务器上运行Php 7.0
<?php
require "vendor/autoload.php";
$debug = false;
$serverName = "###"; //serverName\instanceName
$database = '###';
$user = '###';
$pass = '###';
$pagesize = 10;
$offset = 0;
if($debug) {
var_dump($response);
} else {
try {
$pdo = new \PDO(
sprintf(
"sqlsrv:server=%s;Database=%s",
$serverName,
$database
),
//$user, $pass // depends on how we use the script
NULL, NULL
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//query for a set of documents
$dataset = 'SELECT itemdata.itemnum, itemdata.itemname,
doctype.itemtypename,
useraccount.username,
itemdatapage.filepath, itemdatapage.filesize,
itemdata.itemdate, itemdata.datestored, itemdata.itemtypenum as itemtypenum
FROM hsi.itemdata as itemdata
LEFT JOIN hsi.useraccount ON itemdata.usernum = useraccount.usernum
LEFT JOIN hsi.itemdatapage ON itemdata.itemnum = itemdatapage.itemnum
LEFT JOIN hsi.doctype ON itemdata.itemtypenum = doctype.itemtypenum
WHERE itemdatapage.itempagenum = 0
ORDER BY itemnum
OFFSET 90000 ROWS
FETCH NEXT 20 ROWS ONLY;';
$stmt = $pdo->query( $dataset );
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
//search keywords table
$selectTables = 'SELECT keytypenum
FROM [OnBase].[hsi].[itemtypexkeyword]
WHERE itemtypenum =' . $row['itemtypenum'];
$stmt = $pdo->query( $selectTables );
while ( $tables = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print_r($tables);
}
}
} catch (PDOException $e) {
echo "There was a problem connecting to SQL SERVER. " . $e->getMessage();
die();
}
}
实际上我得到上面描述的错误从控制台运行此代码的PHP。我从mssql获得所有结果
这条线可能是问题所在:
$stmt = $pdo->query( $selectTables );
问题是你已经使用$stmt
来表示你的原始陈述($ stmt = $pdo->query( $dataset );
)。并且由于$stmt
的第二个赋值在一个循环中,你仍然试图循环原始语句,这会导致逻辑错误。在您仍在使用它时销毁变量几乎可以保证导致问题。
第一次循环运行时它会没问题,但是一旦循环尝试第二次运行,$stmt
就不再代表它最初的功能,因此出现了逻辑问题。
只需更改内部代码即可使用其他变量名称,例如:
$stmt2 = $pdo->query( $selectTables );
while ( $tables = $stmt2->fetch( PDO::FETCH_ASSOC ) ){
print_r($tables);
}
这将创建一个新的语句对象,并保留仍在使用的原始对象。我希望这可以解决你的问题。
附:作为一般编码规则,在块中重复使用相同的变量名称两次来表示不同的对象并不是一个好主意。高质量的代码审查可能会标记它。它使得理解(并因此调试,维护和增强)代码更加困难,并且还可能导致这种意外的逻辑错误。对于像PHP这样具有相当宽松的输入和范围规则的语言尤其如此。