Локально при использовании OpenServer - Всё работает, обрабатывает большие пакеты
На хостинге тоже всё обрабатывает без проблем
в связке с Ubuntu server 17 + MySQL 5.7.2
При обработке маленьких пакетов с данными всё нормально, до 215 записей, но если я обрабатываю свыше 215, то в базу данных попадает 215. Менял конфигурацию MySQL по разному. Не могу победить, не могу разобраться в чем дело. Подскажите, направьте. Заранее благодарен.
Структура таблицы MySQL
CREATE TABLE IF NOT EXISTS $table_name (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Идентификатор',
guid VARCHAR(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Уникальный идентификатор',
date_in DATETIME COMMENT 'Дата создания',
date_up DATETIME COMMENT 'Дата изменения',
name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'Наименование',
description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Описание',
vin_code VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'VIN код транспортного средства',
government_number VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Государственный номер',
device_type VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Тип прибора',
device_number INT(11) NULL COMMENT 'Номер прибора глонасс',
device_id VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Идентификатор прибора глонасс',
application_key VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Ключ приложения',
processing INT(1) NOT NULL DEFAULT '0' COMMENT 'Обрабатывать данные'
)
ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_general_ci COMMENT = 'Транспортные средства'
Часть функций PHP
# Дополнительны функции
# Обрабатываем результат из внешнего источника
# Параметры:
# $table_name - Имя таблицы
# $array - Массив данных
#
function process_data_from_an_external_source($table_name, $array) {
# Создаём экземпляр класса
$db = new DataBase();
if ($table_name == 'means_of_transport') {
foreach ($array as $value) {
$options = array();
$options['guid'] = $value['guid'];
handle_the_value_of_an_array_key($table_name, $value, $options, $db);
# sleep(1);
}
}
}
# Обрабатываем значение ключа массива
# Параметры:
# $table_name - Имя таблицы
# $column - Массив колонок
# $options - Массив условий для обновления записи
# $db - Экземпляр класса для работы с базой данных
#
function handle_the_value_of_an_array_key($table_name, $column, $options, $db) {
# Формируем параметры запроса
// $query_condition_array = array();
// $query_parameters = array();
// $query_options = array();
// foreach ($options as $key => $value) {
// $query_condition_array[] = $key. ' = {?}';
// $query_parameters[] = $value;
// $query_options[] = $key . " = '$value'";
// }
# Формируем строку условий
// $query_condition = 'WHERE ' . implode(' AND ', $query_condition_array);
# Обрабатываем БД
// $query = "SELECT * FROM $table_name $query_condition";
// $table = $db->select($query, $query_parameters);
// if ($table) {
// $db = new DataBase();
// $column['date_up'] = 'NOW()';
// $db->update($table_name, $column, $query_options);
// } else {
// $db = new DataBase();
$column['date_in'] = 'NOW()';
$column['date_up'] = 'NOW()';
# Вставляем запись
$db->insert($table_name, $column);
// }
}
т.е. не всегда вставляю новую запись, при получении проверяю и модернизирую, по этому входящий запрос обрабатываю циклом
Огромное спасибо за на правление teran
Изменена таблица SQL
$query = "CREATE TABLE IF NOT EXISTS $table_name
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Идентификатор',
guid VARCHAR(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL UNIQUE KEY COMMENT 'Уникальный идентификатор',
date_in DATETIME COMMENT 'Дата создания',
date_up DATETIME COMMENT 'Дата изменения',
name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'Наименование',
description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Описание',
vin_code VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'VIN код транспортного средства',
government_number VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Государственный номер',
device_type VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Тип прибора',
device_number INT(11) NULL COMMENT 'Номер прибора глонасс',
device_id VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Идентификатор прибора глонасс',
application_key VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Ключ приложения',
processing INT(1) NOT NULL DEFAULT '0' COMMENT 'Обрабатывать данные')
ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_general_ci COMMENT = 'Транспортные средства'";
Основная функция вызова
# Обрабатываем результат из внешнего источника
# Параметры:
# $table_name - Имя таблицы
# $array - Массив данных
#
function process_data_from_an_external_source($table_name, $array) {
# Создаём экземпляр класса
$db = new DataBase();
# Дополнительные поля со значениями
$additional_columns = array();
$additional_columns['date_in'] = 'NOW()';
$additional_columns['date_up'] = 'NOW()';
# Условия для обновления
$options = array();
array_push($options, 'guid');
$db->upgrade($table_name, $array, $additional_columns, $options);
}
Функция из класса
# INSERT & UPDATE метод обработки данных из массива
public function upgrade($table_name, $column, $additional_columns = false, $options = false) {
$column_keys = array();
# Перебираем массив основных полей по ключу
foreach ($column[0] as $key => $value) {
array_push($column_keys, $key);
}
# Перебираем массив дополнительных полей по ключу
if ($additional_columns) {
foreach ($additional_columns as $key => $value) {
array_push($column_keys, $key);
}
}
# Начало формирования запроса
$query = "INSERT INTO $table_name (". implode(", ", $column_keys) .") VALUES ";
$query_values = array();
# Перебираем основной массив и изрекаем значение ключей
foreach ($column as $data) {
$item = array();
foreach ($data as $key => $value) {
if (gettype($value) == 'integer') {
array_push($item, $value);
} else {
array_push($item, "'$value'");
}
}
# Если есть дополнительные поля
if ($additional_columns) {
foreach ($additional_columns as $key => $value) {
if (gettype($value) == 'integer' || $value = 'NOW()') {
array_push($item, $value);
} else {
array_push($item, "'$value'");
}
}
}
$result = implode(',', $item);
array_push($query_values, "($result)");
}
# Добавляем к запросу
$query .= implode(',', $query_values);
# Если есть условие
if ($options) {
# Добавляем к запросу
$query .= ' ON DUPLICATE KEY UPDATE ';
$duplicate_key = array();
# Перебираем массив с значениями имен полей
foreach ($options as $key => $value) {
array_push($duplicate_key, "$value = VALUES($value)");
}
# Добавляем к запросу
$query .= implode(',', $duplicate_key);
}
# Выполняем сформированный запрос
$success = $this->mysqli->query($query);
# Возвращаем результат
return $success;
}
Но есть момент, при первом выполнении запроса, всё отлично, если я удаляю несколько записей - они снова добавляются. но поле с AUTO_INCREMENT PRIMARY KEY увеличивается ровно на число обрабатываемой порции, т.е. последняя запись была 788, удалил 10, снова выполняю запрос, поле с id становится 15хх.
Как в таком случаи быть?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Для построения графика мне необходимо по Х выстроить месяца с годамиНа примере <?php echo date( "m
Доброго времени сутокИмеется массив переданный на страницу как $_POST['ch'], в котором храниться неизвестное количество чисел (id checkbox'ов)
Как вывести в шаблоне несколько цен, прибавлением процента