2009-11-14 3 views
0

데이터베이스 테이블에서 CSV 파일을 만드는 스크립트가 있습니다.이 스크립트는 테이블의 모든 데이터를 출력한다는 점을 제외하고는 잘 작동합니다. 현재 로그인 한 사용자 만 데이터를 출력해야합니다. 제가 개발중인 앱은 사용자가 읽고 읽었던 책 목록을 저장할 수 있기 때문에 Excel로 가져올 수있는 책 목록을 다운로드 할 수있게하려는 것입니다. 예를 들면. (CSV 파일이 MS Excel뿐만 아니라 OpenOffice 등이 있기 때문에 최선의 선택이 될 것입니까?)테이블 데이터를 CSV 파일로 출력하기 위해 MySQL에서 임시 테이블을 만드는 방법은 무엇입니까?

레코드를 선택하기 위해 선택 쿼리를 사용하려면 임시 테이블을 만들어야한다는 것을 알았습니다 현재 로그인 한 사용자에 속합니다. 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을 체크인하면 임시 테이블이 생성되는 것처럼 보이지 않습니다. 나는 분명히 뭔가 잘못하고 있거나 뭔가를 놓치고 있지만, 나는 무엇이 있는지 전혀 모른다.

+0

PHP를 통해 MySql에서 CSV로 내보내기가 여기에 응답되었습니다 : http://stackoverflow.com/questions/125113/php-code-to-convert-a-mysql-query-to-csv – Gordon

+0

TEMPORARY 대신 VIEW 사용 TABLE – Dimme

답변

1

잠시 휴식을 취한 후에 나는 그것에 대해 다시 생각해 보았습니다. 그리고 여러분이 말했듯이 실제로 임시 테이블이 필요하지 않았습니다.

완벽을 기하기 위해 다른 누구와도 동일한 문제가 발생하면 이는 결국 해결책이됩니다.

SELECT 쿼리의 when 절을 사용하면 스크립트가 제대로 작동하지만 결국에는 발견되었지만 여전히 데이터를 가져 오지 못했습니다 (열 이름 만). 마침내 나는 어떤 데이터도 얻지 못하는 이유를 알아 냈습니다. 왜냐하면 '$session->username'이 내 PHP 페이지에서 현재 사용자의 이름에 액세스하기 때문에 페이지에만 링크 된 스크립트는 해당 세션 정보에 액세스 할 수 없기 때문입니다 .

마지막으로 나는 여분의 변수 $username을 추가하고 URL의 쿼리 문자열에서 그 값을 얻을 필요가 있음을 알았습니다. (세션 정보가 스크립트 정보에 어떻게 도달하는지 추정하지 못했습니다. t 기어에!). 스크립트가 '$session->username'에 액세스 할 수 없어 스크립트가 작동하지 않기 때문입니다.

오히려으로 스크립트에 연결보다 : 다음

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

:

$accname = $session->username; 

하고 :

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

I는 (페이지에서 변수를 선언 한 후에) 대신 사용 내가해야만하는 것은 $ username 변수를 스크립트 상단에 추가하고 va를 사용하여 SELECT 쿼리를 수정하는 것입니다. riable.

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

적어도 이제는 모두 작동합니다. (나는 다른 토론에 대한 제안을 시도했지만 어떤 것도 얻을 수 없었다. 헤더 행이나 오류가 발생했기 때문이다.)

+1

아마도 임의의 사용자가 URL의'$ user' 변수를 변경하여 다른 사용자의 책을 다운로드 할 수 있습니다. –

0

필자는 열 유형이 간단하다면 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이 존재합니다.

원하는대로 파일을 열 수 있습니다. BTW 모든 필드는 큰 따옴표로 묶여 있습니다.

사용해보기 !!!

관련 문제