mysql_result шалит

Статус
В этой теме нельзя размещать новые ответы.

Bars

Новичок
Это скрипт регистрации. На 41-й строке мы проверяем, есть ли уже принятый e-mail ($login) в базе данных. Если нету - нам надо занести его в базу данных, а если есть - закрыть соединение с базой, выдать ошибку и остановить выполнение скрипта.

Если e-mail есть в системе, всё хорошо, просто надо выдать пользователю ошибку о занятости e-mail'а. Но если пользователь не зарегистрирован (т.е. его e-mail'а нет в базе), то появляется

Ошибка:
Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 7 in R:\home\w2.by\www\inc\reg.php on line 39

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 8 in R:\home\w2.by\www\inc\reg.php on line 48

Warning: Cannot modify header information - headers already sent by (output started at R:\home\w2.by\www\inc\reg.php:39) in R:\home\w2.by\www\inc\reg.php on line 57
reg.php:
PHP:
<?php
session_start();

$login = mysql_real_escape_string(trim(strtolower($_POST['login'])));
$pass = mysql_real_escape_string(trim($_POST['pass']));
$pass1 = mysql_real_escape_string(trim($_POST['pass1']));
$wmr = mysql_real_escape_string(trim($_POST['wmr']));
$code = mysql_real_escape_string(trim((int)$_POST['code']));
$ip = $_SERVER["REMOTE_ADDR"];
$ref = '0';

if (!preg_match('#^[A-Za-z0-9@._-]+$#i', $login)){
	header("Location: /register/?error=1");
	exit;
} else if (strlen($login) > 40 || strlen($login) < 8){
	header("Location: /register/?error=2");
	exit;
} else if ($pass <> $pass1){
	header("Location: /register/?error=3");
	exit;
} else if (!preg_match('#^[A-Za-z0-9-_]+$#i', $pass) || !preg_match('#^[A-Za-z0-9-_]+$#i', $pass1)){
	header("Location: /register/?error=4");
	exit;
} else if (strlen($pass) > 32 || strlen($pass) < 8){
	header("Location: /register/?error=5");
	exit;
} else if (strlen($wmr) <> 13 || !preg_match('#^[R0-9]+$#i', $wmr)){
	header("Location: /register/?error=6");
	exit;
} else if ($code <> $_SESSION['code']){
	header("Location: /register/?error=7");
	exit;
}

$md5 = md5(md5($pass));
include 'db.php';

$remail = mysql_query("SELECT `email` FROM `users` WHERE `email`='$login'");
$realemail = mysql_result($remail, 0);

if ($login == $realemail){
	mysql_close();
	header("Location: /register/?error=8");
	exit;
}

$rewmr = mysql_query("SELECT `wmr` FROM `users` WHERE `wmr`='$wmr'");
$realwmr = mysql_result($rewmr, 0);
if ($wmr == $realwmr){
	mysql_close();
	header("Location: /register/?error=9");
	exit;
}

mysql_query("INSERT INTO `users` (`email`, `pass`, `wmr`, `ref`, `reg_date`, `reg_ip`) VALUES ('$login', '$md5', '$wmr', $ref, NOW(), '$ip')") or die('Ошибка запроса к базе данных');
mysql_close();
header("Location: /register/?success");
?>
db.php:
PHP:
<?php

$host = 'localhost'; // Хост БД
$user = 'root'; // Пользователь БД
$pass = ''; // Пароль ДБ
$name = 'w2'; // Имя БД

mysql_connect($host, $user, $pass) or die('Не удалось соединиться с базой данных');
mysql_select_db($name);

?>
 

Bars

Новичок
Но даже при появлении ошибки скрипт выполняет свою работу, затрагивая код ниже, что чревато созданием нескольких аккаунтов с одним e-mail'ом:
PHP:
mysql_query("INSERT INTO `users` (`email`, `pass`, `wmr`, `ref`, `reg_date`, `reg_ip`) VALUES ('$login', '$md5', '$wmr', $ref, NOW(), '$ip')") or die('Ошибка запроса к базе данных');
 

hell0w0rd

Продвинутый новичок
$md5 = md5(md5($pass)); - за такое вам пользователи спасибо точно не скажут.
Очевидно что если нет такой записи - ответ пустой, вам варнинг об этом и говорит
 

Bars

Новичок
Ты цифры не перепутал?
По коду это типичнейший 3.5
В таких выражениях писали ровно 15 лет назад.
Я создал тему не для того, чтобы выслушивать Ваши комментарии. А подпись старая, я на 5.3 переводил совершенно другой сайт и вики.

$md5 = md5(md5($pass)); - за такое вам пользователи спасибо точно не скажут.
Очевидно что если нет такой записи - ответ пустой, вам варнинг об этом и говорит
Про пароль "варнинг" мне ничего не говорит. Проблема в получении результата из БД. А двойной MD5 для повышения безопасности.

Это само собой, но разве нормально показывать это пользователю? Не поймёт, в чём дело, и уйдёт с ресурса.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху