Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Добавление в таблицу сразу не сколько строк.


Автор: Igor_CH 5.6.2006, 16:59

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

делаю 
1. соединяюсь с базой
2. заполняю ячейки (их может быть сколько угодно)
Код

<input type="text" id="foto_1" name="foto_1">
<input type="text" id="foto_2" name="foto_2">
………

3. как записать каждую ячейку в свою строку в таблице.

Таблица из двух ячеек ID и FOTO.
 

Автор: skyboy 5.6.2006, 17:08
Код

INSERT INTO table(photo) VALUES(<photo1>),(<photo2>),(<photo3>)...

Где <photoX> - очередное фото. 

Автор: Igor_CH 5.6.2006, 17:20
Так записывается в одну строку в разные ячейки, а мне нужно чтоб запись была:
ID   PHOTO
1     1.jpg
2      me.jpg
3      sdfsg.jpg
.......


и опять таки не известно сколько будет фото. 

Автор: skyboy 5.6.2006, 17:28
одну строку в разные ячейки записывают так:
Код

INSERT INTO Table(field1,field2,field3,field4) VALUES(<value1>,<value2>,<value3>,<value4>)

Обрати внимание на количество перечисленных полей после "INTO Table" и количество скобок после "VALUES"
А то, что я предложил пост назад, как раз и записывает несколько строк.

Добавлено @ 17:29 
когда ты будешь формировать запрос, ты ведь будешь уже точно знать количество фотографий, потому тебе ничто не помешает формировать запрос в цикле. 

Автор: Igor_CH 5.6.2006, 17:41
Вот так я делаю:
Код

$foto_name_1 =$_POST["foto_1"];
$foto_name_2 =$_POST["foto_2"];
        
$text_1 =$_POST["text_1"];
$text_2 =$_POST["text_2"];

$sql_insert = "INSERT INTO photo (foto_name, text) VALUES  ( ($foto_name_1,$text_1), ($foto_name_2,$text_1) );";



Ошибка: Operand should contain 1 column(s) INSERT INTO photo (foto_name, text) VALUES ( ('1.jpg','text1'), ('2.jpg','text2') ); 

Автор: ASteel 5.6.2006, 17:50
А я бы сделал так:
Код

$foto_name_1 =$_POST["foto_1"];
$foto_name_2 =$_POST["foto_2"];
        
$text_1 =$_POST["text_1"];
$text_2 =$_POST["text_2"];

$sql_insert = "INSERT INTO photo (foto_name, text) VALUES ('$foto_name_1','$text_1'), ('$foto_name_2','$text_1')";


Обрати внимание на скобки! 

Автор: skyboy 5.6.2006, 17:51
Igor_CH, а зачем после "VALUES" ты ещё одними скобками оборачиваешь вводимые данные? 
Попробуй так:
Код

$sql_insert = "INSERT INTO photo (foto_name, text) VALUES  (".$foto_name_1.",".$text_1."), (".$foto_name_2.",".$text_1.");"
 

Автор: Igor_CH 5.6.2006, 18:03
Большое спасибо!!! Все работает smile 

Автор: Igor_CH 5.6.2006, 18:36
Продолжение начатого, чтоб не начинать новую тему. 
Подскажите как правильно сделать.

Есть форма, разобьем ее на две части:

1 часть -----------------
Название <input type=text name=nazvanie>
Описание <input type=text name=opisanie>

Данные записываются в таблицу KAT
Таблица “KAT” для этой части выглядит так:
ID  |  NAZVANIE  |  OPISANIE  |  DATA


2 часть ----------------
Фото 1     Описание для фото 1
Фото 2     Описание для фото 2
………………………………….
Фото N     Описание для фото N

Данные записываются в таблицу PHOTO
Таблица “PHOTO” для этой части выглядит так:
ID  |  FOTO  |  TEXT  |  ID_KAT (id с таблицы KAT)


Так вот как лучше получить (записать) ID_KAT? 
Получать последний auto_increment с таблицы PHOTO или записывать ID_KAT как дату с таблицы KAT.
 

Автор: skyboy 5.6.2006, 19:11
Не совсем понятно, что ты хочешь сделать. Хорошо, хоть структуру описал. А вообще-то, одна тема - один вопрос 

Автор: Serkys 5.6.2006, 22:25
Цитата(Igor_CH @  5.6.2006,  19:36 Найти цитируемый пост)
Получать последний auto_increment с таблицы PHOTO или записывать ID_KAT как дату с таблицы KAT.

Ни в коем случае! В перерывах между записью и вычерпыванием последнего авто_инкремента может быть добавлена ещё одна запись.
Вычерпывай, проставляя в where название, описание (желательно все сразу).
Код

