2015-11-02 63 views
2

我有一個執行SQL查詢的函數,「queryValue」實際查詢執行稍後通過。PHP:在一個函數內部創建一個MYSQL查詢

Function queryCreate($queryValue){ 
    //DB connection variables 
    $host = ""; 
    $user = ""; 
    $password = ""; 
    $database = ""; 

    //create the connection 
    $conn = new mysqli($host, $user, $password, $database); 

    if ($conn->connect_error) { 
     die('DB Connection error: (' . $conn->connect_error . ') ' . $conn->connection_errorno); 
    } 
    $query = mysqli_query($conn,$queryValue) or die(mysqli_error($conn)); 

    if ($result = mysqli_fetch_array($query,MYSQLI_ASSOC)) { 
     fputcsv($fh, array_keys($result)); 
     fputcsv($fh, $result); 
     while ($result = mysqli_fetch_array($query,MYSQLI_ASSOC)) {  
      fputcsv($fh, $result); 
     } 
    } 
    return $queryValue; 
} 

我然後試圖在單獨的if語句中分配查詢值。下圖:

if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')) { 
    $fh = csvCreate("Output Weight Null ".date('m-d-Y-His').".csv"); 
    $queryValue = queryCreate('SELECT * FROM `table` WHERE WEIGHT = 0 OR weight IS NULL'); 
} 

我的問題是,查詢不會似乎被傳遞給函數。任何人都可以提出我在這裏出錯的地方嗎?非常感謝。

的csvCreate功能如下所示:

function csvCreate($filename){ 
    header("Cache=Control: must-revalidate, post-check=0, pre-check=0"); 
    header('Content-Description: File Transfer'); 
    header("Content-type: text/csv"); 
    header("Content-Disposition: attachment; filename={$filename}"); 
    header("Expires: 0"); 
    header("Pragma: public"); 
    $fh = @fopen('php://output', 'w'); 
    return $fh; 
} 
+0

你怎麼知道該參數不傳遞給函數?作爲該函數的結果,爲什麼返回查詢? – Shadow

+0

也許這是一個假設。 CSV顯示爲空白。我試圖將'queryValue'傳遞給函數,因爲它在IF語句中被調用。 –

+0

您是否嘗試直接從您最喜愛的mysql管理器應用程序(例如phpmyadmin)運行查詢?如果是的話,你有沒有得到任何記錄? $ fh變量(用於輸出數據到csv的文件處理程序)來自哪裏?如果它沒有在函數中聲明爲全局的,php將假定$ fh是一個局部變量。 – Shadow

回答

3

問題是與fputcsv的參數()內queryCreate()函數調用。

文件處理器($ FH變量)聲明queryCreate之外使用csvCreate()()函數中:

$fh = csvCreate("Output Weight Null ".date('m-d-Y-His').".csv"); 

然而,$ FH不作爲參數傳遞給queryCreate()獲得通過,也不爲$ FH聲明爲一個全局變量,但$ FH變量用於引用文件中的所有fputcsv()調用:

fputcsv($fh, array_keys($result)); 

在這種情況下,內queryCreate()$ FH將不參考FH $變量其中queryCreate()被調用,但它會創建一個本地的$ fh變量(在那個空),因此t他fputcsv()調用將失敗。 csv文件是在csvCreate()中創建的,這與把文件中的值放在一起是獨立的。

最好的解決方案是將$ fh作爲參數傳遞給queryCreate(),或者從queryCreate()調用csvCreate()。在後一種情況下,數據集的名稱應作爲參數傳遞。

UPDATE 讓我們來看看一些代碼,以及:

//declaration of queryCreate() 
Function queryCreate($queryValue, $reportName){ //$reportName is the name of the report 
    ... 
    //create the csv file, put some parameter checks here as well 
    $fh = csvCreate($reportName.date('m-d-Y-His').".csv"); 
    //and some error handling here 
    ... 
    //output the contents of the query to the csv file 
    if ($result = mysqli_fetch_array($query,MYSQLI_ASSOC)) { 
     fputcsv($fh, array_keys($result)); 
     fputcsv($fh, $result); 
     while ($result = mysqli_fetch_array($query,MYSQLI_ASSOC)) {  
      fputcsv($fh, $result); 
     } 
    }  
    ... //should include closing of the csv file 
} //end queryCreate() 

... 

//call the queryCreate() 
if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')) { 
    $queryValue = queryCreate('SELECT * FROM `table` WHERE WEIGHT = 0 OR weight IS NULL','Output Weight Null '); 
} 
+0

你介意給我一個你如何做後一種解決方案的例子。我有點迷路。歡呼 –

+0

哪一部分會給你帶來問題:給函數添加另一個參數或者將函數調用從一個地方移動到另一個地方? – Shadow

+0

在queryCreate()中調用csvCreate,我不確定如何動態地執行它,因爲我需要在if語句中分配fh文件名。 –