避免将未定义的变量传递给mysqli_stmt_bind_param?

时间:2019-01-03 17:05:52

标签: php mysqli

不幸的是,将未定义的变量传递给函数时,mysqli_stmt_bind_param不会提示错误(即使启用了所有错误)。因此,您实际上可以编写类似这样的内容而不会得到警告(它只是将未定义的变量视为NULL):

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ALL);

$db = mysqli_connect('host', 'user', 'pass', 'database');
$Stmt = mysqli_stmt_init($db);
mysqli_stmt_prepare($Stmt, 'SELECT id FROM table WHERE value = ?');
mysqli_stmt_bind_param($Stmt, 's', $UndefinedVariable); // <---------
mysqli_stmt_execute($Stmt);
mysqli_stmt_bind_result($Stmt, $ID);
mysqli_stmt_fetch($Stmt);
mysqli_stmt_close($Stmt);

?>

现在,我很肯定已经在一年前向PHP开发人员报告了这一点,但是基本上我被告知他们无法/不会修复它。但是,我现在找不到报告...

因此,我希望找到一种解决方案,以使PHP在我(可能)刚刚在源代码中打错字时大吼大叫,偶尔会发生!是否有本机解决方案?

2 个答案:

答案 0 :(得分:0)

唯一不涉及代码的本机解决方案是在错误日志中查找未定义的变量通知。

对于涉及代码的本机解决方案,请进行一些基本的输入验证,例如使用isset($variable)。例如,您可以执行以下操作:

if(!isset($UndefinedVariable)) {
    throw new Exception('Expected variabled "$UndefinedVariable" to be defined.');
}

总的来说,无论如何,您实际上应该进行输入验证。这会花费更多时间,并使代码更长,但同时也可以确保代码更安全并达到预期的效果。

答案 1 :(得分:0)

使用包装器似乎可行,但是我不确定这是否是最佳解决方案?

function db_stmt_bind_param($Stmt, $Types, ...$Params)
{
    return mysqli_stmt_bind_param($Stmt, $Types, ...$Params);
}

或者:

mysqli_stmt_bind_param($Stmt, $Types, ...[$Param1, $Param2, $Param3])

但这两个都需要使用splat运算符,这是一个相对较新的实现。