Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Zander_driver
0 / 0 / 1
Регистрация: 11.10.2017
Сообщений: 27
1

Не одинаковое поведение БД на разных локальных серверах

26.12.2017, 09:55. Просмотров 256. Ответов 2
Метки нет (Все метки)

Приветствую.
Собственно мои условия: проект разрабатываю на php, код хранится в репозитории на bitbucket, локальные папки связанные с репозиторием, находятся на двух компах. На обоих эта папка - одна из папок доменов OpenServer. Используется Mysqli.
Работаю с проектом поочередно то на одном компе, то на другом. При завершении работы каждый раз делаю экспорт БД в файл, и закидываю этот файл в коммит репозитория.
В БД есть таблица, в ней поле id. Экспорт этого дела выглядит вот так:
SQL
1
2
3
4
DROP TABLE IF EXISTS `tb_match`;
CREATE TABLE IF NOT EXISTS `tb_match` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
бла-бла дальше
В php-скрипте нужно добавляя новые записи в эту таблицу, знать в какой id идет запись.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function Get_new_ID() {
// возвращает ид для нового объекта 
    global $db_host, $db_user, $db_password, $database, $mysqlix;
    $mysqlix = new mysqli($db_host,$db_user,$db_password,$database);
        if ($mysqlix->connect_errno) {
        printf("Не удалось установить соединение с базой данных: %s/n", $mysqlix->connect_error);
        return false; 
        exit();
        }
    $dbt = 'tb_match'; 
    $queryx  = $mysqlix->query("SELECT auto_increment FROM information_schema.tables WHERE table_name='".$dbt."'");
    $next_id;
    foreach($queryx as $kkey => $vvalue) { // извлечение выглядит несколько коряво, но раньше работало...
        if (gettype($vvalue) == "array") {
            $next_id = $vvalue['auto_increment'];
        }
    }
    $queryx->free();
    $mysqlix->close();
    //msg_to_log(3, 99, 0, 'call Get_new_ID; return:'.$next_id); // так я выяснял, что она у меня возвращает.
    // почему то сбоит генератор ид, выдавая уже существующие значения.
    return $next_id;
}
Ну и теперь барабанная дробь... функция Get_new_ID выдает разные результаты на разных компах, при идентичных файлах кода и идентичном состоянии таблицы tb_match в БД.
В значениях ид в таблице есть пропуск, там сплошная нумерация с 1 по 150 индекс, потом следующая запись имеет индекс 220 и далее по порядку записи идут до 280 примерно.
На одном компе скрипт работает нормально - Get_new_ID возвращает первый свободный индекс ПОСЛЕ пропуска, т.е. 280 с мелочью, и при каждом следующем вызове (после создания новой записи в таблице) возвращает новое значение, на 1 больше чем предыдущее.
На другом компе, эта же функция обращает внимание что в таблице БД есть пропуск индексов, и... возвращает значение 150. т.е. индекс который в таблице уже есть! скрипт думая что создает новую запись, запихивает новые данные в 150-ю запись на место уже существующих данных, вызывает Get_new_ID снова, и она опять возвращает 150. В итоге вместо создания нескольких новых записей, получается переписывание несколько раз одной и той же записи которая существовала до этого.
Напомню, файлы кода идентичны, состояние таблицы к которой обращаемся, (и БД в которой она находится) - тоже идентично.
Вопрос - какая может быть причина для такого поведения?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2017, 09:55
Ответы с готовыми решениями:

Конфликт PHP-кода на двух разных ОС и локальных серверах при создании сайта
Использовал сборку на Windows OpenServer и на OS X использовал MAMP. Такое...

Поведение функции Random на разных серверах, платформах, и прочих
Всем доброго дня! Вопрос. Поведение функции Random может зависеть от того...

Как связать две разные страницы на локальных серверах?
То есть я имею ввиду: мы же делаем сайты сохраняя в виде html файлов, так как...

Cookies на разных серверах
Прочитал, что куки записываются на жесткий диск и 'активизируются' при запросе...

Запуск ASP на разных серверах
На контроллере домена в ASP выполняется скрипт по созданию пользователя. В ходе...

2
Phantom-84
270 / 225 / 62
Регистрация: 15.09.2017
Сообщений: 1,083
26.12.2017, 12:07 2
Сравните типы баз данных и значения AUTO_INCREMENT для таблиц.
0
otto-fukin
-54 / 59 / 21
Регистрация: 15.06.2017
Сообщений: 572
26.12.2017, 12:36 3
Не старайтесь быть умнее сервера бд. Выкиньте эту вредную функцию которая будет создавать только проблемы. Для получения очередного id люди используют last_insert_id конкретная функция зависит от драйвера с которым вы подключаетесь. Для mysqli это вроде просто свойство insert_id. Иначе будете постоянно огребать подобные 'неодинаковые поведения'
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2017, 12:36

Виртуальные поддомены на разных серверах
Приветствую! На сервере есть виртуальные поддомены <VirtualHost *:80> ...

3 сайта на разных серверах объединить в один
Добрый день! Есть такая "хотелка" у меня, разъясните пожалуйста возможно или...

Нестыковка отображения переменных на разных серверах
Доброго времени суток. Проблема следующего плана. Сервер в автоматическом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru