2013-09-19 1 views
0

Я использую подготовленный оператор, и эти функции являются частью класса mysqli. Они хорошо работают для сингл-состояния. Но не отвечайте на несколько условий следующим образом:[Решить] с использованием подготовленных операторов и динамического параметра в mysqli

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

Вот мои функции:

Добавить мой класс эту функцию:

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; 
} 

Теперь он работает правильно

+0

Вы должны распечатать свой результирующий оператор SQL для отладки. – Raptor

+0

Зачем вам такая функция? Почему вы не можете сделать это просто «query» («SELECT * FROM user WHERE username =? AND name =? AND email =?», $ Array); 'Почему вы хотите ** обфускать свой собственный код? –

+0

С самого начала я сказал, что эта функция является частью класса, и я хочу, чтобы в моем классе была выбрана только одна функция. Я думаю, что проблема заключается в типе $. Потому что, когда я отправляю его напрямую, правильно работает – majid

ответ

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)

+0

почему downvote? есть ли что-нибудь неправильное? пожалуйста, помогите мне это узнать, спасибо за внимание. –

+0

Спасибо Джейсону, что проблема была в $ Type и я отредактировал первое сообщение – majid