2014-11-13 17 views
5

Tôi có PHP sau đây sẽ trả về kết quả truy vấn của tôi cho tôi ở định dạng CSV, nhưng mã (hai chữ cái) trong câu lệnh LIKE như được hiển thị ở trên cùng cần phải thay đổi giữa nhiều mã khác nhau.Lặp lại MySQL này với CSV nhiều lần với các truy vấn SQL khác nhau

Tôi có khoảng 30 mã khác nhau. Tôi cần phải xác định tất cả các mã như:

CV, LC, RCA, JOR vv ...

Và có kịch bản làm cho một CSV mới cho mỗi đoạn mã khác nhau và nhanh chóng đi và xử lý mỗi người, một cái khác. Vì vậy, tôi kết thúc với 30 tập tin ví dụ. Tôi có thể cần phải làm điều này một vài lần để tự thay đổi nó 30 lần không phải là lựa chọn hàng đầu của tôi.

<?php 

// database variables 
$hostname = "localhost"; 
$user = "###"; 
$password = "###"; 
$database = "###"; 

$select = "select * from subscribers where list=27 and custom_fields LIKE '%\%CV\%%'"; 

$con = mysql_connect($hostname, $user, $password); 
$db_selected = mysql_select_db($database, $con); 

// Check connection 
if (!$con) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 

$export = mysql_query ($select) or die ("Sql error : " . mysql_error()); 

$fields = mysql_num_fields ($export); 

for ($i = 0; $i < $fields; $i++) 
{ 
    $header .= mysql_field_name($export , $i) . "\t"; 
} 

while($row = mysql_fetch_row($export)) 
{ 
    $line = ''; 
    foreach($row as $value) 
    {            
     if ((!isset($value)) || ($value == "")) 
     { 
      $value = "\t"; 
     } 
     else 
     { 
      $value = str_replace('"' , '""' , $value); 
      $value = '"' . $value . '"' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r" , "" , $data); 

if ($data == "") 
{ 
    $data = "\n(0) Records Found!\n"; 
} 

header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=list-export.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
print "$header\n$data"; 

?> 
+0

Đặt tất cả mã của bạn vào một mảng và xem xét nó tạo truy vấn mới cho mỗi mã như bạn đi. –

+0

@MikeW anychance bạn có thể cho tôi một ví dụ về điều này? Không chắc chắn của vòng lặp. – JordanC26

+0

thay vì cố gắng mã nó từ đầu, bạn có thể sử dụng thư viện PHPexcel. Sẽ mất ít thời gian hơn. – stormrage

Trả lời

2

Cách đơn giản nhất là để chèn tất cả các giá trị của bạn trong truy vấn sử dụng OR điều hành:

SELECT * 
FROM subscribers 
WHERE list = 27 
AND (
    custom_fields LIKE '%value_1%' 
    OR custom_fields LIKE '%value_2%' 
    OR custom_fields LIKE '%value_3%' 
    OR custom_fields LIKE '%value_4%' 
) 

Và vân vân.

Vui lòng đọc why you shouldn't use mysql_* functons in PHP.

Sửa

Xin lỗi tôi không hiểu câu hỏi của bạn theo cách này.

Câu trả lời của RenéHoffmann là cách để thực hiện, sau đó.

Đầu tiên tạo ra một mảng với tất cả các giá trị và tập tin liên quan:

$data = array(
    'value1' => 'myvalue1.csv', 
    'value2' => 'myvalue2.csv', 
    'value3' => 'myvalue3.csv', 
    ... 
); 

Sau đó lặp mảng này:

foreach ($data as $value => $file) 
{ 
    $escapedValue = mysql_real_escape_string($value); 
    $select = "select * from subscribers where list=27 and field LIKE '%{$escapedData}%'"; 
    $response = mysql_query($select); 

    $rows = array(); 
    while ($row = mysql_fetch_assoc($response)) 
    { 
     $rows[] = $row; 
    } 

    $csv = array2csv($rows); // see https://stackoverflow.com/a/13474770/731138 
    file_put_contents($file, $csv); 
} 
+0

Trong trường hợp của tôi, tôi cần nó để thực hiện mọi truy vấn, chứ không phải là 1 OR. Tôi cần tất cả 30 tệp csv. ** 1 CSV cho: LIKE '% value_1%' ** ** 1 CSV cho: LIKE '% value_2%' ** vv .. – JordanC26

+0

Jordan, mã của IMHO Alain thực hiện những gì bạn muốn. Chú ý đến vòng lặp foreach, nó lặp lại ném mỗi cặp của mảng tham chiếu. nó được viết để viết một cái gì đó như mảng ('CV' => 'danh sách-xuất-CV.xls', 'LC' => 'danh sách-xuất-LC.xls', ....) để bạn sẽ nhận được các tập tin khác nhau cho các mã khác nhau. –

+0

Cũng làm theo lời khuyên rất tốt của mình, họ có giá trị nó. –

7

Như Mike W nói, bạn muốn chỉ cần một mảng chứa mã của bạn như cái này:
$codes = array("CV", "LC", "RCA", "JOR", etc....)

Sau đó, bạn tạo truy vấn nhưng không cho đến khi bạn kiểm tra kết nối:

//... 
// connection has been checked 
foreach($codes as $single_code){ 
    // do the file-writing-stuff here, using $single_code to generate each query 
} 
// ... 

Tại sao bạn không xem xét hai trường trong truy vấn (select FIELD1, FIELD2 from subscribers...)?
Nếu những tên trường khác nhau tùy theo các mã, bạn có thể sử dụng một cái gì đó như thế này:

  1. khai báo mảng như
    $codes = array("CV"=>"field_a, field_b", "LC"=>"field_c, field_d", ...)
  2. tạo ra các truy vấn như sau
    foreach($codes as $single_code){ $select = "select $codes[$single_code] from subscribers where list=27 and custom_fields LIKE '%$single_code%'"; // ... }
1

Cách đơn giản nhất xuất dữ liệu trong tệp csv là sử dụng INTO OUTFILE:

Mã của bạn:

<?php 

$codes = array("CV", "LC", "RCA", "JOR", etc....) 


foreach($codes as $single_code){ 

    $query = "SELECT * 
       INTO OUTFILE '/tmp/document_".$single_code.".csv' 
       FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '".'"'."' 
       LINES TERMINATED BY '\n' 
     FROM subscribers WHERE list=27 AND custom_fields LIKE '%\%".$single_code."\%%'"; 

    $export = mysql_query ($query) or die ("Sql error : " . mysql_error()); 

} 

?> 
+1

INTO OUTFILE yêu cầu cả quyền truy cập quản trị vào máy chủ SQL và quyền truy cập cấp hệ thống tệp vào máy. –

1
  1. Không sử dụng phần mở rộng 'mysql'.

  2. Sử dụng chức năng csv-viết tích hợp sẵn, vì không có lý do gì để thực hiện việc đó bằng tay.


<?php 

$dbh = new PDO('mysql:host=localhost;dbname=database', 'user', 'password'); 

$data = fopen('php://temp', 'r+'); 
$header = false; 

$codes = ["CV", "LC", "RCA", "JOR", '...']; 
foreach ($codes as $code) { 
    $result = $dbh->query("select * from subscribers where list=27 and custom_fields LIKE '%{$code}%'"); 

    if ($result->rowCount()) { 
     while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
      if (!$header) { 
       $header = true; 
       fputcsv($data, array_keys($row)); 
      } 

      fputcsv($data, $row); 
     } 
    } else { 
     fputcsv($data, ["(0) Records Found!"]); 
    } 
} 

// Read what we have written. 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=list-export.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
rewind($data); 
echo stream_get_contents($data); 
0

"Đặt tất cả các mã của bạn trong một mảng và xem xét thông qua nó xây dựng một truy vấn mới cho mỗi mã như bạn đi" nói Hobo Sapiens ... chúng ta hãy làm điều đó !!!

<?php 

// database variables 
$hostname = "localhost"; 
$user = "###"; 
$password = "###"; 
$database = "###"; 
$codes = array("CV", "LC", "RCA", "JOR"); 

$con = mysql_connect($hostname, $user, $password); 
$db_selected = mysql_select_db($database, $con); 

// Check connection 
if (!$con) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 


for ($c = 0; $c < $codes; $c++) 
{ 

$select = "select * from subscribers where list=27 and custom_fields LIKE '%\%" + $c + "\%%'"; 

// and that's it :) 


$export = mysql_query ($select) or die ("Sql error : " . mysql_error()); 

$fields = mysql_num_fields ($export); 

for ($i = 0; $i < $fields; $i++) 
{ 
    $header .= mysql_field_name($export , $i) . "\t"; 
} 

while($row = mysql_fetch_row($export)) 
{ 
    $line = ''; 
    foreach($row as $value) 
    {            
     if ((!isset($value)) || ($value == "")) 
     { 
      $value = "\t"; 
     } 
     else 
     { 
      $value = str_replace('"' , '""' , $value); 
      $value = '"' . $value . '"' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r" , "" , $data); 

if ($data == "") 
{ 
    $data = "\n(0) Records Found!\n"; 
} 

header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=list-export.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
print "$header\n$data"; 
} 
?> 
Các vấn đề liên quan