Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Требуется вставить массив в таблицу sql
 
 автор: nekifrovv   (25.09.2009 в 14:33)   письмо автору
 
 

Требуется вставить массив в таблицу sql

Это обязательно делать командой инсерт и использовать цикл? Или есть более простые варианты? Спасибо.

   
 
 автор: cheops   (25.09.2009 в 14:48)   письмо автору
 
   для: nekifrovv   (25.09.2009 в 14:33)
 

Можно использовать многострочный INSERT, т.е. цикл конечно у вас будет присутствовать, но вставлять данные вы будете лишь один раз
INSERT INTO tbl VALUES (...), (...), ..., (...)

   
 
 автор: nekifrovv   (25.09.2009 в 16:27)   письмо автору
 
   для: cheops   (25.09.2009 в 14:48)
 

У меня массив получается примерно из 1000 строк, их надо рассортировать по таблицам в цикле, получается, чтобы их обработать необходимо выполнить 1000 раз запрос инсерт, не тяжело ли это? можно как-нибудь облегчить?

Может сначала этот массив делить на более мелкие массивы для каждой таблицы используя тот же цикл, а потом вставить разбитые массивы в бд, каждый в свою таблицу?

   
 
 автор: Trianon   (25.09.2009 в 16:38)   письмо автору
 
   для: nekifrovv   (25.09.2009 в 16:27)
 

Вам именно это и предложили. По запросу на таблицу.
Если , конечно, данных будет не слишком много.

   
 
 автор: cheops   (25.09.2009 в 16:48)   письмо автору
 
   для: nekifrovv   (25.09.2009 в 16:27)
 

Сформируйте многострочные INSERT-запросы по одному на каждую таблицу - тогда можно избежать 1000 запросов - количество запросов сведется к количеству таблиц.

   
 
 автор: Nekifrovv   (25.09.2009 в 17:02)   письмо автору
 
   для: nekifrovv   (25.09.2009 в 16:27)
 

Спасибо, понял!

   
 
 автор: Nekifrovv   (25.09.2009 в 22:36)   письмо автору
 
   для: Nekifrovv   (25.09.2009 в 17:02)
 

Понял то понял, но вот что-то с трудом получается реализовать формирование много-строчного инсерта из массива(( Может есть у кого-нибудь пример?

   
 
 автор: ride   (25.09.2009 в 23:18)   письмо автору
 
   для: Nekifrovv   (25.09.2009 в 22:36)
 

примерно так
$ins="";
foreach($вашМассив as $val){
    if($ins!="")$ins.=',';
    $ins.="({$val['чтоТоТам']},{$val['ещеЧтоТоТам']}, {$val['иТд']})";
}

upd
а потом
if($ins!="")
  $q=mysql_query("insert into $myTable values $ins");

   
 
 автор: Nekifrovv   (26.09.2009 в 00:00)   письмо автору
 
   для: ride   (25.09.2009 в 23:18)
 

Чето не формируется.
Может дело в массиве?
Я пробую достать данные селектом, затем записать их в переменную - получаю массив, затем, пробую организовать многострочный инсерт, и что-то с этой функцией не выходит

   
 
 автор: ride   (26.09.2009 в 08:55)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 00:00)
 

>>Я пробую достать данные селектом
тогда вам массивы вообще не нужны:
insert into `table` select from anotherTable
upd
но если все же вам селект нужен, то echo $ins вам в помощь

   
 
 автор: Nekifrovv   (26.09.2009 в 10:01)   письмо автору
 
   для: ride   (26.09.2009 в 08:55)
 

Нужен select

   
 
 автор: Nekifrovv   (26.09.2009 в 10:04)   письмо автору
 
   для: ride   (25.09.2009 в 23:18)
 

Что тут есть что-то там?

   
 
 автор: Trianon   (26.09.2009 в 10:05)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 10:04)
 

а что есть у Вас?

   
 
 автор: Nekifrovv   (26.09.2009 в 10:12)   письмо автору
 
   для: Trianon   (26.09.2009 в 10:05)
 

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

   
 
 автор: Valick   (26.09.2009 в 10:21)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 10:12)
 

Зачем вам доставать значения из базы в массив? При написании скрипта с использованием MySQL нужно стремится к тому чтобы доставать данные из базы только для вывода в браузер, всё остальное нужно стремиться сделать средствами СУБД.

   
 
 автор: Nekifrovv   (26.09.2009 в 10:24)   письмо автору
 
   для: Valick   (26.09.2009 в 10:21)
 

Я знаю, лучше б с задачей помог )

   
 
 автор: Valick   (26.09.2009 в 10:29)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 10:24)
 

я помогаю тем кто не знает, но кто хочет узнать, а те кто знает пишут сами ;)
ну или хотябы толково объясняют задачу не только что нужно сделать, но и зачем и почему.

   
 
 автор: Nekifrovv   (26.09.2009 в 10:39)   письмо автору
 
   для: Valick   (26.09.2009 в 10:29)
 

(1,1,1,1),(1,1,1,1),(b,b,b,b),(b,b,b,b),(c,c,c,c),(c,c,c,c),(d,d,d,d),(d,d,d,d)

