2015-01-28 3 views
1

У меня есть функция для вставки CSV-файлов в базу данных. Мой проект с использованием Yii Framework, но этот класс не связан Yii.Значение переменной differrent при использовании var_dump()

Импорт успешно, но у меня возникли проблемы при печати количества импортированных строк.

Мой класс (несколько файлов, но есть только один файл):

class LsuController extends BackEndController { 
    public function dbconfig(){ 
     $dbconfig = array(); 
     $dbconfig['dsn'] = 'mysql:host=localhost;dbname=bs_dev_csueastbay'; 
     $dbconfig['username'] = 'root'; 
     $dbconfig['password'] = ''; 
     return $db = new PDO($dbconfig['dsn'], $dbconfig['username'], $dbconfig['password']); 
    } 

    public function actionIndex() { 
     // Config database 
     $db = $this->dbconfig(); 

     $has_err = 0; 
     $link = dirname(__FILE__)."/../../../runtime/Import/"; 
     $handles = array(); 
     $handles[] = fopen($link."bookPictureMappings.csv","r"); 

     foreach ($handles as $handle) { 
      if(!$handle){ 
       $has_err++; 
      } 
     } 
     if($has_err == 0){ 
      foreach ($handles as $key=>$handle) { 
       switch ($key) { 
        case '0': 
        $i = 0; 
        $model_err = 0; $ss = 0; 
        do { 
         if (isset($data[0])) { 
          if($i > 0){ 
           $sql="INSERT INTO bookpicturemappings (Id, BookId, PictureId, bookpicturemappings.Order) VALUES (
            :Id, :BookId, :PictureId, :bookOrder)"; 

           $command = $db->prepare($sql); 
           $command->bindParam(":Id",$data[0],PDO::PARAM_STR); 
           $command->bindParam(":BookId",$data[1],PDO::PARAM_STR); 
           $command->bindParam(":PictureId",$data[2],PDO::PARAM_STR); 
           $command->bindParam(":bookOrder",$data[3],PDO::PARAM_STR); 

           if ($command->execute()){ 
            $ss++; 
           } 
          } 
          $i++; 
         } 
        } while ($data = fgetcsv($handle,0,",","\"")); 

        echo "Insert bookpicturemappings.csv successful! Total: ".($i-1)." - Import: ".$ss." - Error: ".$model_err."<br>"; 
        break; 
............................... 

вопрос здесь:

  • Когда код запуска, результат ($ сс = 0) :

Insert bookpicturemappings.csv successful! Total: 1862 - Import: 0 - Error: 0

  • Когда я добавляю var_dump() funti на:
if ($command->execute()){ 
     $ss++; 
} 
var_dump($ss); 

результат ($ сс = 1862):

<...value dump....>

Insert bookpicturemappings.csv successful! Total: 1862 - Import: 1862 - Error: 0

WT ...? Я не понимаю, почему?

+0

Попробуйте добавить ERRMODE_EXCEPTION (http://php.net/manual/en/pdo.setattribute.php) и показать нам результат, вероятно, ваш запрос PDO не работает корректно. – stepozer

ответ

0

Проверьте свой последний элемент в $ handles, я предполагаю, что он пуст (новая строка в конце файла?) И $ ss устанавливается в 0, но не работает.

редактировать

Ваша последняя итерация является ложным, но условие проверяется только после выполнения блока.

Try угробить делать и использовать время, как это:

while ($data = fgetcsv($handle,0,",","\"")){ 
    if (isset($data[0])) { 
     if($i > 0){ 
      $sql="INSERT INTO bookpicturemappings (Id, BookId, PictureId, bookpicturemappings.Order) VALUES (:Id, :BookId, :PictureId, :bookOrder)"; 
      $command = $db->prepare($sql); 
      $command->bindParam(":Id",$data[0],PDO::PARAM_STR); 
      $command->bindParam(":BookId",$data[1],PDO::PARAM_STR); 
      $command->bindParam(":PictureId",$data[2],PDO::PARAM_STR); 
      $command->bindParam(":bookOrder",$data[3],PDO::PARAM_STR); 
      if ($command->execute()){ 
       $ss++; 
      } 
     } 
     $i++; 
    } 
}; 
+0

Последний элемент не пуст, и я эхо $ ss в элементе. –

+0

Выполняется ли ваш последний $ handle? –

+0

Проверьте http://php.net/manual/en/control-structures.do.while.php, он говорит: кроме выражения истинности проверяется в конце каждой итерации, а не в начале. Попробуйте некоторое время без «сделать». –