За последние 24 часа нас посетили 7455 программистов и 755 роботов. Сейчас ищут 296 программистов ...

INSERT → SELECT

Тема в разделе "PHP и базы данных", создана пользователем podenik, 19 июл 2021 в 15:19.

  1. podenik

    podenik Активный пользователь

    С нами с:
    29 май 2015
    Сообщения:
    5
    Симпатии:
    0
    День добрый.
    Нужна помощь.
    как правильно написать запрос на запись
    "INSERT INTO ddata VALUES (NULL,'$date', '$fio', '$tab')
    SELECT fio FROM user WHERE tab = '$tab'";
    что я не так пишу
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.516
    Симпатии:
    1.073
    Адрес:
    там-сям
    Если надо вставить то, что добывает select, значит здесь фраза values() лишняя. Если надо вставить конкретные перечисленные значения, то здесь лишний select. Определись уже.
    --- Добавлено ---
    Либо INSERT VALUES, либо INSERT SELECT
     
  3. podenik

    podenik Активный пользователь

    С нами с:
    29 май 2015
    Сообщения:
    5
    Симпатии:
    0
    Мне необходимо вставить новые данные в таблицу ddata, но пользователь ввел только 'tab' который находится в другой таблице, по этому 'tab' я должен определить имя 'fio' с таблицы 'user' и записать её (их) в таблицу ddata
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.099
    Симпатии:
    510
    Сначала нужно проверить корректность (существование) $tab отдельным запросом SELECT. Потом или INSERT... SELECT..., или просто INSERT с данными, полученными в результате первого запроса.
     
    podenik нравится это.
  5. podenik

    podenik Активный пользователь

    С нами с:
    29 май 2015
    Сообщения:
    5
    Симпатии:
    0
    спасибо огромное
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.516
    Симпатии:
    1.073
    Адрес:
    там-сям
    Подсказка: во фразе SELECT можно писать "константы", а не только данные из таблицы. Типа
    "INSERT ... SELECT NULL, user.fio, '$tab' FROM user ... WHERE ..."
    я сознательно не останавливаюсь на проблеме sql injection, надеюсь ты сам в курсе
    --- Добавлено ---

    Если SELECT найдёт несколько записей, подходящих под условие, то они добавятся все

    Если SELECT не найдёт запись, подходящую под условие, то не добавится ничего. Так что возможно, не надо отдельно ничего проверять - зависит от задачи.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.099
    Симпатии:
    510
    По-моему лучше перечислить имена «добавляемых полей» после имени таблицы в INSERT, чем писать SELECT NULL :)
     
  8. podenik

    podenik Активный пользователь

    С нами с:
    29 май 2015
    Сообщения:
    5
    Симпатии:
    0
    $result = $mysqli->query(
    "INSERT INTO ddata
    VALUES (NULL,'$date','$option1', '$option2', '$option3', '$option4',
    (SELECT fio FROM user WHERE tab = '$tab'),
    '$tab')"
    );

    that all
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.099
    Симпатии:
    510
    Для какого-нибудь колледжа, может, и сойдет. Для реальных применений вряд ли. NULL в fio мало кому интересно видеть.
    --- Добавлено ---
    И все же принято явно указывать имена «добавляемых полей», а то кто-то когда-то «случайно» поменяет порядок полей и наступит полный «that all» :)
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.516
    Симпатии:
    1.073
    Адрес:
    там-сям
    @miketomlin как-то звучит дико "добавляемых полей" :) в insert мы не можем добавлять поля, только записи. Поля можно добавить в alter table )))

    Хорошо бы в insert перечислить поля, куда будут записываться значения, это да. Если понадеяться на некий порядок, можно внезапно™ в этом месте получить ошибку в будущем. Типа работало и перестало. Самый стрёмный вид ошибок.

    Итого:
    Код (Text):
    1. INSERT INTO alfa(aj_nane, nane)
    2. SELECT beta.x, null FROM beta WHERE beta.y = :yyyyy
    А это другой вид прикопаных грабелек ))) Такая конструкция выдаст ошибку если вдруг WHERE tab = '$tab' будет соответствовать более чем одной записи.
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.099
    Симпатии:
    510
    @artoodetoo, специально взял в кавычки. Думал этого достаточно, чтобы все поняли, о чем речь. А речь именно об этом:
    --- Добавлено ---
    Не веришь, глянь на мой пред. пост, адресованный ТСу. Я там про эти «добавляемые поля» писал то же самое, что потом написал ты:
    --- Добавлено ---
    Согласен, что не самое вменяемое название. В первый раз воткнул и слово «значений», но тоже получилось как-то нескладно, поэтому решил взять в кавычки и не париться. Кому надо, поймут или переспросят :D