Я смотрю на странную проблему с Internet Explorer 9. Приведенный ниже код успешно генерирует заполненный файл CSV при запуске в Safari, IE8, IE10, IE11, Chrome и Firefox, но создает пустой файл CSV (только заголовки) в IE9. Это не похоже на проблему с данными, учитывая, что ошибка возникает только в IE9. Я смог протестировать и подтвердить на 3 разных машинах под управлением IE9.
Это унаследованный сценарий, который я унаследовал с SQLSRV вместо MSSQL PDO, хотя я взял на себя смелость вычеркнуть mysql и заменить его на PDO, обернуть его в функцию и тщательно прокомментировать для собственного здравомыслия.
# Create a CSV sheet with details we need
# Generate file name based on timestamp
$file = "$_SESSION[user_name]_" . "tutorincomplete_" . date("Y-m-d_H-i-sa");
# 1: Open CSV File
$myFile = ".\csv\\" . "$file.csv";
$fh = fopen($myFile, 'w') or die("can't open file");
# Get list of active classes from MSSQL DB
$sql = "SELECT DISTINCT
static_title,
LEFT(CONVERT(VARCHAR, course_end_date, 120), 150) AS course_end_date,
RTRIM(static_code) as static_code,
RTRIM(session_code) as session_code,
staff_name
FROM
snip";
# Append to query where a school is present
if (ISSET($_SESSION['user_school']) AND $_SESSION['user_school'] != "None")
{
$sql .= "WHERE
school = ?
ORDER BY staff_name ASC";
$params1 = array($_SESSION['user_school']);
$query = sqlsrv_query($conn, $sql, $params1);
}
else
{
if (isset($_POST['school']) AND $_POST['school'] != "All") {
$sql .= "WHERE
school = ?
ORDER BY staff_name ASC";
$params1 = array($_POST['school']);
$query = sqlsrv_query($conn, $sql, $params1);
} else {
$sql .= "ORDER BY staff_name ASC";
$query = sqlsrv_query($conn, $sql);
}
}
$today = date('U');
# Set headers for CSV file
$head = array("Static title", "Course end date", "Static code", "Session code", "Staff name");
fputcsv($fh, $head);
$count = 0;
# Loop through MSSQL results for comparison
while ($obj = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC))
{
$finish = $obj['course_end_date'];
# Strip the time (keep ISO date format intact)
$finishSub = substr($finish, 0, 10);
# Create timestamp from date format
$finishTs = strtotime($finishSub);
# Compare and display <option> tag if valid
if ($today > ($finishTs - 604800))
{
# Fetch information on course; Decide of course is complete or incomplete
# To do this, first check for course entries in the MySQL database
# If they are present, we will use MySQL instead of MSSQL (To reference completed courses)
$sql3 = "SELECT * FROM snip WHERE static = :stc AND session = :sec ORDER BY static ASC";
$query3 = $pdo->prepare($sql3);
$query3->bindParam(':stc', $obj['static_code']);
$query3->bindParam(':sec', $obj['session_code']);
$query3->execute();
$rowCount = $query3->rowCount();# Check for result count in MySQL
if ($rowCount > 0)
{
$result = $query3->fetch(PDO::FETCH_OBJ);
if ($result->complete == 0) {
$incomplete = 1;
} else {
$incomplete = 0;
$count++;
}
} else {
# No MySQL entry; Mark as incomplete
$incomplete = 1;
}
if ($incomplete > 0)
{
$arr = array($obj['static_title'], $obj['course_end_date'], $obj['static_code'], $obj['session_code'], $obj['staff_name']);
fputcsv($fh, $arr);
}
}
}
echo "<h1>CSV file generation complete</h1>
<p>Skipped $count classes</p>
<p>File generation complete. File name $file.csv <a href=\"./csv/$file.csv\">Click here to open</a></p>";
}
Во всем, кроме IE9, он генерирует «Пропущенные X-классы», CSV-файл имеет х количество записей.
Но в IE9, «Пропущено 0 классов», файл CSV содержит только заголовки столбцов.
РЕДАКТИРОВАТЬ: я узнал через некоторые эксперименты, что SQLSRV передает пустой массив ТОЛЬКО в IE9. Это не влияет на любой другой браузер. Таким образом, я смог поразить все возможности, необходимые для переключения системы на PDO для MSSQL. Думаю, я могу назвать это исправленным, но нерешенным.
Задача ещё не решена.
Других решений пока нет …