2016-01-09 4 views
0

У меня есть класс подключения DB, все в порядке, за исключением шага при привязке значений, он вставляет последние данные поля во все поля плюс тип, а привязка возвращает число 2, а не (INT, BOOL, NULL, ...), как я указал:DB connect class: bind issue

enter image description here

Таким образом, он должен вставить:

налить fied1 в field1 залить fied2 в field2 залить fied3 в field3

и так далее, вот код:

<?php 

final class crud { 


public function __construct($connexionName) { 

    $this->connexionName = $connexionName; 
} 


public final function insert($tableName, $fields=array()){ 

     $this->tableName = $tableName; 
     $this->fields = $fields; 


     foreach ($this->fields as $vf) { 

      $inKeys[]  = $vf; 
      $inKeysDotted[] = ':' . $vf; 

      $insImKeys  = implode(', ', $inKeys); 
      $insImKeysDotted = implode(', ', $inKeysDotted); 


      $this->insImKeys   = $insImKeys; 
      $this->insImKeysDotted = $insImKeysDotted; 

     } 

      $this->insertedKeys   = $inKeys; 
      $this->insertedKeysDotted = $inKeysDotted; 

      //print_r($this->insertedKeys); 

      //echo '<br />'; 

     $sql = "INSERT INTO `$this->tableName` ($this->insImKeys) VALUES ($this->insImKeysDotted);"; 
     //echo $sql.'<br />'; 

     $insertItems = $this->connexionName->prepare($sql); 

     $this->insertItems = $insertItems; 

     //print_r($insertItems).'<br />'; 

} // end prepareStm() 


public final function bindParams($setValues=array()){ 


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

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

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

     return $setType; 
    } 


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

    //echo '<pre>'; 
    //print_r($this->insertItems); 
    //echo '</pre>'; 


    } 


} // end bindParams() 


public final function executeQuery(){ 
    return $this->insertItems->execute(); 
} 



} 

require_once '../Included_Files/Connect.php'; 



$con = new crud($connexion); 

echo '<br />'; 

$con->insert('test', array('field1', 'field2', 'field3')); 
$con->bindParams(array('pour field1', 'pour field2', 'pour field3')); 
$con->executeQuery(); 

?> 

Результат эхо и print_r являются:

INSERT INTO `test` (field1, field2, field3) VALUES (:field1, :field2, :field3); 
this->insertItems->bindParam(field1, pour field1, 2) 

this->insertItems->bindParam(field2, pour field2, 2) 

this->insertItems->bindParam(field3, pour field3, 2) 

Спасибо за вашу поддержку

ответ

2

У вас есть две проблемы в вашем коде, один крупный и один несовершеннолетний.

Во-первых, поскольку вы используете PDOStatement::bindParam(), вы привязываете переменную , а не значение. Это означает, что при вызове

$this->insertItems->bindParam("field1", $getVal, PDO::PARAM_STR); 
$this->insertItems->bindParam("field2", $getVal, PDO::PARAM_STR); 
$this->insertItems->bindParam("field3", $getVal, PDO::PARAM_STR); 

над тремя последовательных итераций цикла, все три этих этих полей связаны с переменной $getVal, значение которого изменяется каждый раз через петлю.

Вместо этого вы должны позвонить PDOStatement::bindValue(). Это будет привязывать значение значения $getVal (при совершении вызова) к параметру, а не самой переменной.

Это ваша основная проблема, и решение проблемы сделает ваш код (в основном) работой.


Ваш меньше проблем является коммутатор заявление:

switch ($getVal) { 
    case is_int($getVal): 
    ... 

Это эквивалентно записи if($getVal == is_int($getVal)). Это означает, что если, скажем, $getVal === '0' (т. Е. $getVal - это строка, значение которой оценивается как false в булевом контексте), то '0' == is_int($getVal) ('0' не является int, поэтому is_int возвращает false), и вы завершаете попытку свяжите строку '0' как целое число.

Вместо этого вы должны заменить оператор switch рядом с операторами if/else if или вместо этого использовать switch(true).

+0

Я использовал, если/else, все равно останется тем же результатом: 'if (is_int ($ getVal)) {$ setType = PDO :: PARAM_INT; } ' –

+0

Но вы изменили' bindParam() 'на' bindValue() '? Это основная проблема в вашем коде, которая мешает ему вообще работать. – jbafford

+0

Да, я сделал, я отлично смотрю –