在mysqli中使用准备好的语句和动态param。

问题描述 投票:0回答:1

我使用一个准备好的语句和这些函数是mysqli类的一部分.他们的工作良好的单一条件,但不正确的答案像这样的多个条件。

SelectByOrderCondi('user','username=? AND name=? AND email=? ' , $Array )

这是我的函数。

public function SelectByOrderCondi($Table_Name, $Conditions='' ,$Array_Conditions_Limit=null, $OrderBy='', $Limit='', $Selected_Fields='*')
{
    $Query = "SELECT ".$Selected_Fields." FROM ".$Table_Name;
    if(!empty($Conditions))
        $Query .= " WHERE ".$Conditions;
    if(!empty($OrderBy))
        $Query .= " ORDER BY ".$OrderBy;
    if(!empty($Limit))
        $Query .= " LIMIT ".$Limit;

    $Statment = $this->ConnectionResult->prepare($Query);
    if(isset($Array_Conditions_Limit)  )
     {
        $Statment = $this->DynamicBindVariables($Statment, $Array_Conditions_Limit);
        $Statment->execute();
        return $Statment->get_result();
     }
     else
        return false ;

}

添加我的类这个函数。

Private function GetType($Item)
{
    switch (gettype($Item)) {
        case 'NULL':
        case 'string':
            return 's';
            break;

        case 'integer':
            return 'i';
            break;

        case 'blob':
            return 'b';
            break;

        case 'double':
            return 'd';
            break;
    }
    return '';
}

并改变DynamicBindVariables函数如下。

public function DynamicBindVariables($Statment, $Params)
{
    if (is_array($Params) && $Params != null)
    {
        // Generate the Type String (eg: 'issisd')
        $Types = '';
        foreach($Params as $Param)
        {
            $Types .= $this->GetType($Param);
        }
        // Add the Type String as the first Parameter
        $Bind_names[] = $Types;

        // Loop thru the given Parameters
        for ($i=0; $i<count($Params);$i++)
        {
            $Bind_name = 'bind' . $i;
            // Add the Parameter to the variable 
            $$Bind_name = $Params[$i];
            // Associate the Variable as an Element in the Array
            $Bind_names[] = &$$Bind_name;
        }
        // Call the Function bind_param with dynamic Parameters
        call_user_func_array(array($Statment,'bind_param'), $Bind_names);
    }
    else
    {
        $Types .= $this->GetType($Param);
        $Statment->bind_param($Types ,$Params);
    }

    return $Statment;
}

现在它可以正常工作了

php mysqli prepared-statement
1个回答
2
投票

只是附带说明一下,你的代码可能在确定类型时不正确,见这个测试。

var_dump(is_int("1"));      //bool(false)
var_dump(is_float("1.1"));  //bool(false)
var_dump(is_string("1.1")); //bool(true)

你可以用:

ctype_digit() 对于整数或 if((int) $Param == $Param)

is_numeric() 用于浮动 if((float)$Param == $Param)

© www.soinside.com 2019 - 2024. All rights reserved.