2013-06-24 4 views
2

J'essaie d'obtenir des données à partir d'une base de données Miscrosoft SQL hors site en utilisant la connexion odbc de php, de convertir certaines requêtes en arrays, puis de transformer ces tableaux en csv que mon cms peut lire et importer. Je suis en mesure de conncect avec succès et de retourner des résultats de la base de données, mais mon manque de compétences PHP et SQL me tue.Convertir une requête SQL en csv en utilisant odbc

Ce que j'ai en ce moment, ce qui est peu, mais fait ce qu'il est censé faire:

$result = odbc_tables($connect); 

    $tables = array(); 

    while (odbc_fetch_row($result)) 
    { 
     if(odbc_result($result,"TABLE_TYPE")=="TABLE") 
     echo"<br>".odbc_result($result,"TABLE_NAME"); 

    } 

Y at-il des ressources claires sur le web sur la façon de faire ce que je veux faire? La documentation officielle de php semble être sur la documentation la plus inutile jamais. Un exemple de base: Je veux retourner les entrées ici au format csv. Je peux les obtenir dans le format de tableau:

$query = "SELECT TOP 10 * FROM Communities"; 

    $result = odbc_exec($connect, $query); 

    if ($result) 
    { 
     while (($row = odbc_fetch_array($result))) 
     { 
      print_r($row); 
     } 
     odbc_free_result($result); 
    } 
    else 
    { 
     echo 'Exec error: ' . odbc_errormsg(); 
    } 

    odbc_close($conn); 

J'aimerais avoir plus, mais je suis un peu perdu sur où aller ensuite.

+2

Check out [ 'fputcsv()'] (http://www.php.net/manual/en/function.fputcsv.php), et trouver [protocoles pris en charge et emballage] (http://www.php.net/manual/fr/wrappers.php) qui peut être utilisé dans ['fopen()'] (http://www.php.net/manual/fr/function.fopen. php). – Passerby

+0

Est-ce que fputcsv a fonctionné pour vous? Si non, vous pouvez toujours essayer d'imploser? $ csvline = implode (",", $ row); produira CSV où vous avez mis votre print_r ($ row); –

+0

travaillé nager. a pris quelques tentatives, mais ça fonctionne comme un charme. – brunam

Répondre

2

En utilisant les conseils, voici la solution de travail:

$theArray = array(); 

while (($row = odbc_fetch_array($result))) 
{ 
    array_push($theArray, $row); 
} 


$header = array('Name', 'Hours', 'Fees', 'Notes', 'ShortDescription', 'URL'); 

$fp = fopen('array.csv', 'w'); 

fputcsv($fp, $header); 

foreach ($theArray as $lines) 
{ 

    fputcsv($fp, $lines); 

} 
1

Je viens de faire faire le projet exact que vous demandez au sujet. Je cours PHP 5.2 afin que vous puissiez traiter le fichier csv plus facilement dans une version plus récente. Voici mon code:

<?php 
// Uncomment this line for troubleshooting/if nothing displays 
ini_set('display_errors', 'On'); 

$myServer = "GSRBI"; 
$myUser = "webuser"; 
$myPass = "Webuser1"; 
$myDB = "GSRBI"; 

$dbhandle = odbc_connect($myServer, $myUser, $myPass) 
    or die("Couldn't connect to SQL Server on $myServer"); 

$return = odbc_exec($dbhandle, 'select * from GSRBI.dbo.BounceBackEmail'); 

$subscribers_array = array(); 
$db_row = ''; 
$arrayrow = 0; 

while ($db_row = odbc_fetch_array($return)) 
{ 
    $arrayrow++; 
    $array[] = array(

         'card_num' => $db_row['PlayerAccountNumber'] 
         ,'last_name' => ucfirst(strtolower($db_row['LastName'])) 
         ,'first_name' => ucfirst(strtolower($db_row['FirstName'])) 
         ,'email' => $db_row['EMailAddress'] 
         ,'earned_on_date' => date('m/d/Y', strtotime('-1 days')) 
         ,'free_play' => $db_row['Offer1'] 
         ,'valid_through_date' => date('m/d/Y', strtotime('+15 days')) 

        ); 
    } 
echo print_r($arrayrow, true); ## display number of rows for sql array 
echo " rows in ODBC "; 

// Creates an array with GSR webteams contact info 
    $array1[] = array( 

         'card_num' => "123456789" 
         ,'last_name' => "GSRwebteam" 
         ,'first_name' => "GSRwebteam" 
         ,'email' => "[email protected]" 
         ,'earned_on_date' => date('m/d/Y', strtotime('-1 days')) 
         ,'free_play' => "9" 
         ,'valid_through_date' => date('m/d/Y', strtotime('+15 days')) 
        ); 

$result = array_merge((array)$array, (array)$array1); ## merge the two arrays together 


// This will convert the array to csv format then save it 
## Grab the first element to build the header 
$arr = array_pop($result); 
$temp = array(); 
    foreach($arr as $key => $data) 
    { 
     $temp[] = $key; 
    } 
$csv = implode(',', $temp) . "\n"; 
$csv .= to_csv_line($arr); ## Add the data from the first element 
    foreach($result as $arr) ## Add the data for the rest 
    { 
     $csv .= to_csv_line($arr); 
    } 
//echo print_r($csv, true); ## Uncomment to test output1 

$f = fopen('reports/bounceback-'.date('m-d-Y').'.csv', "w"); 
fwrite($f, $csv); 
fclose($f); 
Echo "The report has ran"; 

return $csv; 
function to_csv_line($result) 
    { 
    $temp = array(); 
     foreach($result as $elt) 
     { 
      $temp[] = '' . addslashes($elt) . ''; 
     } 
     $string = implode(',', $temp) . "\n"; 
    return $string; 
    }