[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проверка пароля с базой данных
prokurist
Привет всем. возник вопрос о правильности написанного кода.

Проблема:

Посетитель сайта получает ключ (пароль), при помощи которого он заходит на страницу опроса. Ключ сравнивается с бд на наличие такого вней и на правильность. Если такой ключ есть в базе данных, то тогда посетитель входит на страницу опроса если нет, то появляется какая нибуть надпись. при этом в базе данных ставится метка в графе "used"

Код

PHP
<?php 
<html>
<
body>
<
form action="code.phpmethod="post">
    <
table>
        <
tr>
            <
td>Enter your Code:</td>
            <
td><input type="text" name="code" /></td>
        </
tr>
              <
td></td>
            <
td><input type="submit" value="Enter in Survey" /></td>
        </
tr>
    </
table>
</
form>
</
body>
</
html>
if (isset(
$_POST['code']))
{
    
$code mysql_real_escape_string($_POST['code']);
    
    
$query "SELECT 'al_code'
            FROM 'code'
            WHERE 'code'='{$code}'
            LIMIT 1"
;
    
$sql mysql_query($query) or die(mysql_error());

    
// wenn der code existiert 
    
if (mysql_num_rows($sql) == 1) {
        
// dann setzen wir diesen Tag in der Sitzung

        
$row mysql_fetch_assoc($sql);
        
$_SESSION['used'] = $row['used'];

        
// man braucht session_start();
    
}
    else {
        die(
'Hello, leider dein Code ist falsch!');
    }
}

if (isset(
$_SESSION['user_id'])) {
    echo 
"Hello";
}
else {
    die(
'Go AWAY!');
}




Спустя 19 минут, 41 секунда (24.06.2009 - 14:43) gooder отдыхающий написал(а):
Цитата
$_SESSION['used']

и
Цитата
if (isset($_SESSION['user_id']))

Спустя 1 минута, 8 секунд (24.06.2009 - 14:44) waldicom написал(а):
Вопрос в семантической правильности или синтаксис?
И разве так правильно?
PHP
$query "SELECT 'al_code' FROM 'code' WHERE 'code'='{$code}' LIMIT 1";


Может лучше так:
PHP
$query "SELECT `al_code` FROM `code` WHERE `code`='" $code ."' LIMIT 1";


Спустя 1 минута, 1 секунда (24.06.2009 - 14:45) prokurist написал(а):
Цитата (gooder @ 24.06.2009 - 11:43)
Цитата
$_SESSION['used']

и
Цитата
if (isset($_SESSION['user_id']))

и что не так? (я новичек в php) по подробней пожста

Спустя 2 минуты, 2 секунды (24.06.2009 - 14:47) prokurist написал(а):
Цитата (waldicom @ 24.06.2009 - 11:44)
Вопрос в семантической правильности или синтаксис?
И разве так правильно?
PHP
$query = "SELECT 'al_code' FROM 'code' WHERE 'code'='{$code}' LIMIT 1";


Может лучше так:
PHP
$query = "SELECT `al_code` FROM `code` WHERE `code`='" . $code ."' LIMIT 1";

вопрос во всех деталях

Спустя 1 минута, 34 секунды (24.06.2009 - 14:49) gooder отдыхающий написал(а):
waldicom
так как у него написано — лучше и читабельнее

prokurist
в смысле что не так?
ты какую переменную ставишь в сессию? какую проверяешь?

Спустя 54 секунды (24.06.2009 - 14:50) stepan написал(а):
Найди десять отличий между:
Цитата (prokurist @ 24.06.2009 - 11:23)
$_SESSION['used']

и
Цитата (prokurist @ 24.06.2009 - 11:23)
$_SESSION['user_id']



Спустя 1 минута, 17 секунд (24.06.2009 - 14:51) prokurist написал(а):
опачки smile.gif

Спустя 1 минута, 6 секунд (24.06.2009 - 14:52) gooder отдыхающий написал(а):
prokurist
начни изучать синтаксис языка
и что такое html и php и почему нельзя их вместе внутри <?php ?> писать

Спустя 39 секунд (24.06.2009 - 14:53) waldicom написал(а):
Цитата (gooder @ 24.06.2009 - 13:49)
waldicom
так как у него написано — лучше и читабельнее

gooder, попробуй для интереса выполнить такой запрос (поля естественно любые, чтобы они у тебя в таблице были).
SQL
SELECT 'al_code' FROM 'code'


Тебя ждет масса новых впечатлений.

Спустя 2 минуты, 2 секунды (24.06.2009 - 14:55) gooder отдыхающий написал(а):
Цитата (waldicom @ 24.06.2009 - 14:53)
Цитата (gooder @ 24.06.2009 - 13:49)
waldicom
так как у него написано — лучше и читабельнее

gooder, попробуй для интереса выполнить такой запрос (поля естественно любые, чтобы они у тебя в таблице были).
PHP
SELECT 'al_code' FROM 'code'


Тебя ждет масса новых впечатлений.

дарагой, при чем тут это?

тебе говорят про использование {} для переменных в строке
а не про кавычки и синтаксис запроса

Спустя 57 секунд (24.06.2009 - 14:56) gooder отдыхающий написал(а):
а то, что у него кавычки неверные — да, поля и таблицу в ` обрамлять надо

Спустя 1 минута, 11 секунд (24.06.2009 - 14:57) prokurist написал(а):
Цитата (gooder @ 24.06.2009 - 11:52)
prokurist
начни изучать синтаксис языка
и что такое html и php и почему нельзя их вместе внутри <?php ?> писать

это я сюда выложил 2 в одном. так все по путински php отдельно html отдельно

Спустя 14 секунд (24.06.2009 - 14:57) waldicom написал(а):
Цитата
Цитата (waldicom @ 24.06.2009 - 14:53)
Цитата (gooder @ 24.06.2009 - 13:49)
waldicom
так как у него написано — лучше и читабельнее

gooder, попробуй для интереса выполнить такой запрос (поля естественно любые, чтобы они у тебя в таблице были).
PHP
SELECT 'al_code' FROM 'code'


Тебя ждет масса новых впечатлений.

дарагой, при чем тут это?

Эммм... Дорогая?

Цитата

тебе говорят про использование {} для переменных в строке
а не про кавычки и синтаксис запроса

Во-первых, это сугубо субъективно, во-вторых, я как раз про кавычки.
Ибо если синтаксис неправильный, то ты хоть заставься фигурных скобочек.

Спустя 17 минут, 32 секунды (24.06.2009 - 15:15) prokurist написал(а):
PHP
<?php

session_start
();

if (!isset(
$_SESSION['used'])) {
  if (isset(
$_POST['code']))
  {
    
$code mysql_real_escape_string($_POST['code']);
   
    
$query "SELECT c.al_code
            FROM code c
            WHERE ccode = '"
.$code."'
            LIMIT 1"
;
    
$sql mysql_query($query) or die(mysql_error());

    
// wenn der code existiert
    
if (mysql_num_rows($sql) === 1) {
      
// dann setzen wir diesen Tag in der Sitzung

      
$row mysql_fetch_assoc($sql);
      
$_SESSION['used'] = $row['used'];

    }
    else {
      
session_destroy();
      die(
'Hello, leider dein Code ist falsch!');
    }
  }
  else
  {
  
?>
<html>
<body>
<form action="<? echo $PHP_SELF?>" method="post">
<table>
<tr>
<td>Enter your Code:</td>
<td><input type="text" name="code" /></td>
</tr>
<td></td>
<td><input type="submit" value="Enter in Survey" /></td>
</tr>
</table>
</form>
</body>
</html>
<?php
  
}
}
else
{
  echo 
"Dein Code wurde bestätigt";
}

Спустя 5 минут, 56 секунд (24.06.2009 - 15:20) Kuliev написал(а):
prokurist
А у тебя пароли в базе не в зашифрованном виде хранятся?

Спустя 1 минута, 28 секунд (24.06.2009 - 15:22) waldicom написал(а):
Цитата (Kuliev @ 24.06.2009 - 14:20)
prokurist
А у тебя пароли в базе не в зашифрованном виде хранятся?

Насколько я понял, это не пароли в привычном нам виде, а одноразовые коды доступа, которые после использования выкидываются (помечаются использованными)

Спустя 1 минута, 26 секунд (24.06.2009 - 15:23) Kuliev написал(а):
waldicom
Ааааа вон оно что biggrin.gif

Спустя 1 час, 25 минут, 17 секунд (24.06.2009 - 16:49) ИНСИ написал(а):
1. вот тут лишнаяя буква:
PHP
WHERE [b]c[/b]code '".$code."'


а вот тут как gooder посоветовала надо сделать, ибо есть серверы, на которых не сработает вот это:

PHP
$_SESSION['used'] = $row['used'];


меняем на
PHP
if(!isset($_SESSION['used'])) $_SESSION['used'] = $_POST['used'];

Спустя 17 часов, 28 минут, 57 секунд (25.06.2009 - 10:18) prokurist написал(а):
на своем опыте убедился не правильно сформулированная задача тем более код это .....


задача: Делаем выборку по полю кода из БД, пр этом захватывая поле used.
Если код найден, мы продолжаем выполнение:
Приверяем, равен ли used = true, если да - код был использован и пишем, что голосовать можно только единожды.
Если used = false, то разрешаем голосовать, при этом в форму обязательно генерируем выбранный код в качестве скрытого поля (никаких сессий!).
После, как он голосует, мы устанавливаем значение used равным true и сообщаем, что голос принят.


PHP
<?php $query "SELECT `id` FROM `codes` WHERE `code` = '${code}' AND `used` = 0";
  
$result mysql_query($query);
  
$fields mysql_fetch_object($result);
  
  if (
mysql_num_rows($sql) == 1) {
     
// Значит найдено и такой код один
      // Делаем что-то
  
      
mysql_query("UPDATE `codes` SET `used` = 1 WHERE `id` = ".$fields->id);
  } 

Спустя 47 минут, 10 секунд (25.06.2009 - 11:05) glock18 написал(а):
Цитата (welbox2 @ 24.06.2009 - 13:49)
if(!isset($_SESSION['used'])) $_SESSION['used'] = $_POST['used'];


а что - эта конструкция на всех серверах сработает? huh.gif

prokurist, меня собственно только это напрягает немного:
PHP
$fields mysql_fetch_object($result);

if (
mysql_num_rows($sql) == 1) {


ты сначала получаешь запись из результата, а уже потом запрашиваешь количество строк (это кстати говоря еще один запрос, хоть и быстрый)

если важно, чтобы запись была одна, я бы сделал либо:
1. переставил извлечение записи во внутрь блока if
либо
2. завел уникальный ключ на code в таблице. тогда mysql_num_rows был не нужен. можно было бы проверить

PHP
if ($fields)


мне 2 больше нравится.

PS: а так. я не понял - у тебя там что-то не работает? на мой взгляд, все ок.

Спустя 5 минут, 8 секунд (25.06.2009 - 11:10) prokurist написал(а):
Цитата (glock18 @ 25.06.2009 - 08:05)
Цитата (welbox2 @ 24.06.2009 - 13:49)
if(!isset($_SESSION['used'])) $_SESSION['used'] = $_POST['used'];


а что - эта конструкция на всех серверах сработает? huh.gif

prokurist, меня собственно только это напрягает немного:
PHP
$fields = mysql_fetch_object($result);

if (mysql_num_rows($sql) == 1) {


ты сначала получаешь запись из результата, а уже потом запрашиваешь количество строк (это кстати говоря еще один запрос, хоть и быстрый)

если важно, чтобы запись была одна, я бы сделал либо:
1. переставил извлечение записи во внутрь блока if
либо
2. завел уникальный ключ на code в таблице. тогда mysql_num_rows был не нужен. можно было бы проверить

PHP
if ($fields)


мне 2 больше нравится.

PS: а так. я не понял - у тебя там что-то не работает? на мой взгляд, все ок.

я не знаю как воплотить:
Приверяем, равен ли used = true, если да - код был использован и пишем, что голосовать можно только единожды.
Если used = false, то разрешаем голосовать, при этом в форму обязательно генерируем выбранный код в качестве скрытого поля (никаких сессий!).
После, как он голосует, мы устанавливаем значение used равным true и сообщаем, что голос принят.

Спустя 17 минут, 32 секунды (25.06.2009 - 11:27) glock18 написал(а):
меня начинает злить это. в чем заключается необходимость писать болдом? а вот так тебе будет удобнее понять:

1. в запросе поле used убираешь из where и ставишь в список полей на выборку.
2. после проверки вернулось ли что-то (у тебя mysql_num_rows), ставишь проверку

PHP
if ($fields->used)
   echo 
'нельзя че-то там делать два раза';
else
   echo 
'можно и проголосовать';


3. дальше при выводе формы пишешь
HTML
<input type="hidden" value="<?php echo $code;?>" name="code" />

это жутко небезопасно в плане показывания кода на странице, но это твое дело.

4. в итоге придет два значения. их и нужно сравнить.

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

Спустя 1 минута, 29 секунд (25.06.2009 - 11:29) prokurist написал(а):
Цитата (glock18 @ 25.06.2009 - 08:27)
меня начинает злить это. в чем заключается необходимость писать болдом? а вот так тебе будет удобнее понять:

1. в запросе поле used убираешь из where и ставишь в список полей на выборку.
2. после проверки вернулось ли что-то (у тебя mysql_num_rows), ставишь проверку

PHP
if ($fields->used)
   echo 'нельзя че-то там делать два раза';
else
   echo 'можно и проголосовать';


3. дальше при выводе формы пишешь
HTML
<input type="hidden" value="<?php echo $code;?>" name="code" />

это жутко небезопасно в плане показывания кода на странице, но это твое дело.

4. в итоге придет два значения. их и нужно сравнить.

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

Извени sad.gif

Спустя 7 минут, 18 секунд (25.06.2009 - 11:36) glock18 написал(а):
Цитата (prokurist @ 25.06.2009 - 08:29)
Извени sad.gif

понял, и молодец.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.