Перейти к содержимому


Автозаполнение связанных полей


Сообщений в теме: 7

#1 Intro

    Участник

  • Пользователи
  • PipPip
  • 26 сообщений

Отправлено 21 Октябрь 2015 - 08:49

Добрый день.
Подскажите, при импорте данных, добавил вычисление на заполнение связанных полей.
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."42 WHERE `status` = 0 AND `f4890` = ".addslashes($line['Код организации'])." LIMIT 1";
$result = sql_query($sqlQuery);
$select = sql_fetch_assoc($result);
$line['Организация'] = $select['id'];
Однако получаю ошибку
Ошибка SQL запроса:
SELECT `id` FROM cb_data42 WHERE `status` = 0 AND `f4890` = LIMIT 1

Честно говоря не совсем пойму, в чем она заключается. На мой взгляд все правильно.


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Октябрь 2015 - 09:18

Ошибка вполне очевидная - в поле $line['Код организации'] пусто, поэтому в строку запроса подставляется пустота, что в свою очередь приводит к ошибке синтаксиса SQL запроса. Решение: если поле `f4890` строковое, то подставляемое значение должно обрамляться кавычками, в этом случае в запросе будет нормальное равенство с пустой строкой: `f4890` = ''

$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."42 WHERE `status` = 0 AND `f4890` = '".addslashes($line['Код организации'])."' LIMIT 1";

Если же поле f4890 числовое, то кавычки не обязательны, но нужно приводить подставляемое значение к числу:

$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."42 WHERE `status` = 0 AND `f4890` = ".intval($line['Код организации'])." LIMIT 1";


#3 Intro

    Участник

  • Пользователи
  • PipPip
  • 26 сообщений

Отправлено 21 Октябрь 2015 - 10:37

Запрос проходит без ошибок, но и результата нет. Поле не заполняется значениями.

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Октябрь 2015 - 13:14

Раз не заполняется, значит в переменной $line['Код организации'] ничего нет. Либо там на самом деле везде пусто, либо вы ошиблись с именем поля.

Хотя, это лишь один из вариантов, на основании вашего первого сообщения. Запрос может сам по себе ничего не возвращать, потому что составлен некорректно с точки зрения логики. А чтобы это понять, нужно описание вашей логики, исходя из которой вы его составляли, например что за поля в нем участвуют, какого они типа, и что вообще хотелось получить этим запросом.

#5 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Октябрь 2015 - 13:24

Кстати, по первому варианту. Даже если вам кажется что имя поля правильное, вы могли опечаться. В этом случае вместо имени поля лучше поставить в вычисление его БД-имя, т.е. fXXX. После сохранения вычисления его окно нужно обновить, в случае корректного заполнения, имя автоматом заменится на обычное. Если все нормально, см. второй вариант ошибки. В остальном вроде все правильно выглядит.

#6 Intro

    Участник

  • Пользователи
  • PipPip
  • 26 сообщений

Отправлено 22 Октябрь 2015 - 08:01

Опечатки не было, были лишние поля связи.
Вопрос такой: я буду подтягивать данные при импорте из разных таблиц, лучше это оформить в одном вычислении. или же разными?

#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Октябрь 2015 - 09:25

Принципиальной разницы нет.

#8 Intro

    Участник

  • Пользователи
  • PipPip
  • 26 сообщений

Отправлено 22 Октябрь 2015 - 14:30

Возникла необходимость скопировать данные таблицы вместе с ID, т.к. на этом ID завязано еще 4 таблицы.
У меня проблема возникла при копировании старых ID. Постоянно получаю

[size=4]
Error generated:[/size][size=4]
/var/www/clientbase/include/functions_cron.php(4733) : data_insert()[/size][size=4]
/var/www/clientbase/import.php(131) : import_data()[/size][size=4][b]
[size=4]Ошибка SQL запроса:[/size][size=4]
INSERT INTO cb_data340 (user_id, add_time) VALUES ('', '2015-10-22 14:29:02')[/size][size=4]
Duplicate entry '46' for key 'PRIMARY'[/size][/b][/size]
Не пойму почему так происходит. Таблица новая пустая. ID я тоже присваиваю при импорте.
Как вариант вижу проблему в том что импортируемые данные не отсортированы по этому самому ID. Соответственно, при создании новой записи применяется новое значение и происходит конфликт.
Возможно ли вместо Insert использовать replace для замены в том числе и Primary key.

Сообщение отредактировал Intro: 22 Октябрь 2015 - 15:36






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных