2016-01-08 5 views
3

Мой класс PDO имеет функцию под названием bindParams, которая имеет 2 параметра: setValues ​​и SetType,Автоматическое назначение типа PDO

Результат Выход должен быть как:

$insertNews->bindParam(':news_title', $newsTitle, PDO::PARAM_STR); 

Итак, я ищу, чтобы автоматически назначить "PDO :: PARAM_STR" до их значений, которая в моем случае "news_title" является переменной setValues, и "PDO :: PARAM_STR" является SetType:

public final function bindParams($setValues=array(), $setType = null){ 

    //print_r($setValues); 

    foreach ($setValues as $getVal) { 

     echo $getVal.'<br />'; 

    if (is_null($setType)) { 
     switch ($getVal) { 
      case is_int($getVal): 
       echo $getVal.' is INT<br />'; 
      $setType = PDO::PARAM_INT; 
      break; 
      case is_bool($getVal): 
       echo $getVal.' is BOOL<br />'; 
      $setType = PDO::PARAM_BOOL; 
      break; 
      case is_null($getVal): 
       echo $getVal.' is NULL<br />'; 
      $setType = PDO::PARAM_NULL; 
      break; 
      default: 
       echo $getVal.' is STR<br />'; 
      $setType = PDO::PARAM_STR; 
     } 
    } 


    } 

} // end bindParams() 

$con = new crud($dbCon); 
$con->insert('ban_ip', array('visitor_type', 'ip')); 
$con->bindParams(array('Visitor_Type', 1)); 

в результате выход:

VISITOR_TYPE является STR

Это не зацикливание другое значение, которое 1.

EDIT: Правильный код:

Я думаю, что это работает:

public final function bindParams($setValues=array(), $setType = null){ 


    $combine = array_combine($this->insertedKeys, $setValues); 

    foreach ($combine as $getKey => $getVal) { 

     //echo 'key '.$getKey.' val '.$getVal.'<br />'; 

     switch ($getVal) { 
     case is_int($getVal): 
      echo $getVal .' is INT<br />'; 
      $setType = 'PDO::PARAM_INT'; 
      break; 
     case is_bool($getVal): 
      $setType = 'PDO::PARAM_BOOL'; 
      echo $getVal .' is BOOL<br />'; 
      break; 
     case is_null($getVal): 
      echo $getVal .' is NULL<br />'; 
      $setType = 'PDO::PARAM_NULL'; 
      break; 
     default: 
      echo $getVal .' is STR<br />'; 
      $setType = 'PDO::PARAM_STR'; 
      break; 
    } 


    echo "this->stmt->bindParams($getKey, $getVal, $setType)<br />"; 


    } 


} // end bindParams() 

Результат:

Visitor_Type is STR 
this->stmt->bindParams(visitor_type, Visitor_Type, PDO::PARAM_STR) 
1 is INT 
this->stmt->bindParams(ip, 1, PDO::PARAM_INT) 

И если я не ошибаюсь, я должен выполнить код без эхо-сигнала для его запуска.

Спасибо за вашу помощь

ответ

4

То, что происходит, после того, как вы установили $ SetType в первый раз через петлю, на последующих итераций, is_null ($ SetType) возвращает ложь, поэтому заявление переключатель никогда не оценивает.

Есть несколько разных вещей, которые вы можете сделать, в зависимости от того, собираетесь ли вы на самом деле переходить в $ setType. Если вы этого не сделаете, вы должны удалить параметр $ setType и проверку is_null, а затем добавить свой вызов в bindParam ($ getVal, $ setType) после оператора switch.

Кроме того, будьте осторожны со значением оператора switch: вы, вероятно, захотите переключить (true) (или просто использовать операторы if), а не переключаться ($ getVal), потому что вы также получите разные результаты в зависимости от фактического значения (а не только тип) $ getVal.

+1

Использование 'gettype' было бы лучше для идентификации типов и предотвращения любой неоднозначности типа - http://php.net/gettype – Clay

+0

Да, я ищу только 4 параметра ТОЛЬКО: NULL, INT, STR или BOOL, .. Я никогда не использовал остальных в моем bindParams – Fred

Смежные вопросы