【发布时间】:2021-09-16 07:25:33
【问题描述】:
我想通过这种方式使用call_user_func_array绑定变数参数(请看代码处的cmets):
function dbQuery()
{
global $dbconnection;
if (func_num_args() < 1 || func_num_args() === 2) {
return error('خطای داخلی');
} else if (func_num_args() === 1) {
$stmt = $dbconnection->prepare(func_get_arg(0)); // Creating stmt
if (!$stmt) {
return error('خطای پایگاه داده');
}
if (!$stmt->execute()) {
return error('خطا در تعامل با پایگاه داده');
}
return $stmt;
} else {
$args = func_get_args();
$stmt = $dbconnection->prepare($args[0]); // args[0] is the query with question marks
if (!$stmt) {
return error('خطای پایگاه داده');
}
array_shift($args);
foreach ($args as $index => $arg) {
${'arg' . $index} = $dbconnection->real_escape_string($arg); // making args as variables because bind_params does not allow direct values
$args[$index] = ${'arg' . $index};
}
if (!call_user_func_array($stmt->bind_param,$args)) { // ERROR IS HERE LINE 67
return error('خطای امنیتی پایگاه داده');
}
if (!$stmt->execute()) {
return error('خطا در تعامل با پایگاه داده');
}
return $stmt;
}
}
$stmt = dbQuery('SELECT * FROM payments WHERE id=?','i',31);
$result = dbCheck($stmt);
var_dump($result->fetch_all());
错误是:
PHP Warning: Undefined property: mysqli_stmt::$bind_param in /home/mwxgaf/w/projects/foodorder/test.php on line 67
PHP Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($function) must be a valid callback, no array or string given in /home/mwxgaf/w/projects/foodorder/test.php:67
Stack trace:
#0 /home/mwxgaf/w/projects/foodorder/test.php(76): dbQuery()
#1 {main}
thrown in /home/mwxgaf/w/projects/foodorder/test.php on line 67
【问题讨论】:
-
你可以只使用 splat 运算符吗? stackoverflow.com/a/50682298/231316
-
为什么在使用准备好的语句时要手动转义参数?另外,您尝试过什么来解决问题?我会假设
$stmt->bind_param没有以任何方式定义 -
@ChrisHaas 我使用了你的解决方案,它也解决了另一个错误;谢谢
-
elseif在 PHP 中应该是一个单词。我们不应该看到任何带有 prepatred 语句的 real_escaping。当您第一次了解变量变量时,它们看起来很有趣,但最终您会意识到它们会阻止您对包含在数组中的数据使用强大的数组函数。当您认为您的代码需要可变变量或eval()时,您可能需要重构您的代码。 stackoverflow.com/q/13570957/2943403,stackoverflow.com/q/20886289/2943403,stackoverflow.com/q/1913899/2943403,stackoverflow.com/q/45926489/2943403 -
function dbQuery(string $sql, ...$theRest)怎么样?这样,如果$theRest是一个空数组,您就知道根本不需要准备好的语句。 stackoverflow.com/a/52323556/2943403
标签: php mysql mysqli prepared-statement call-user-func-array