MySQL PHP

M
На сайте с 24.06.2009
Offline
105
830

Есть две базы со старого движка и новая, различия в таблицах, хочу скриптом перенести нужные поля со старой таблицы на новую.

Создаю массив и на printf отлично показываются все данные а вот как его заганть в новую таблицу проблема.

Вот с чего начал

<?php

$db = mysql_connect('localhost', 'name', 'pass', 'oldbase');

mysql_select_db('oldbase', $db);

$db1 = mysql_connect('localhost', 'name1', 'pass1', 'newbase');

mysql_select_db('newbase', $db1);

$result = mysql_query("SELECT *, id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position FROM oldbase.ps_category");

if (!$result) {

echo 'Ошибка запроса: ' . mysql_error();

exit;

}

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

mysql_query("INSERT INTO newbase.ps_category (id_category) values ($row[0]");

}

?>

M
На сайте с 24.06.2009
Offline
105
#2

Да, нужно перенести магазин на новый двиг, а там и категории, атрибуты и прочее.

А можно это реализовать через select и insert into? искал примеры где реализванно на разных базах и ненашел.

Жестокость исправил)

<?php

$db = mysql_connect('localhost', 'name', 'pass', 'oldbase');

mysql_select_db('oldbase', $db);

$db1 = mysql_connect('localhost', 'name1', 'pass1', 'newbase');

mysql_select_db('newbase', $db1);

$result = mysql_query("SELECT id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position FROM oldbase.ps_category");

if (!$result) {

echo 'Ошибка запроса: ' . mysql_error();

exit;

}

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

mysql_query("INSERT INTO newbase.ps_category (id_category) values ($row[0])");

mysql_query("INSERT INTO newbase.ps_category (id_parent) values ($row[1])");

mysql_query("INSERT INTO newbase.ps_category (level_depth) values ($row[2])");

mysql_query("INSERT INTO newbase.ps_category (nleft) values ($row[3])");

mysql_query("INSERT INTO newbase.ps_category (nright) values ($row[4])");

mysql_query("INSERT INTO newbase.ps_category (active) values ($row[5])");

mysql_query("INSERT INTO newbase.ps_category (date_add) values ($row[6])");

mysql_query("INSERT INTO newbase.ps_category (date_upd) values ($row[7])");

mysql_query("INSERT INTO newbase.ps_category (position) values ($row[7])");

}

?>

PS Я в этом деле сосвсем нуб, может есть похожий пример.

siv1987
На сайте с 02.04.2009
Offline
427
#3

Можно наверное, если обе бд доступны для одного и того же юзера. http://www.google.ru/search?client=opera&rls=ru&q=insert+into+%D0%B8%D0%B7+%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9+%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B+%D0%B2+%D0%B4%D1%80%D1%83%D0%B3%D1%83%D1%8E&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest

---------- Добавлено 31.10.2012 в 21:53 ----------


INSERT INTO newdb.table ( id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position ) SELECT id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position FROM olddb.table
M
На сайте с 24.06.2009
Offline
105
#4
siv1987:
Можно наверное, если обе бд доступны для одного и того же юзера. http://www.google.ru/search?client=opera&rls=ru&q=insert+into+%D0%B8%D0%B7+%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9+%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B+%D0%B2+%D0%B4%D1%80%D1%83%D0%B3%D1%83%D1%8E&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest

---------- Добавлено 31.10.2012 в 21:53 ----------


INSERT INTO newdb.table ( id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position ) SELECT id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position FROM olddb.table

Спасибо сработало.

А если в новой таблице уже есть некоторые данные и вылетает ошибка, тогда использовать нужно UPDATE?

#1062 - Duplicate entry '1' for key 'PRIMARY'

siv1987
На сайте с 02.04.2009
Offline
427
#5

поля при селекте должны быть в том же порядке что и поля при инсерте.


$db = mysql_connect('localhost', 'name', 'pass', 'oldbase');
mysql_select_db('oldbase', $db);
$db1 = mysql_connect('localhost', 'name1', 'pass1', 'newbase');
mysql_select_db('newbase', $db1);

$res = mysql_query("SELECT id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position FROM ps_category", $db)
OR die( mysql_error() );

while( $row = mysql_fetch_assoc($res) )
{
$row = array_map( 'mysql_real_escape_string', $row );
mysql_query( 'INSERT INTO ps_category (id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position) VALUES ("'. implode('", "', $row). '")', $db1 )
OR die( mysql_error() );
}
А если в новой таблице уже есть некоторые данные и вылетает ошибка
#1062 - Duplicate entry '1' for key 'PRIMARY'

http://phpclub.ru/mysql/doc/replace.html

M
На сайте с 24.06.2009
Offline
105
#6

Появилась небольшая проблема, строку с id_category = 1 во всех полях нужно пропустить

сейчас

INSERT INTO newdb.table ( id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position ) SELECT id_category, id_parent, level_depth, nleft, nright, active, date_add, date_upd, position FROM olddb.table

Смотрел описание WHERE но там нужно указать в каких случая работает insert a вот с пропусками проблема.

И как лучше сделать этот пропуск в SELECT или уже при вставке. Просто в таблице новой базы сделали первую строку с id_category = 1 - root ,id_category = 2 - home а в старой базе только id_category = 1 - home а дальше с ид 3- это товарные категории. Мне бы просто перенести все кроме id=1,2

IL
На сайте с 20.04.2007
Offline
435
#7

В конце запроса дописать

 WHERE  id_category NOT IN (1,2)
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
M
На сайте с 24.06.2009
Offline
105
#8
ivan-lev:
В конце запроса дописать
 WHERE  id_category NOT IN (1,2)

А в остальных столбцах где есть первые две строки с id1,2 будут сохранены?

siv1987
На сайте с 02.04.2009
Offline
427
#9

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий