Как создать временную таблицу в MySQL для вывода данных таблицы в виде файла CSV? - PullRequest
0 голосов
/ 14 ноября 2009

У меня есть скрипт для создания CSV-файла из таблицы базы данных, который отлично работает, за исключением того, что он выводит все данные в таблице, и мне нужно, чтобы он выводил данные только для текущего вошедшего в систему пользователя. Приложение, которое я разрабатываю, предназначено для того, чтобы пользователи могли хранить списки книг, которые они прочитали, хотят прочитать и т. Д., И я хочу, чтобы они могли загружать список своих книг, которые они могут импортировать в Excel например. (Будет ли файл CSV лучшим вариантом для этого, учитывая, что есть также OpenOffice и т. Д., А также MS Excel?)

Я понял, что мне нужно создать временную таблицу, чтобы использовать запрос выбора для выбора только записей, принадлежащих текущему вошедшему в систему пользователю. Я могу получить доступ к данным для текущего пользователя, используя WHERE username='$session->username'.

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

Существует файл конфигурации, который устанавливает свойства соединения с базой данных, но также и таблицу, которая будет использоваться для создания файла, в качестве переменной $table, и я установил это как имя временной таблицы, которую я пытаюсь создать.

Это код, который я получил:

<?
$link = mysql_connect($host, $user, $pass) or die("Cannot connect to the database." . mysql_error());
mysql_select_db($db) or die("Can not connect.");

$temp = mysql_query("CREATE TEMPORARY TABLE books_temp SELECT * FROM books WHERE username='$session->username'");
$tempresult = mysql_query($temp);

$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j]."; ";
}
$csv_output .= "\n";
}

$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("d-m-Y") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output;
$query  = 'DROP TABLE books_temp';
$result = mysql_query($query);
exit;
?>

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

Ответы [ 2 ]

1 голос
/ 15 ноября 2009

Ну, после некоторого перерыва я вернулся к этому, и, как вы, ребята, сказали, мне вообще не нужен был временный стол.

Ради полноты, и если кто-то еще сталкивается с той же проблемой, это было ее окончательное решение.

С предложением when в запросе SELECT скрипт работает нормально, я в конце концов обнаружил, но я все еще не получал данные (только имена столбцов). В конце концов я выяснил причину, по которой я не получал никаких данных, потому что, хотя '$session->username' работает на моих страницах PHP для доступа к имени текущего пользователя, скрипт, который связан только со страницей, не имеет доступа к этому. информация о сеансе.

Наконец, я решил, что мне нужно добавить дополнительную переменную $username и получить значение для нее из строки запроса в URL (не совсем уверен, как я предполагал, что информация о сеансе попадет в скрипт - голова не была не в передаче!). Именно потому, что скрипт не мог получить доступ к '$session->username', он не работал.

Вместо ссылки на скрипт с помощью:

<a href=\"scripts/mysql2csv.php">Download your list</a>

Я использовал это вместо (после объявления переменной на странице):

$accname = $session->username;

и

<a href=\"scripts/mysql2csv.php?user=$accname\">Download your list</a>

Затем все, что мне нужно было сделать, это добавить переменную $ username в начало скрипта и изменить запрос SELECT с помощью переменной.

$username = mysql_real_escape_string($_GET['user']);

По крайней мере, теперь все работает! (Я попробовал некоторые из предложений другого обсуждения, но не смог заставить их работать - либо я получил только строки заголовка, либо кучу ошибок).

0 голосов
/ 17 февраля 2012

У меня плохой подход к созданию файла CSV при условии, что типы столбцов просты. Это можно сделать с помощью CSV Storage Engine .

USE mydb
CREATE TABLE books_csv SELECT * FROM books WHERE 1=2;
ALTER TABLE books_csv ENGINE=CSV;
INSERT INTO books_csv SELECT * FROM books WHERE username='...';

Когда этот шаг сделан, файл /var/lib/mysql/mydb/books_csv.CSV существует.

Вы можете открыть файл, как пожелаете. Кстати, все поля заключены в двойные кавычки.

Дай попробовать !!!

...