2012-07-24 47 views
1

我已經使用PHP的舊MySQL庫了很多年了,我終於開始使用MySQLi了。預先準備好的陳述看起來非常有用,所以我試圖把它們掛出來。範圍和MySQLi綁定

現在,我創造了一些準備好的發言和約束力的全球性的參數,然後使用函數像這樣執行它們:

$stmt = $mysqli->prepare("INSERT ..."); 
$stmt->bind_param("ss", $var1, $var2); 

function process($t) { 
    global $mysqli, $stmt; 
    $var1 = $t['var1']; 
    $var2 = $t['var2']; 
    $stmt->execute(); 
} 

我遇到的問題是,執行功能運行進入一個變量仍然爲空的錯誤。在收集$t的值時,我應該綁定/解除綁定嗎?

+2

'bind_param()'需要變量引用,所以如果你把它叫做outisde函數,需要在函數內全局訪問'$ var1,$ var2'。函數內部的函數是局部範圍的,與外部綁定的變量不同。 – 2012-07-24 13:56:30

+0

當然!我以爲MySQLi正在用'bind_param'做一些魔術 - 這裏還是相當早的,所以請原諒認知脹氣。 – actaeon 2012-07-24 14:02:53

回答

-1

我這樣一個虛擬的:

$stmt = $mysqli->prepare("INSERT INTO table (col1, col2) VALUES(?, ?)"); 

function process($t) { 
    global $mysqli, $stmt; 
    $var1 = $t['var1']; 
    $var2 = $t['var2']; 
    $stmt->bind_param("ss", $var1, $var2); 
    $stmt->execute(); 
} 

我認爲MySQLi正在與變量進行一些魔術綁定。 在這種情況下,bind_param只是將值放入準備好的語句中,而不是聲明某些變量與語句「綁定」。

0

我覺得把這樣的代碼應該工作: (假設$ T陣列在()中的變量存在)

function process ($t) { 
    global $mysqli; 
    $var1 = $t['var1'];  
    $var2 = $t['var2']; 

    $stmt = $mysqli->prepare("INSERT ..."); 
    $stmt->bind_param("ss", $var1, $var2); 
    $stmt->execute(); 

} 
+0

我有理由使我的準備好的陳述全球化(因爲我不想每次重新開始流程都準備一份新陳述)。我認爲這不會讓我感到困惑,這是'bind_param'實際上的作用。 – actaeon 2012-07-24 14:07:20