Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Проблема при вставке данных в твблицу с помощью PDO
Форумы портала PHP.SU » » Работа с СУБД » Проблема при вставке данных в твблицу с помощью PDO

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

1. romants - 11 Февраля, 2016 - 15:53:58 - перейти к сообщению
Исходные данные.
Имеется БД (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).

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

С чем может быть связана указанная проблема и как ее исправить?
Заранее благодарю за помощь.
2. Мелкий - 11 Февраля, 2016 - 16:47:48 - перейти к сообщению
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 и ошибок тогда не будет видно.
3. romants - 12 Февраля, 2016 - 11:11:09 - перейти к сообщению
Мелкий пишет:
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 было в индексе и по этому не уникальное значение не вставлялось.

 

Powered by ExBB FM 1.0 RC1