Просмотр полной версии : Перенос базы пользователей - скрипт
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);
}
}
?>
Кто-нибудь подскажите, как дописать скрипт, чтобы коннектился к старой базе напрямую, брал нужные поля, при этом шифровал пароли и заносил в базу форума!
а что тут непонятного ? генерируется соль ... длиной в 3 символа .. берётся пасс
а дальше md5(md5(пасс).соль)
serg-php
23.06.2009, 19:17
Тогда возникает вопрос, что не так в скрипте, что пас заносится в базу, а авторизоваться пользователь не может!
возьми строчку рабочего аккаунта и сравни
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
Видимо, домущена ошибка! Только вот где?
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
Дык, хочется все по-красивому! В старой-то базе последовательно записывало!
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot