@scotch18
Middle PHP Developer

Почему возникает ошибка при создании столбцов?

У меня есть парсер XML-документов, который создает массив всех данных. Этот массив передаю в функцию ниже и на выходе получаю запрос к sql, который позже отправляю и отдельным запросом отправляю данные в таблицу. Иногда столбцы не создаются, но при повторе загрузки того же файла столбцы создаются и данные успешно загружаются. Почему может возникать данная ошибка, если сам запрос не меняется? Возможно как-то можно обезопасить себя от потери данных?

public function createQuery($array, $table){
        $query ="
        use database_name;

        DROP PROCEDURE IF EXISTS addColumn;
        CREATE PROCEDURE addColumn()
        BEGIN";

        foreach($array as $key => $value){
            $query .= "
            IF NOT EXISTS (
                  SELECT *
                  FROM information_schema.COLUMNS
                  WHERE COLUMN_NAME = '" . $key ."'
                  AND TABLE_NAME = '". $table ."'
                  AND TABLE_SCHEMA = DATABASE()
                  ) THEN
                  ALTER TABLE `".$table."`
                ADD COLUMN `" . $key ."` TEXT NULL DEFAULT null;
             END IF;";
        }
        $query .= "
        END;
        
        CALL addColumn;
        DROP PROCEDURE addColumn;";

        return $query;
    }
  • Вопрос задан
  • 46 просмотров
Пригласить эксперта
Ответы на вопрос 1
@aleksmir
Системный администратор, программист
PHP не виноват. Тут больше вопрос к СУБД. При создании-удалении процедуры происходит какой-то сбой на стороне БД.

Можете попробовать убрать создание процедуры, оставить только создание столбцов:

<?php

public function createQuery($array, $table)
	{
		$query = 'use database_name; ';
		foreach($array as $key => $value){
			$query.= "
				IF NOT EXISTS (
				SELECT *
				FROM information_schema.COLUMNS
				WHERE COLUMN_NAME = '".$key."'
				AND TABLE_NAME = '".$table."'
				AND TABLE_SCHEMA = DATABASE()
				) THEN
				ALTER TABLE `".$table."`
				ADD COLUMN `" .$key."` TEXT NULL DEFAULT null;
				END IF;";
			}
		return $query;
	}

?>


Но результат будет зависеть от возможностей вашей СУБД.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы