2016-03-03 40 views
1

如果確定mysqli_result的一個實例是否已經準備好了,是否可能,如果是,那麼又如何?確定是否已準備好mysqli_result實例?

下面的代碼說明了這個問題。在使用mysqli :: stmt_init創建實例並將其傳遞給可能準備好或可能不準備的函數之後,代碼應該有條件地進行分支,具體取決於它是否已準備好。如果有人知道如何做到這一點,我很想知道。謝謝。

function toPrepareOrNotToPrepareThatIsTheQuestion($stmt) { 
    if (rand() % 2) { 
     $stmt->prepare('DELETE FROM foo WHERE bar = ?'); 
    } 
} 

$mysqli = new mysqli($host, $user, $pass, $database); 

$stmt = $mysqli->stmt_init(); 
toPrepareOrNotToPrepareThatIsTheQuestion($stmt); 

if (/* $stmt is not prepared yet */) { 
    $stmt->prepare('DELETE FROM baz WHERE bar = ?'); 
} 

$stmt->bind_param('i', (int) $bar); 
$stmt->execute(); 

回答

0

的文檔stmt_init說:

任何mysqli_stmt功能的任何後續調用將失敗,直到mysqli_stmt_prepare()被調用。

您可以使用這個事實來確定您的語句是否已準備好。你可以嘗試一些無害的(沒有意義的,但不太可能失敗,如果準備語句)調用,像

$is_prepared = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR); 
// MYSQLI_CURSOR_TYPE_NO_CURSOR is the default value. 
// Unless you have actually need it to be something else this should have no effect 

如果沒有準備,你會得到一個警告,$is_prepared將是無效的,否則這將是事實。

+0

是的,我想這應該工作。非常感謝。 – OscarJ

1

PHP documentation for stmt_init的評論狀態you can use $stmt = $mysqli->prepare(); directly without stmt-init()。然後它說i think there is no need for stmt-init我不能同意更多,特別是在你的情況。

$mysqli = new mysqli($host, $user, $pass, $database); 

$stmt = false; 

// something could possibly happen here 
// which results in $stmt becoming an object via $stmt = $mysqli->prepare() 

// $stmt is not set yet 
if (!$stmt) { 
    $stmt = $mysqli->prepare('DELETE FROM baz WHERE bar = ?'); 
} 

$stmt->bind_param('i', (int) $bar); 
$stmt->execute(); 
+0

我的示例代碼只是爲了說明我希望能夠做什麼。我的實際情況當然要複雜得多。對mysqli_stmt的引用被傳遞給許多其他對象,每個對象可能需要或可能不需要執行它,這取決於運行時發生的情況。如果他們都不需要執行它,我想要防止在MySQL服務器上準備它的開銷。如果它們中的多個需要執行它,我想要防止多次準備相同語句的開銷。 – OscarJ

+1

這聽起來像是一個非常有問題的結構。您希望/希望將mysqli語句對象傳遞給類,以便這些類能夠知道是否執行了查詢。每當你準備好但不執行某事時,其中一個的聲明對象正在改變。我唯一能想到的就是創建一個執行db查詢的集中式服務類,在那裏它可以更容易地實現查詢是否被執行。 – skrilled

+0

我不希望班級知道。我想確定他們會知道。因此我的問題。通過傳遞一個包含mysqli_stmt和一個布爾型標誌的數組引用可以很容易地實現這一點。但是,如果可以直接從mysqli_stmt中確定,那將更容易。這個結構並不值得懷疑,因爲引用存儲在受保護的屬性中,即它是這些類的用戶不需要擔心的實現細節。 – OscarJ