我有多种使用 mysqli
函数套件访问数据库的 PHP 脚本。我编写了这些脚本来处理各种错误情况(例如 mysqli_stmt_execute
返回 false)。
是否有一种简单的方法来伪造这些错误条件以验证用户收到的输出是否适合这些条件?
最佳答案
如果您正在使用 mysqli 类。
例如:
<?php
$mysqli = new mysqli("localhost", "user", "password", "db");
$query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
$stmt = $mysqli->prepare($query);
if (false === $stmt->execute()) {
echo "Oops! some_value for same_field in some_table returned false";
}
模拟类并执行覆盖语句。
<?php
class my_mysqli extends mysqli
{
public function prepare ($query)
{
return new my_mysqli_stmt();
}
}
class my_mysqli_stmt extends mysqli_stmt {
public function execute ()
{
return false;
}
}
要使每个执行方法都返回 false,您需要更改的是:
<?php
$mysqli = new my_mysqli("localhost", "user", "password", "db");
如果您改用函数
例如:
<?php
$mysqli = mysqli_connect("localhost", "user", "password", "db");
$query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
$stmt = mysqli_prepare($mysqli, $query);
if (false === mysqli_stmt_execute($stmt)) {
echo "Oops! some_value for same_field in some_table returned false";
}
命名空间 php 中的猴子补丁 >= 5.3
<?php
namespace my_faking_namespace {
function mysqli_stmt_execute($stmt)
{
return false;
}
$mysqli = mysqli_connect("localhost", "user", "password", "db");
$query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
$stmt = mysqli_prepare($mysqli, $query);
if (false === mysqli_stmt_execute($stmt)) {
echo "Oops! some_value for same_field in some_table returned false";
}
}
您的脚本将调用 my_faking_namespace\mysqli_stmt_execute()
而不是 php 版本。
注意:如果您正在调用像 \mysqli_stmt_execute()
这样的函数,这将不起作用,因为此版本显式调用全局命名空间。
不太容易的替代方案,用于完成目的
这些在调用堆栈级别修改函数,通过使用自定义扩展模块(需要安装)在内部更改 php。
- Advanced PHP debugger有
override_function()
和rename_function()
- runkit具有
runkit_function_copy
、runkit_function_redefine
、runkit_function_remove
、runkit_function_rename
并且可以根据您的需要进行任何更改。
nJoy!
关于php - 在 mysqli 库中伪造错误条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687479/