Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В базу не сохраняются изменения / 6 сообщений из 6, страница 1 из 1
25.01.2022, 15:58
    #40129321
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В базу не сохраняются изменения
Есть PHP-скрипт, который должен вносить изменения в БД MySQL.
Версия СУБД MariaDB 10.
Скрипт пишет подробные логи и по логам выходит, что все выполняется успешно, ошибок нет.
Но и в базе данных нет добавленной записи.

Скрипт выполняет такой запрос:
Код: sql
1.
2.
3.
4.
INSERT INTO `tbl_global_port`
  (`TYPER`, `EQUIPCODE`, `STORONA`, `PORT`, `TYPER2`, `EQUIPCODE2`, `STORONA2`, `PORT2`, `DOPDATA`)
VALUES
  (3, :node, 0, :port, 1, :user, 0, 0, null)



В скрипт с помощью bind_param передаются параметры:
Код: plaintext
1.
2.
3.
4.
5.
2022-01-25 15:49:27: [mylibs\DB\mysql::query] >>SQL binding // {"mode":"name"}
2022-01-25 15:49:27: [mylibs\DB\mysql::query] >>SQL bind // {":node":699}
2022-01-25 15:49:27: [mylibs\DB\mysql::query] >>SQL bind // {":port":"14"}
2022-01-25 15:49:27: [mylibs\DB\mysql::query] >>SQL bind // {":user":5930741}
2022-01-25 15:49:27: [mylibs\DB\mysql::query] >>SQL binded // ["isi",699,"14",5930741]

Затем скрипт выполняется.
Код возврата успешный, в mysqli_insert_id возвращается идентификатор добавленной записи:
Код: plaintext
1.
2.
2022-01-25 15:49:27: [mylibs\DB\mysql::query] >>Query ok // {"rows":1,"cols":null}
2022-01-25 15:49:27: [mylibs\DB\mysql::exec] >Exec ok // {"rows":1,"last_id":20844}

Но в итоге в таблице нужной записи нет, запрос select * from tbl_global_port where code=20844 возвращает пустой результат.
В чем может быть причина?

Фрагменты исходников под спойлером.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
...
                if (isset($ptype))
                {
                        $this->logger_dbg('SQL binding', ['mode'=>$ptype], __METHOD__);
                        $p = [''];
                        foreach ($plist as $i=>$v)
                        {
                                $arg = null;
                                if ($ptype == 'index') {
                                        if ($v <= count($params)) $arg = &$params[$v-1];
                                } else {
                                        if (array_key_exists($v, $params)) $arg = &$params[$v];
                                }
                                if (!isset($arg)) {
                                        $p[0] .= 's'; $p[] = null;
                                } elseif (is_string($arg)) {
                                        $p[0] .= 's'; $p[] = &$arg;
                                } elseif (is_int($arg)) {
                                        $p[0] .= 'i'; $p[] = &$arg;
                                } elseif (is_float($arg)) {
                                        $p[0] .= 'd'; $p[] = &$arg;
                                } else {
                                        $p[0] .= 's'; $p[] = &$arg;
                                }
                                $this->logger_dbg('SQL bind', [$v=>$arg], __METHOD__);
                                unset($arg);
                        }
                        $rc = call_user_func_array(array($sth, 'bind_param'), $p);
                        if (!$rc)
                        {
                                $this->_error(true);
                                $this->logger_err('SQL binding failed', $p, __METHOD__);
                                $this->logger_dbg('SQL binding failed', $p, __METHOD__);
                                return;
                        }
                        $this->logger_dbg('SQL binded', $p, __METHOD__);
                }
...
                $this->logger_info('DB exec', $sql, __METHOD__);
                $sth = $this->query($sql, $params, $meta);
                if (!$sth) return;
                mysqli_stmt_close($sth);
                $this->logger_dbg('Exec ok', ['rows'=>$meta['rows'], 'last_id'=>mysqli_insert_id($this->store['dbh'])], __METHOD__);
                return $meta['rows'];
...

...
Рейтинг: 0 / 0
25.01.2022, 16:18
    #40129327
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В базу не сохраняются изменения
Пробовал обернуть в транзакцию.
Если просто добавить после запроса commit, то получается ошибка (поскольку нет активной транзакции).
Если перед запросом выполнить begin_trans, то скрипт зависает на этой строке.
При этом таблицы innodb.
...
Рейтинг: 0 / 0
25.01.2022, 16:31
    #40129333
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В базу не сохраняются изменения
Вручную выполнил запрос:
Код: sql
1.
2.
3.
4.
5.
INSERT INTO `tbl_global_port`
  (`TYPER`, `EQUIPCODE`, `STORONA`, `PORT`, `TYPER2`, `EQUIPCODE2`, `STORONA2`, `PORT2`, `DOPDATA`)
VALUES
  (3, 699, 0, 14, 1, 5930741, 0, 0, null)
  


Так все сохранилось.
...
Рейтинг: 0 / 0
25.01.2022, 21:28
    #40129427
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В базу не сохраняются изменения
Воспроизводимый пример.

Таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE `t1` (
	`CODE` INT(11) NOT NULL AUTO_INCREMENT,
	`TYPER` INT(3) NULL DEFAULT NULL,
	`EQUIPCODE` INT(11) NULL DEFAULT NULL,
	`STORONA` INT(1) NULL DEFAULT NULL,
	`PORT` INT(11) NULL DEFAULT NULL,
	`TYPER2` INT(3) NULL DEFAULT NULL,
	`EQUIPCODE2` INT(11) NULL DEFAULT NULL,
	`STORONA2` INT(1) NULL DEFAULT NULL,
	`PORT2` INT(11) NULL DEFAULT NULL,
	`DOPDATA` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	`X1` INT(11) NULL DEFAULT NULL,
	`Y1` INT(11) NULL DEFAULT NULL,
	`COORD` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	`COLOR` VARCHAR(6) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	`DATEADD` DATETIME NULL DEFAULT '1970-01-01 00:00:00',
	PRIMARY KEY (`CODE`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;



Скрипт:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
$us = ...
$dbh = $us->dbh();
print_r(['dbh'=>$dbh]);
$sql = "INSERT INTO `t1` (`TYPER`, `EQUIPCODE`, `STORONA`, `PORT`, `TYPER2`, `EQUIPCODE2`, `STORONA2`, `PORT2`, `DOPDATA`) VALUES (3, ?, 0, ?, 1, ?, 0, 0, null)";
$arg = [':user'=>1, ':node'=>2, ':port'=>3];
$sth = mysqli_prepare($dbh, $sql);
print_r(['dbh'=>$dbh, 'sth'=>$sth]);
mysqli_stmt_bind_param($sth, 'iii', $arg[':user'], $arg[':node'], $arg[':port']);
$rc = mysqli_stmt_execute($sth);
$id = mysqli_insert_id($dbh);
print_r(['sql'=>$sql, 'arg'=>$arg, 'rc'=>$rc, 'id'=>$id]);



Вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
Array
(
    [dbh] => mysqli Object
        (
            [affected_rows] => 0
            [client_info] => 5.5.60
            [client_version] => 50560
            [connect_errno] => 0
            [connect_error] => 
            [errno] => 0
            [error] => 
            [error_list] => Array
                (
                )

            [field_count] => 0
            [host_info] => 10.1.128.12 via TCP/IP
            [info] => 
            [insert_id] => 0
            [server_info] => 5.5.5-10.0.38-MariaDB-0+deb8u1
            [server_version] => 50505
            [sqlstate] => 00000
            [protocol_version] => 10
            [thread_id] => 3241974
            [warning_count] => 0
        )

)
Array
(
    [dbh] => mysqli Object
        (
            [affected_rows] => -1
            [client_info] => 5.5.60
            [client_version] => 50560
            [connect_errno] => 0
            [connect_error] => 
            [errno] => 0
            [error] => 
            [error_list] => Array
                (
                )

            [field_count] => 0
            [host_info] => 10.1.128.12 via TCP/IP
            [info] => 
            [insert_id] => 0
            [server_info] => 5.5.5-10.0.38-MariaDB-0+deb8u1
            [server_version] => 50505
            [sqlstate] => 00000
            [protocol_version] => 10
            [thread_id] => 3241974
            [warning_count] => 0
        )

    [sth] => mysqli_stmt Object
        (
            [affected_rows] => 0
            [insert_id] => 0
            [num_rows] => 0
            [param_count] => 3
            [field_count] => 0
            [errno] => 0
            [error] => 
            [error_list] => Array
                (
                )

            [sqlstate] => 00000
            [id] => 1
        )

)
Array
(
    [sql] => INSERT INTO `t1` (`TYPER`, `EQUIPCODE`, `STORONA`, `PORT`, `TYPER2`, `EQUIPCODE2`, `STORONA2`, `PORT2`, `DOPDATA`) VALUES (3, ?, 0, ?, 1, ?, 0, 0, null)
    [arg] => Array
        (
            [:user] => 1
            [:node] => 2
            [:port] => 3
        )

    [rc] => 1
    [id] => 7
)

Но при этом в таблице t1 - пусто.
Не могу понять причину.

Даже так:
Код: php
1.
2.
list($a1,$a2,$a3) = [1,2,3];
mysqli_stmt_bind_param($sth, 'iii', $a1, $a2, $a3);


все равно пусто.
...
Рейтинг: 0 / 0
25.01.2022, 21:44
    #40129431
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В базу не сохраняются изменения
Вроде бы нашел причину.
У меня старая версия PHP (5.4) в ней mysqli несколько отличается от документации.
Во-первых, по умолчанию транзакции не применяются (выключен autocommit).
Во-вторых, commit принимает только один параметр, а в моей обертке в него передается три параметра (третьим параметром указывалось имя транзакции). Метод не срабатывал, а ошибка в логи не попадала.
...
Рейтинг: 0 / 0
25.01.2022, 22:08
    #40129433
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В базу не сохраняются изменения
Alibek B.,

Я просто оставлю это здесь - https://prnt.sc/26j8yz1
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В базу не сохраняются изменения / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]