Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

能提供个demo如何修改 pdo 构造函数 这类的例子么#160

Unanswered
luffe339 asked this question inQ&A
Discussion options

You must be logged in to vote

Replies: 5 comments

Comment options

// 从全局查找 PHP 的 PDO 类
if let Ok(pdo_class) = ClassEntry::from_globals("PDO") {
// 获取原始的 PDO 构造函数
if let Ok(original_constructor) = pdo_class.get_method("__construct", Visibility::Public) {
// 添加一个新的 __construct 方法
pdo_class.add_method("__construct", Visibility::Public, move |this, arguments, _| {
// 进行自定义逻辑,比如拦截 PDO 数据库连接信息
if let Some(arg0) = arguments.get(0) {
let dsn = arg0.as_str().unwrap_or("");
println!("Intercepted PDO::__construct with DSN: {}", dsn);
}

            // 调用原始的构造函数            original_constructor.call(this, arguments)?;            // 可以在这里添加后续逻辑            println!("Finished executing original PDO::__construct");            Ok(())        });    } else {        eprintln!("Failed to get PDO::__construct method.");    }} else {    eprintln!("PDO class not found.");}
You must be logged in to vote
0 replies
Comment options

get_method 方法不存在

You must be logged in to vote
0 replies
Comment options

有一个思路,你可以尝试一下(我没试过):

https://docs.rs/phper-sys/0.13.1/phper_sys/type.zend_class_entry.html

修改zend_class_entry.constructor.internal_function.handler

You must be logged in to vote
0 replies
Comment options

有一个思路,你可以尝试一下(我没试过):

https://docs.rs/phper-sys/0.13.1/phper_sys/type.zend_class_entry.html

修改zend_class_entry.constructor.internal_function.handler
好的,谢谢,我试试,刚学rust

You must be logged in to vote
0 replies
Comment options

我写了一个,看看还有什么可以优化的

use phper::classes::ClassEntry;
use phper::sys;
use std::ffi::CStr;
use phper::{modules::Module, php_get_module};

// 保存原始的构造函数指针
static mut ORIGINAL_PDO_CONSTRUCT: Option<unsafe extern "C" fn(*mut sys::zend_execute_data, *mut sys::zval)> = None;

// 自定义的 PDO 构造函数
unsafe extern "C" fn my_custom_pdo_construct(execute_data: *mut sys::zend_execute_data, return_value: *mut sys::zval) {
println!("Custom PDO::__construct called!");
// 调用原始的 PDO 构造函数
if let Some(original_construct) = ORIGINAL_PDO_CONSTRUCT {
println!("Calling original PDO::__construct...");
original_construct(execute_data, return_value);
} else {
panic!("Error: Original PDO constructor not found.");
}
}

#[php_get_module]
pub fn get_module() -> Module {
let mut module = Module::new("rust_php_ext", "0.1.0", "");

module.on_module_init(|| {    // 查找 PDO 类    let pdo_class = ClassEntry::from_globals("PDO").unwrap();    // 获取 PDO 类的 zend_class_entry    unsafe {        let pdo_class_entry_ptr = pdo_class.as_ptr() as *mut sys::zend_class_entry;        // 检查指针是否为空        if !pdo_class_entry_ptr.is_null() {            // 打印类名            let class_name = CStr::from_ptr((*pdo_class_entry_ptr).name as *const i8)                .to_str()                .unwrap_or("Unknown class");            println!("Found class: {}", class_name);            // 保存原始的构造函数            let original_construct = (*pdo_class_entry_ptr).constructor;            if !original_construct.is_null() {                // 保存原始构造函数指针到全局静态变量中                ORIGINAL_PDO_CONSTRUCT = Some(std::mem::transmute((*original_construct).internal_function.handler));                // 替换构造函数的 handler 为自定义的构造函数                (*original_construct).internal_function.handler = Some(my_custom_pdo_construct);                println!("PDO::__construct has been replaced.");            } else {                panic!("Original PDO constructor not found.");            }        } else {            panic!("PDO class entry pointer is null.");        }    }});module

}

image

You must be logged in to vote
0 replies
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Category
Q&A
Labels
None yet
2 participants
@luffe339@jmjoy
Converted from issue

This discussion was converted from issue #159 on August 16, 2024 05:42.


[8]ページ先頭

©2009-2025 Movatter.jp