Я использую 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. Я уже проверил, что эти значения правильно рассчитаны, поэтому я подумал, что лучше упростить пример.