PDO::exec return?

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
leonidps
Сообщения: 268
Зарегистрирован: 2011.01.18, 19:40
Откуда: Псков

PDO::exec return?

Сообщение leonidps »

Документация:

Код: Выделить всё

PDO::exec — Запускает SQL запрос на выполнение и возвращает количество строк, задействованных в ходе его выполнения
Yii::@app->db эту задачу выполняет как и ожидалось.
Теперь пробую вне проекта записать результат в лог.

Код: Выделить всё

echo 'affected rows: ', $db->exec(); 
Получаю совсем не то: если записи добавлены - возвращает: 0, если ни одной записи не добавлено: 1.
как правильно настроить экземпляр PDO?
php -v
PHP 5.5.9-1ubuntu4.14
Тип сервера: MySQL
Версия сервера: 5.5.47-0ubuntu0.14.04.1 - (Ubuntu)
Правила существуют не только для того, чтобы их нарушать.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: PDO::exec return?

Сообщение zelenin »

что такое $db и почему нельзя сразу это написать?
и вообще, дайте код, если обвиняете метод в некорректной работе.
Очевидно, что по $db->exec() нагадать в чем вы не правы, не представляется возможным.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: PDO::exec return?

Сообщение lynicidn »

это кажись уии1?
Аватара пользователя
leonidps
Сообщения: 268
Зарегистрирован: 2011.01.18, 19:40
Откуда: Псков

Re: PDO::exec return?

Сообщение leonidps »

zelenin писал(а):что такое $db и почему нельзя сразу это написать?
и вообще, дайте код, если обвиняете метод в некорректной работе.
Очевидно, что по $db->exec() нагадать в чем вы не правы, не представляется возможным.
Я не обвиняю метод в некорректной работе. Пытаюсь разобраться что я не так сделал.
Даю кусок кода. Класс предназначен для разбора файла с разделителями директории общего доступа на удаленной рабочей машине Win7 и добавления соответствующего количества записей в MySql. После обработки файл удаляется.
Запуск по крону каждый час.
Результат: файлы разбираются и записи корректно добавляются в базу. Можно считать задачу выполненной. Теперь (если забить на количество записей - их может быть 50-1000) результат можно записать в лог файл. Однако разобраться=?.

Код: Выделить всё

    private $cnn;
    public function __construct() {
        $this->cnn = new PDO($this->dsn, $this->user, $this->passwd);
        $this->createTable();
    }
    public function weelFiles() {
        foreach ($files=scandir($this->dirName) as $file) {
            if (preg_match('[^P.......\.csv$]', $file)===1) {
                echo 'affected rows: '.$this->insertFile($this->dirName.$file)."\n";
                if (unlink($this->dirName.$file)===TRUE) {
                    echo "the file ", $this->dirName.$file, ' has been deleted', "\n";
                }
//                break;
            }
        }
    }
    private function insertFile($file) {
        $sql=<<<SQL
        USE `liftbase`;
        INSERT IGNORE INTO `$this->tableName` (
            `event_id`
            , `event_date`
            , `pult_id`
            , `event_code`
            , `event_name`
            , `bite_signs`
            , `lift_guid`
            , `saved_state`
            , `bite_number`
            , `table_number`
            , `service_key`
            , `lift_id`
        ) VALUES  
SQL;
        foreach (file($file) as $f) {
            $item=$this->normalizeFile($f);
            $sql.="(";
            for ($i = 0; $i<=11; $i++) {
                $sql.="'{$item[$i]}',";
            }
            $sql=substr_replace($sql, '),', -1, 1);
//            break;
        }
        $sql=substr_replace($sql, ';', -1, 1);
        return $this->cnn->exec($sql);
    }
    private function normalizeFile($item) {
        $item=split(';', $item);
        $item[1]=date('Y-m-d', strtotime($item[1]));
        $item[1]="$item[1] $item[2]";
        $item[2]=$this->pultId;
        $item[4]=mb_convert_encoding($item[4], 'UTF-8', 'CP1251');
        return $item;
    }
 
Правила существуют не только для того, чтобы их нарушать.
Аватара пользователя
leonidps
Сообщения: 268
Зарегистрирован: 2011.01.18, 19:40
Откуда: Псков

Re: PDO::exec return?

Сообщение leonidps »

Нашел. Так не считает записи

Код: Выделить всё

        $sql=<<<SQL
        USE `liftbase`;
        INSERT IGNORE INTO `$this->tableName` (
            `event_id`
            , `event_date`
            , `pult_id`
            , `event_code`
            , `event_name`
            , `bite_signs`
            , `lift_guid`
            , `saved_state`
            , `bite_number`
            , `table_number`
            , `service_key`
            , `lift_id`
        ) VALUES  
SQL;
Вот так надо

Код: Выделить всё

        $sql=<<<SQL
        INSERT IGNORE INTO `liftbase`.`$this->tableName` (
            `event_id`
            , `event_date`
            , `pult_id`
            , `event_code`
            , `event_name`
            , `bite_signs`
            , `lift_guid`
            , `saved_state`
            , `bite_number`
            , `table_number`
            , `service_key`
            , `lift_id`
        ) VALUES  
SQL;
:lol: Не решайте проблем в пятницу вечером. Дождитесь утра понедельника.
Правила существуют не только для того, чтобы их нарушать.
Ответить