首页 > 解决方案 > 使用准备好的语句进行动态参数绑定

问题描述

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

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

在这一点上,我已经放弃并正在使用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()最终将根据用户输入准备语句的语句,这与我有关。

标签: phpmysqlprepared-statementevalbindparam

解决方案


这是使用的代码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;
    }
}

推荐阅读