PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Проблема при вставке данных в твблицу с помощью PDO
romants
Отправлено: 11 Февраля, 2016 - 15:53:58
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Февр. 2016  


Помог: 0 раз(а)




Исходные данные.
Имеется БД (InnoDB, utf-8).
В ней есть таблица со следующими полями:
- domain_id(bigint, unsigned, auto_increment, primary)
- user_id (bigint, UNSIGNED, index)
- domain (varchar(250), utf-8)
- unique_number (varchar(250), utf-8)
- unique_number_send (tinyint, unsigned)
- domain_analysed (tinyint, unsigned)
- report_send (tinyint, unsigned)

Код подключения к БД:
PHP:
скопировать код в буфер обмена
  1. $dsn = "mysql:host=".$host.";dbname=".$dataBaseName.";";
  2. $pdo = new PDO($dsn, $user, $password);
  3. $pdo->exec("set names utf8");
  4. $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);


Код запроса:
PHP:
скопировать код в буфер обмена
  1. $query = 'INSERT INTO domain values (?, ?, ?, ?, ?, ?, ?)';
  2. $prepareQuery = $pdoObject->prepare($query);
  3. $prepareQuery->execute(array(NULL, $userId,"$domainForInsert", "$uniqueSiteNumber", 0, 0, 0));


Типы переменных в execute:
$userId - integer
$domainForInsert - string
$uniqueSiteNumber - string

Проблема
Если сделать запрос с исходными данными, например:
PHP:
скопировать код в буфер обмена
  1. $userId = 22;
  2. $domainForInsert = 'yandex.ru';
  3. $uniqueSiteNumber = 'aaa111';

Вставка данных в БД проходит без проблем.

Если сразу после этого сделать еще один INSERT с входными данными:
PHP:
скопировать код в буфер обмена
  1. $userId = 23;
  2. $domainForInsert = 'yandex.ru';
  3. $uniqueSiteNumber = 'bbb222';

Вставка в БД не происходит.

При этом, если указать иное значение для $domainForInsert, вставка данных в БД проходит без проблем.

Проверял как на локальном серевере (Open Server), так и на vds сервере. Проблема есть и там и там.

Ошибок ни каких не выдается (при проставленных значениях вывода ошибок в момент подключения к БД + try/catch).

Типы данных, которые будут вставляться, перед вставкой проверяются и в итоге к моменту вставки в БД имею указанные типы.

С чем может быть связана указанная проблема и как ее исправить?
Заранее благодарю за помощь.

(Отредактировано автором: 11 Февраля, 2016 - 16:02:30)

 
 Top
Мелкий Супермодератор
Отправлено: 11 Февраля, 2016 - 16:47:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11603
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 567 раз(а)




romants пишет:
$pdo->exec("set names utf8");

Пользуясь случаем, так делать дважды неправильно.
charset надо указывать в dsn параметром charset
И второй момент, в mysql кодировка utf8 не является на самом деле UTF8, поддержка неполная, только 3 байта.
Нужно использовать utf8mb4, доступную с 5.5.(чего-то), вот она может обрабатывать весь юникод. В этом последнем четвёртом байте расположены ныне популярные пиктограммы emoji

Обратно к теме.
Укажите в коде явно PDO::ATTR_ERRMODE в PDO::ERRMODE_EXCEPTION. Дефолтно вполне может стоять даже ERRMODE_SILENT и ошибок тогда не будет видно.


-----
PostgreSQL DBA
 
 Top
romants
Отправлено: 12 Февраля, 2016 - 11:11:09
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Февр. 2016  


Помог: 0 раз(а)




Мелкий пишет:
romants пишет:
$pdo->exec("set names utf8");

Пользуясь случаем, так делать дважды неправильно.
charset надо указывать в dsn параметром charset
И второй момент, в mysql кодировка utf8 не является на самом деле UTF8, поддержка неполная, только 3 байта.
Нужно использовать utf8mb4, доступную с 5.5.(чего-то), вот она может обрабатывать весь юникод. В этом последнем четвёртом байте расположены ныне популярные пиктограммы emoji

Обратно к теме.
Укажите в коде явно PDO::ATTR_ERRMODE в PDO::ERRMODE_EXCEPTION. Дефолтно вполне может стоять даже ERRMODE_SILENT и ошибок тогда не будет видно.


Спасибо за помощь.

Установку кодировки вернул на правильное место (сделал как было в указанном коде, пытаясь исправить ошибку).
Базу перекодировал.
Ошибка PDO высветилась. В итоге оказалось что поле domain было в индексе и по этому не уникальное значение не вставлялось.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB