Имею базу пользователей в мускуле около 10.000 на самописном движке с незашифрованными паролями. Возникла необходимость их импорта в форум воблы. Избрал следующий путь: 1. экспортил в .csv файл; 2. собрал скриптец, который берет и заносит в базу воблы; 3. Облом возник, когда я узнал что в форуме хитрое шифрование; PHP: <? $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(пасс).соль)
Тогда возникает вопрос, что не так в скрипте, что пас заносится в базу, а авторизоваться пользователь не может!
Такс с шифрованием раозбрался - все работает, теперь бы, сделать, чтобы не из файла брало, а из базы старой непосредственно! Преобразовал в такой вариант: PHP: <? $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',password='$pwd',salt='$salt'"; $result=mysql_query($query); } } ?> Правда он берет только одну строку, а нужно по очереди 10.000 Видимо, домущена ошибка! Только вот где?
PHP: 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',password='$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)) {
А если вот такую конструкцию PHP: $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)
Все! Проблему решил следующим макаром: PHP: $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'"); }