PHP MSSQ Вложено, пока циклы выдают ошибку - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть два вложенных цикла while, внутри я планирую иметь запрос внутри каждого, но когда я вложил 2 while, при втором запросе php возвращает сообщение «При подключении к SQL SERVER возникла проблема. SQLSTATE [IMSSP]:больше нет строк в активном наборе результатов. Так как этот набор результатов не прокручивается, никакие данные не могут быть извлечены "

Я использую Php 7.0 на сервере Windows с mssql2014

<?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

1 Ответ

0 голосов
/ 16 февраля 2019

Скорее всего, в этой строке:

$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);
}

, и это создастновый объект оператора и сохранить исходный объект, который все еще используется.Я полагаю, что это должно решить вашу проблему.


PS Как общее правило кодирования, повторное использование одного и того же имени переменной дважды для представления различных объектов во время блока не считается хорошей идеей.Хороший качественный обзор кода вероятно пометил бы это.Это усложняет понимание (и, таким образом, отладку, обслуживание и расширение) кода, а также может привести к такой случайной логической ошибке.Это особенно верно для языков, таких как PHP, которые имеют довольно слабые правила типизации и области видимости.

...