php - 使用准备好的语句进行动态参数绑定(bind)

标签 php mysql prepared-statement eval bindparam

在为我的网站构建准备好的语句时,我发现可以迭代大量冗余代码。 mysqli::prepare 是一个非常直接的迭代,但是当我到达 mysqli::bind_parammysqli::bind_result 时,我遇到了以下问题组合:

1) 我不知道mysqli::bind_param中有多少参数
2) 在mysqli::bind_param的参数中使用extract(Array)将不起作用,因为mysqli::bind_param的参数code> 通过引用传递
3) extract(Array) 上的 EXTR_REF 标志也无济于事,因为传递的元素的值本身不能是引用。

此时,我已经放弃并使用 eval()

$statements[
    's_records_by_parent'=>[
        'sql'=>
            "select * from table where id=?",
        'params'=>[
                '"i"',
                '$id'
             ]
        ],
];
foreach($statements as $name=>$statement){
    if(!$name=$this->mysql->prepare(
        $statement['sql']
    ))
    {
        echo"Error preparing statement $name.";
        exit;
    }
    if(!eval("return \$name->bind_param(".implode(',',$statement['params']).");"))
    {
        echo"Error binding parameters for statement $name.";
        exit;
    }
}

上面的代码完全按照我想要的方式执行,除了有一个 eval() 语句,该语句最终将根据用户输入准备语句,这与我。

最佳答案

这是使用call_user_func_array()的代码:

$statements[
    's_records_by_parent'=>[
        'sql'=>
            "select * from table where id=?",
        'params'=>[
                'i',
                'id'
        ]
    ],
];
foreach($statements as $name=>&$statement){
    if(!$name=$this->mysql->prepare(
        $statement['sql']
    ))
    {
        echo"Error preparing statement $name.";
        exit;
    }
    foreach($statement['params']as$k=>$param)
         if($k)$statement['params'][$k]=&$$param;

    if(!call_user_func_array([$name,'bind_param'],$statement['params']))
    {
        echo"Error binding parameters for statement $name.";
        exit;
    }
}

关于php - 使用准备好的语句进行动态参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181586/

相关文章:

php - Laravel/Ardent/User 模型编辑+保存

php - 在表格单元格内放置一个提交按钮

php - 使用 php 编码更新 mysql 中的现有行

java - QueryForList未设置参数

PHP5 无法打开流 : HTTP request failed error when using fopen

php - 将相似的结果组合在一起

java - 通过java将文件路径保存到mysql

php - 删除一些源数据后如何维护对汇总表的更新

php - 选择查询的顺序在准备好的语句中不起作用

java - 准备语句SQL异常 "No Input Parameters"