Выводится в такой форме, при том, что у меня таблица из которой берутся данные для дальнейшего инсерта состоит из 2 строк и 4 столбцов

1 b c d
2 z x c

т.е. повторяется первая строка (

   
 
 автор: ride   (26.09.2009 в 10:50)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 10:39)
 


//то есть, у вас такой массив
$arr=array(
  0=>array('1', 'b', 'c', 'd'),
  1=>array('2', 'z', 'x', 'c'),
);

//а не такой 

$arr=array(
  0=>array('id'=>'1', 'field1'=>'b', 'field2'=>'c', 'field3'=>'d'),
  1=>array('id'=>'2', 'field1'=>'z', 'field2'=>'x', 'field3'=>'c'),
);

?

   
 
 автор: Nekifrovv   (26.09.2009 в 11:12)   письмо автору
 
   для: ride   (26.09.2009 в 10:50)
 

Должен быть как во втором варианте, где фиелды это название столбцов.

   
 
 автор: ride   (26.09.2009 в 11:33)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 11:12)
 

ну так "чтоТоТам" - это и есть id, field1, field2, field3
действительно, покажите как сделали вы...

   
 
 автор: Trianon   (26.09.2009 в 11:25)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 10:12)
 

> Что бы я туда не написал - все равно одно и то же получается

Пока что Вы ни пишете ничего.
Ни одной Вашей строки кода я не увидел.

Представьте хоть какой-то вариант - тогда можно будет хотя бы от чего-то отттолкнуться, ошибки разобрать.

   
 
 автор: Nekifrovv   (26.09.2009 в 11:52)   письмо автору
 
   для: Trianon   (26.09.2009 в 11:25)
 

Ок, тогда сначала. Создаю таблицу newtable.

CREATE TABLE `newtable` (
`pervoe` int(10) NOT NULL auto_increment,
`vtoroe` varchar(10) NOT NULL,
`tretie` varchar(10) NOT NULL,
`chetvertoe` varchar(10) NOT NULL,
PRIMARY KEY (`pervoe`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;


INSERT INTO `newtable` VALUES (1, 'значение 1', 'значение 2', 'значение 3');
INSERT INTO `newtable` VALUES (2, 'значение 4', 'значение 5', 'значение 6');

Далее хочу применить многострочный инсерт, а значения в скобках формируются не так как надо (

<?
include ("db.php");

$res = mysql_query("SELECT * FROM newtable");
$row = mysql_fetch_array($res);

$ins="";
foreach($row as $val){
if($ins!="")$ins.=',';
$ins.="({$val['pervoe']},{$val['vtoroe']},{$val['tretie']},{$val['chetvertoe']})";
}
echo $ins;
?>

Выдает:

(1,1,1,1),(1,1,1,1),(з,з,з,з),(з,з,з,з),(з,з,з,з),(з,з,з,з),(з,з,з,з),(з,з,з,з)

   
 
 автор: ride   (26.09.2009 в 12:05)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 11:52)
 

$row = mysql_fetch_array($res);
ну так в данном случае $row же не многомерный массив!
давайте по порядку:



$res = mysql_query("SELECT * FROM newtable");
$row = mysql_fetch_array($res); //- вы взяли только одну запись, а не все
//в этом случае циклами и многострочными инсертами даже не пахнет:
$ins="({$row['pervoe']},{$row['vtoroe']},{$row['tretie']},{$row['chetvertoe']})"; // и все!


возможно, вам надо так:

$ins="";
$res = mysql_query("SELECT * FROM newtable");
while($row = mysql_fetch_array($res)){
     if($ins!=="")$ins.=",";
     $ins.="({$row['pervoe']},{$row['vtoroe']},{$row['tretie']},{$row['chetvertoe']})";
}

?

   
 
 автор: Trianon   (26.09.2009 в 12:33)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 11:52)
 

Так и что? Вы хотите сказать, что это из-за многострочности ?
однострочный инсерт точно также себя поведет.
Как будет выглядел бы текст корректного SQL-запроса?

   
 
 автор: Nekifrovv   (26.09.2009 в 13:34)   письмо автору
 
   для: Trianon   (26.09.2009 в 12:33)
 

В общем хотел сделать по-другому но пришлось сделать, используя do while.
Запятые поставил сразу после закрытия скобки, последнюю стер, т.к. в предыдущем случае запятая ставилась после каждого пробела.

Всем спасибо, за помощь!

   
 
 автор: asptema   (12.12.2009 в 22:24)   письмо автору
 
   для: Nekifrovv   (26.09.2009 в 13:34)
 

а почему нельзя сериализовать массив и засунуть его в базу?
а потом десериализовать и брать его элементы через [ ] ???

   
 
 автор: Trianon   (12.12.2009 в 22:28)   письмо автору
 
   для: asptema   (12.12.2009 в 22:24)
 

Почему бы не сделать маааленькую табличку, с одной единственной строкой, и одним единственным полем типа LONGTEXT?
И засунуть в эту ячейку весь дамп целевой базы, безо всякой сериализации.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования