PHP sqlsrv_fetch_array с циклом while пересекает первый ряд - PullRequest
0 голосов
/ 21 февраля 2019

Я получаю данные из таблицы MScost для ввода в tmp_table.Я использую цикл while с sqlsrv_fetch_array для вставки в таблицу tmp_table.getData и addData - это моя функция, которую я создал для получения данных из моей БД и добавления данных в мою БД.

$resm1 = getData($conn, "years,months,category,ROUND(mfg,0)as ttl", "MScost", "years='2018' and months='NOV'");

if($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC) != Null){
    while ($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) {
        $category = $row['category'];
        $ttl = $row['ttl'];
        addData($conn, "tmp_table(category,ttl1)", "'$category','$ttl'");
    }
    echo $category."=".$ttl."</br>";
}else {
    addData($conn, "tmp_table(category,ttl1)", "'NON',0");
    echo "Null";
}

В ней нет ошибок.Но пока цикл пересекает первый существующий ряд.Это не шоу.Это не вставить в базу данных.

Затем я попытался скопировать, пока цикл вставки за пределами IF, он не пересекает первую строку.Работает нормально.

Почему это?Я хочу, чтобы он работал в IF, не пересекая первый ряд.Как я могу это сделать?

Ответы [ 2 ]

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

Давайте посмотрим на этот код:

if($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC) != Null){
    while ($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) {

В операторе if, который вы уже назвали sqlsrv_fetch_array, это означает, что первая строка уже получена .В вашем цикле while вы делаете больше вызовов sqlsrv_fetch_array, которые возвращают вам следующие строки (после первой).

Сам оператор if (хотя и должен быть удален) тоже не верен, вынеобходимо использовать квадратные скобки для составления правильного утверждения, для сравнения используйте !== и всегда пишите null в нижнем регистре:

if (($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) !== null) {
0 голосов
/ 21 февраля 2019

Ваша проблема в том, что вы читаете первую строку из вашего набора результатов с проверкой if($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC) != Null).Снимите этот флажок, и вы сможете получить все свои данные.

Вы можете попробовать следующий скрипт:

<?php
$resm1 = getData($conn, "years,months,category,ROUND(mfg,0)as ttl", "MScost", "years='2018' and months='NOV'");

$rc = 0;
while ($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) {
   $rc++;
   $category = $row['category'];
   $ttl = $row['ttl'];
   addData($conn, "tmp_table(category,ttl1)", "'$category','$ttl'");
   echo $category."=".$ttl."</br>";
}
if ($rc == 0) {
   addData($conn, "tmp_table(category,ttl1)", "'NON',0");
   echo "Null";
}
?>

Драйвер PHP для SQL Server поддерживает sqlsrv_num_rows () функция, которая возвращает количество строк в наборе результатов.Но вы должны использовать эту функцию только в том случае, если при вызове sqlsrv_query () используется клиентский, статический курсор или курсор набора клавиш (по умолчанию используется курсор вперед).

...