php - 在 mysqli 库中伪造错误条件

标签 php testing

我有多种使用 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 debuggeroverride_function()rename_function()
  • runkit具有 runkit_function_copyrunkit_function_redefinerunkit_function_removerunkit_function_rename 并且可以根据您的需要进行任何更改。

nJoy!

关于php - 在 mysqli 库中伪造错误条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11687479/

相关文章:

testing - 带有指令的angular 2测试组件并得到错误路由器加载

php - 如何在Cell中使用HTML Helper或调用initialize()?

php - WooCommerce - 在购物车页面上取消设置 "<product> removed notice…"

reactjs - 如何与 ReactTestRenderer/Jest 渲染的组件交互

java - Eclipse:Junit 我在下面的 junit 选项卡中看到此错误

android - Espresso : How to use R. androidTest文件夹的字符串资源

java - 我需要在 JUnit 测试中专注于测试 "public"方法还是 "private"方法?

php - 安装 Herd 并返回 Valet 后为 502

php - 如何使用一个 laravel 安装来处理子域

php - 我想根据登录的用户名使用 php 更新数据库中的字段,但它不起作用