PDA

Просмотр полной версии : Перенос базы пользователей - скрипт


serg-php
23.06.2009, 17:37
Имею базу пользователей в мускуле около 10.000 на самописном движке с незашифрованными паролями. Возникла необходимость их импорта в форум воблы.

Избрал следующий путь:

1. экспортил в .csv файл;
2. собрал скриптец, который берет и заносит в базу воблы;
3. Облом возник, когда я узнал что в форуме хитрое шифрование;


<?

$host = "localhost"; // MySQL server
$user_db = "1"; // MySQL пользователь
$pass_db = "2"; // MySQL пароль
$dbase = "1"; // MySQL база данных



$link = @mysql_pconnect ($host, $user_db, $pass_db);
if ($link) {
mysql_select_db($dbase);
} else {
exit("Unable to connect to database. Please try again later.\n");
}

$data=file('eu_user.csv');


function fetch_user_salt($length = 3)
{
$salt = '';
for ($i = 0; $i < $length; $i++)
{
$salt .= chr(rand(32, 126));
}
return $salt;
}

if (is_array($data))
{
foreach ($data as $string)
{
$temp=explode(";",$string);

$salt = fetch_user_salt( 3 );
$pwd = md5( md5( $temp[3] ).$salt );

# $username.( "', salt='".$salt."', password='{$pwd}', " )

$query="INSERT INTO f_user SET userid='$temp[0]',email='$temp[1]',username='$temp[2]',password='$pwd'";
$result=mysql_query($query);
}
}


?>


Кто-нибудь подскажите, как дописать скрипт, чтобы коннектился к старой базе напрямую, брал нужные поля, при этом шифровал пароли и заносил в базу форума!

Doom123
23.06.2009, 18:25
а что тут непонятного ? генерируется соль ... длиной в 3 символа .. берётся пасс

а дальше md5(md5(пасс).соль)

serg-php
23.06.2009, 19:17
Тогда возникает вопрос, что не так в скрипте, что пас заносится в базу, а авторизоваться пользователь не может!

Дикс
23.06.2009, 20:33
возьми строчку рабочего аккаунта и сравни

serg-php
23.06.2009, 20:40
Сравнил и пишет, что пароль неверный!

serg-php
23.06.2009, 22:48
Такс с шифрованием раозбрался - все работает, теперь бы, сделать, чтобы не из файла брало, а из базы старой непосредственно!

Преобразовал в такой вариант:

<?

$host_a = "localhost"; // MySQL server
$user_db_a = "1"; // MySQL пользователь
$pass_db_a = "2"; // MySQL пароль
$dbase_a = "1"; // MySQL база данных
$dtable = "eu_user"; // Таблица в базе данных

$host = "localhost"; // MySQL server
$user_db = "3"; // MySQL пользователь
$pass_db = "4"; // MySQL пароль
$dbase = "3"; // MySQL база данных




mysql_connect ($host_a, $user_db_a, $pass_db_a);
mysql_select_db($dbase_a);

$sql = "SELECT id, email, username, pwd, regdate FROM $dtable";

$result = mysql_query($sql);

$rows = mysql_fetch_array($result);


list($id, $email, $username, $pwd, $regdate ) = mysql_fetch_row($result);


$link = @mysql_pconnect ($host, $user_db, $pass_db);
if ($link) {
mysql_select_db($dbase);
} else {
exit("Unable to connect to database. Please try again later.\n");
}

function fetch_user_salt($length = 3)
{
$salt = '';
for ($i = 0; $i < $length; $i++)
{
$salt .= chr(rand(32, 126));
}
return $salt;
}



if (is_array($rows))
{
foreach ($rows as $string)
{

$salt = fetch_user_salt( 3 );
$pwd = md5( md5( trim($pwd) ).$salt );


$query="INSERT INTO f_user SET userid='$id',email='$email',username='$username',p assword='$pwd',salt='$salt'";
$result=mysql_query($query);
}
}


?>

Правда он берет только одну строку, а нужно по очереди 10.000


Видимо, домущена ошибка! Только вот где?

Doom123
23.06.2009, 22:58
while($rows = mysql_fetch_array($result))
{
бла бла бла
}

serg-php
24.06.2009, 08:00
function fetch_user_salt($length = 3)
{
$salt = '';
for ($i = 0; $i < $length; $i++)
{
$salt .= chr(rand(32, 126));
}
return $salt;
}

$nhd1 = mysql_connect($host_a, $user_db_a, $pass_db_a);
$nhd2 = mysql_connect($host, $user_db, $pass_db);



mysql_select_db("$dbase", $nhd1);
mysql_select_db("$dbase", $nhd2);


//do a query from db1:
$sql = "SELECT id, email, username, pwd, regdate FROM $dtable"; $which = $nhd1;
mysql_query($query,$which);

$result = mysql_query($sql);

while(list($id, $email, $username, $pwd, $regdate) = mysql_fetch_row($result)) {

$link = mysql_pconnect ($host, $user_db, $pass_db);
if ($link) {
mysql_select_db($dbase);
} else {
exit("Unable to connect to database. Please try again later.\n");
}

if (is_array($rows))
{
foreach ($rows as $string)
{

$salt = fetch_user_salt( 3 );
$pwd = md5( md5( trim($pwd) ).$salt );


//do a query from db2
$query = "INSERT INTO f_user SET userid='$id',email='$email',username='$username',p assword='$pwd',salt='$salt'"; $which = $hnd2;
mysql_query($query,$which);

}
}

}


Пишет на ошибку
Parse error: syntax error, unexpected ')', expecting '=' in Z:\home\localhost\www\myimport\index.php on line 39

39 while(list($id, $email, $username, $pwd, $regdate) = mysql_fetch_row($result)) {

wildshaman
24.06.2009, 08:22
Ты убил цикл, вместо = там должо быть ==

serg-php
24.06.2009, 11:33
А если вот такую конструкцию



$link1 = mysql_connect($host_a, $user_db_a, $pass_db_a);
mysql_select_db($dbase_a, $link1);

$link2 = mysql_connect($host, $user_db, $pass_db);
mysql_select_db($dbase, $link2);

$res1 = mysql_query('id, email, username, pwd, regdate FROM $dtable', $link1);


if (mysql_num_rows($res1) > 0)
while ($data = mysql_fetch_assoc($res1)) {
//Обработка данных: генерация пароля и т.п.
mysql_query("INSERT INTO f_user SET userid='$id',email='$email',username='$username',p assword='$pwd',salt='$salt')");
}


Правда, ругается на


Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\myimport\index2.php on line 34



34. if (mysql_num_rows($res1) > 0)

serg-php
24.06.2009, 17:29
Все! Проблему решил следующим макаром:
$link1 = mysql_connect($host_a, $user_db_a, $pass_db_a);
mysql_select_db($dbase_a, $link1);

$link2 = mysql_connect($host, $user_db, $pass_db);
mysql_select_db($dbase, $link2);

$res1 = mysql_query("SELECT id, email, username, pwd, regdate FROM $dtable", $link1);

#echo $temp = mysql_fetch_assoc($res1);

function fetch_user_salt($length = 3)
{
$salt = '';
for ($i = 0; $i < $length; $i++)
{
$salt .= chr(rand(32, 126));
}
return $salt;
}


if (mysql_num_rows($res1) > 0)
while ($temp = mysql_fetch_assoc($res1)) {
//Обработка данных: генерация пароля и т.п.

$salt = fetch_user_salt( 3 );
$pwd = md5( md5( trim($temp[pwd]) ).$salt );

mysql_query("INSERT INTO f_user SET
userid='$temp[id]',
usergroupid='2',
username='$temp[username]',
password='$pwd',
passworddate='2009-06-20',
email='$temp[email]',
styleid='2',
salt='$salt'");
}

serg-php
24.06.2009, 17:45
Еще один вопрос,

почему в новую базу данные заносятся вразнобой?

Пример:

id
44
67
49
и т.д.?

Pashkela
24.06.2009, 17:49
Заманали с ID!!!! Не имеет это значения, не имеет, никакого абсолютно

ЗЫЖ Простите, эмоции:))

serg-php
24.06.2009, 18:29
Дык, хочется все по-красивому! В старой-то базе последовательно записывало!