sqlsrv_execute ничего не возвращает - PullRequest
0 голосов
/ 13 апреля 2020

Я использую SQL Серверные драйверы для PHP для доступа к SQL Серверной базе данных, и у меня проблема с обновлением некоторых данных с использованием функций sqlsrv_prpare и sqlsrv_execute.

Я выполняю два запроса:

  • В первом запросе я получаю некоторые двоичные данные (в SQL Server Management Studio этот запрос занимает около 15 минут до завершения);
  • Затем для каждой строки, возвращаемой при первом выполнении запроса, я пытаюсь обновить некоторые данные в базе данных.

Вот как выглядит мой код:

$query1 = "SELECT tgt.id, src.file, src.field1 from [Table1] tgt inner join [Table2] src on tgt.id = src.id order by tgt.id";

$query2 = "UPDATE [Table1] SET field1 = ? WHERE id = ?";

$getFiles = sqlsrv_query($con, $query1); //$con is the connection with the database, received by parameter

while($row = sqlsrv_fetch_array($getFiles, SQLSRV_FETCH_BOTH)) {
  /* Some code here */
  $file = $row[1];
  $value = $row[2];
  try {
       if(!is_null($file)) {
               $stmt = sqlsrv_prepare($con, $query2, array(&$value, &$row[0]));
               if( $stmt === false ) {
                  die( print_r( sqlsrv_errors(), true));
               }
               sqlsrv_execute( $stmt );
       }
  } catch (Exception $e) {
            error_log("\nError: " . $e->getMessage());
    }
} //end while
    sqlsrv_free_stmt($getFiles);  
    sqlsrv_close($con);

Проблема в том, что код внутри l oop отлично работает с первой строкой, но во второй запрос обновления не выполняется. sqlsrv_prepare возвращает значение 1, но sqlsrv_execute ничего не возвращает.

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

РЕДАКТИРОВАТЬ: На самом деле, пример был упрощен. Значения, которые будут обновлены в таблице tgt, рассчитываются с использованием некоторых данных из таблицы sr c и других данных приложения. Вот почему я использую l oop, для каждой строки, возвращаемой query1, указанные значения c вычисляются и используются в query2. Я уже проверил, что эти значения правильно рассчитаны, поэтому я подумал, что лучше упростить пример.

1 Ответ

0 голосов
/ 14 апреля 2020

Чтобы решить эту проблему, я должен выполнить запросы отдельно:

  • Сначала я запустил query1, произвел вычисление данных, которые мне нужны для обновления таблицы tgt, и сохранил их в массиве. ;
  • Затем, используя данные, хранящиеся в массиве, я выполнил запрос2.

Никаких других изменений не требовалось.

...