判断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。
是否有可能,如果可以,那么如何确定 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。