判断mysqli_result个实例是否已经准备好?

Determine whether a mysqli_result instance has been prepared?

是否有可能,如果可以,那么如何确定 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();

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();

stmt_init 的文档说:

Any subsequent calls to any mysqli_stmt function will fail until mysqli_stmt_prepare() was called.

您可以使用此事实来确定您的声明是否已准备好。您可以尝试一些无害的(无意义的,但如果声明已准备好则不太可能失败)调用,例如

$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将为null,否则为true。