mysql_query ("SELECT * FROM `KAT` WHERE `nazvanie` = '" . $nazvanie . "' AND `opisanie` = '" . $opisanie . "'");


З.Ы. Твои переменные выговаривать - пальцы сломаешь! smile  

Автор: skyboy 5.6.2006, 22:44
Serkys, может, мне показалось, но мне функия last_insert_id() возвращает автоинкремент вставленный именно мной(как сессией подключения). Может, показалось? 

Автор: Serkys 5.6.2006, 23:06
skyboy, без понятия. Я в дебри мускула не лазил. 

Автор: skyboy 5.6.2006, 23:36
Serkys, я тоже не лазил. Я испытания проводил. Только там лажа с этой функцией. От версии к версии она то работает стабильно, то вовсе не работает. По крайней мере, в моих руках... smile
Потому -  пользоваться ею нельзя.  

Автор: ASteel 6.6.2006, 08:26
Цитата(Igor_CH @  5.6.2006,  18:36 Найти цитируемый пост)
Так вот как лучше получить (записать) ID_KAT? 
Получать последний auto_increment с таблицы PHOTO или записывать ID_KAT как дату с таблицы KAT.


Лучше всего, не использовать autoincrement а делать что-то типа:
Код

SELECT max(id)+1 AS `key` FROM some_table
-- сэмулировать такую штуку как sequence
-- под some_table в данном случае понимать KAT


И потом этот key использовать и в 1-ом запросе и во втором.
А last_insert_id() действительно крайне нестабильна.   

Автор: Igor_CH 6.6.2006, 08:50
[QUOTE=Serkys,5.6.2006,  22:25]
Цитата(Igor_CH @  5.6.2006,  19:36 Найти цитируемый пост)

З.Ы. Твои переменные выговаривать - пальцы сломаешь! smile


Согласен, поменял названия.

Структура должна быть такой: я вношу данные:
Общее название   - в таблицу PHOTO_KAT 
Общее описание   - в таблицу PHOTO_KAT
Фото 1 - описание к фото 1  - в таблицу PHOTO
Фото 2 - описание к фото 2  - в таблицу PHOTO
...................
Фото N - описание к фото N  - в таблицу PHOTO

а потом уже буду делать выборку из двух таблиц.

вот такой код получился при записи данных:

Код

$sql_insert = "INSERT INTO photo_kat (name, text, data) VALUES  (".sql_quote($name).",".sql_quote($text).",".sql_quote($data).");";
$result = mysql_query($sql_insert,$con) or die (mysql_error()."<br>".$sql_insert);

$id_foto = mysql_insert_id();

$sql_insert = "INSERT INTO photo (foto_name, text, id_foto) VALUES  (".sql_quote($foto_name_1).",".sql_quote($text_1).", ".sql_quote($id_foto)."), (".sql_quote($foto_name_2).",".sql_quote($text_2).", ".sql_quote($id_foto).");";
$result = mysql_query($sql_insert,$con) or die (mysql_error()."<br>".$sql_insert);


Т.е. загружаю в первую таблицу "PHOTO_KAT" значения NAME, TEXT, DATA
Получаю auto_increment этой таблицы, и записываю его уже в следующую таблицу как id_foto.

Правильно ли сделал? Или все таки auto_increment не использовать?
 

Автор: skyboy 6.6.2006, 10:23
Igor_CH, тут - как в анеке: работает? тогда, ради Бога, ничего не трогай smile Так работает?
 smile  касательно last_insert_id() - у меня MySQL 5.0.x. Так вот, в пределах ХП эта функция ни разу не сбоила. А вот за пределами, просто 
в запросе, то работает, то возвращает "0". Я к тому, что не всё так плохо.
 

Автор: -=Ustas=- 7.6.2006, 08:19
В твоем случае:
Код

$last_id = mysql_insert_id($con);

Ни разу не замечал сбоев. 

Автор: Igor_CH 16.6.2006, 11:58
У меня тут вопрорс возник, а если будет сбой на сервере, например:
в первую таблицу данные занеслись 
сбой
во вторую ничего не попало

Как тут быть? 

Автор: -=Ustas=- 16.6.2006, 12:20
Тогда уже mysql_insert_id не прокатит, так он работает только на текущей сессии. Вариант только так:
Код

SELECT MAX(`id`) FROM `table`
 

Автор: Igor_CH 16.6.2006, 12:40
так, а как от сбоя предохраниться? 
Если произошел сбой - то запись не произошла. 

Автор: vasac 16.6.2006, 13:05
Igor_CH, транзакциями предохраняться 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)