2014-11-13 12 views
5

Ho il seguente PHP che restituirà i risultati alla mia query a me in un formato CSV, ma il codice (due lettere) nell'istruzione LIKE come mostrato in alto ha bisogno di cambiare tra più codici diversi.Ripetere questo MySQL in CSV più volte con diverse query SQL

Ho circa 30 codici diversi. Ho bisogno di definire tutti i codici, quali:

CV, LC, RCA, JOR ecc ...

E avere lo script fare un nuovo CSV per ogni codice diverso e passare rapidamente e il processo di ciascuno, uno dopo un'altro. Così finisco con 30 file per esempio. Potrei doverlo fare alcune volte, quindi cambiarlo manualmente 30 volte non è la mia opzione migliore.

<?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

Metti tutti i tuoi codici in un array e guarda attraverso di esso costruendo una nuova query per ogni codice man mano che procedi. –

+0

@MikeW anychance potresti essere in grado di darmi un esempio di questo? Incerto del ciclo. – JordanC26

+0

invece di provare a codificarlo da zero, è possibile utilizzare la libreria PHPexcel. Ci vorrà meno tempo. – stormrage

risposta

2

Il modo più semplice è quello di inserire tutti i vostri valori nella query utilizzando OR operatore:

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%' 
) 

E così via.

Leggere why you shouldn't use mysql_* functons in PHP.

Modifica

dispiace non ho capito la tua domanda in questo modo.

@ La risposta di RenéHoffmann è la strada da percorrere, quindi.

Innanzitutto creare un array con tutti i valori e file associato:

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

Poi iterare questo array:

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

Nel mio caso ho bisogno che faccia ogni query, non 1 O l'altra. Ho bisogno di tutti i 30 file CSV. ** 1 CSV per: LIKE '% valore_1%' ** ** 1 CSV per: LIKE '% valore_2%' ** e così via .. – JordanC26

+0

Jordan, il codice di IMHO Alain fa ciò che si vuole. Prestare attenzione al ciclo foreach, itera gettare ogni coppia dell'array di riferimento. è soprannominato scrivere qualcosa come array ('CV' => 'list-export-CV.xls', 'LC' => 'list-export-LC.xls', ....) in modo da ottenere file diversi per codici diversi. –

+0

Segui anche i suoi ottimi consigli, ne vale la pena. –

7

Come affermato Mike W, avresti solo bisogno di una matrice contenente i codici di come questo:
$codes = array("CV", "LC", "RCA", "JOR", etc....)

Quindi si genera la query ma non fino a quando non è stata verificata la connessione:

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

Perché non si considerano i due campi nella query (select FIELD1, FIELD2 from subscribers...)?
Se quei nomi di campo variano dai codici, si può usare qualcosa di simile:

  1. dichiarare la matrice come
    $codes = array("CV"=>"field_a, field_b", "LC"=>"field_c, field_d", ...)
  2. generare la query come segue
    foreach($codes as $single_code){ $select = "select $codes[$single_code] from subscribers where list=27 and custom_fields LIKE '%$single_code%'"; // ... }
1

modo più semplice di esportare i dati nel file csv è utilizzare INTO OUTFILE:

Il tuo Codice:

<?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 richiede sia l'accesso amministrativo al server SQL sia l'accesso a livello di file system alla macchina. –

1
  1. Non utilizzare l'estensione 'mysql'.

  2. Utilizzare le funzioni di scrittura csv incorporate, poiché non c'è motivo di farlo a mano.


<?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

"mettere tutti i tuoi codici in un array e guardare attraverso di esso la costruzione di una nuova query per ogni codice, come si va", dicono Hobo Sapiens ... facciamolo !!!

<?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"; 
} 
?> 
Problemi correlati