powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В базу не сохраняются изменения
6 сообщений из 6, страница 1 из 1
В базу не сохраняются изменения
    #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
В базу не сохраняются изменения
    #40129327
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал обернуть в транзакцию.
Если просто добавить после запроса commit, то получается ошибка (поскольку нет активной транзакции).
Если перед запросом выполнить begin_trans, то скрипт зависает на этой строке.
При этом таблицы innodb.
...
Рейтинг: 0 / 0
В базу не сохраняются изменения
    #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
В базу не сохраняются изменения
    #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
В базу не сохраняются изменения
    #40129431
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде бы нашел причину.
У меня старая версия PHP (5.4) в ней mysqli несколько отличается от документации.
Во-первых, по умолчанию транзакции не применяются (выключен autocommit).
Во-вторых, commit принимает только один параметр, а в моей обертке в него передается три параметра (третьим параметром указывалось имя транзакции). Метод не срабатывал, а ошибка в логи не попадала.
...
Рейтинг: 0 / 0
В базу не сохраняются изменения
    #40129433
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

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


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