2013-09-13 6 views
-1

Есть ли у вас какие-либо идеи о том, что вызывает предупреждение об этом простом бите кода?Предупреждение MySQL, предложение WHERE

if(isset($_POST['remember'])) 
{ 
     $query_cookie = ("SELECT id FROM users WHERE email = '$email' OR username = '$username'"); 
     $result_cookie = mysql_query($query); 
     $row_cookie = mysql_fetch_array($result_cookie); // LINE 36 
     $id = $row_cookie; // Will be hashed before using 
     setcookie("Remember", $id, strtotime('+30 days')); 
     echo $id; 
} 

Здесь ошибка, что я получил:

Предупреждение: mysql_fetch_array() ожидает параметр 1, чтобы быть ресурсом, логический дан в C: \ XAMPP \ HTDOCS \ Регистрация \ включает \ login.php on line 36

Другая проблема, которая касается моего запроса. В основном у меня есть форма входа в систему с тремя входами: одна для имени пользователя, одна для электронной почты, другая для пароля. Я хочу, чтобы пользователь мог войти в систему с его именем пользователя или паролем. Однако запрос выглядит своего рода странно для меня, и мне интересно, если она будет работать, как и следовало ожидать, так как окончательный запрос закончится чем-то вроде этого:

SELECT id FROM users WHERE email = '[email protected]' OR username = '' 

или наоборот. Я предполагаю, что этот запрос не является полностью функциональным. Я открыт для предложений, если у вас есть.

$ id - это то же самое, что и $ row_cookie atm, потому что $ id будет хэшироваться. Было бы хорошо, если бы я сделал простой $id = sha1(md5($row_cookie));?

Я знаю, что MySQL обесценивается. Я скоро перейду на MySQLi, поэтому не стоит беспокоиться.

Как вы можете видеть, на самом деле есть три вопроса. Если это проблема, сообщите мне, прежде чем опуститься, чтобы я мог изменить свой вопрос. Благодаря!

+2

change $ id = $ row_cookie [id]; вместо $ id = $ row_cookie; – Guru

+0

[Не используйте mysql_ * extension] (http://www.php.net/en/mysql_query), поскольку они устарели. Вместо этого используйте [PDO] (http://php.net/manual/en/book.pdo.php) или [MSQLi] (http://php.net/manual/en/book.mysqli.php). –

+0

_ «Я скоро перейду на MySQLi, поэтому не стоит беспокоиться». Тот факт, что вы все еще используете устаревшее (и небезопасное) расширение _is_ a worry. –

ответ

1

Если предположить, что электронная почта или имя пользователя поля являются уникальными, и вы отвергаются возможные инъекции SQL, попробуйте:

if (isset($_POST['remember'])) { 
    $query_cookie = ("SELECT id FROM users 
     WHERE email = '$email' OR username = '$username'"); 
    $result_cookie = mysql_query($query_cookie); 
    if ($result_cookie) { 
     $row_cookie = mysql_fetch_array($result_cookie); 
     $id = $row_cookie['id']; 
     setcookie("Remember", $id, strtotime('+30 days')); 
     echo $id; 
    } 
} 

После выборки результата, чтобы получить id попробовать : $row_cookie['id'].

Предлагаю использовать bcrypt для хеширования. Это алгоритм хэширования, который масштабируется с помощью аппаратного обеспечения.

Смотрите дополнительную информацию:

  1. How do you use bcrypt for hashing passwords in PHP?
  2. “Keep Me Logged In” - the best approach
+0

Пока все ответы очень помогли, это полное рабочее решение. Пожалуйста, дайте мне знать, что вы думаете, если достаточно просто добавить шифрование md5 и sha1 в идентификатор или нет. Благодаря! – SporeDev

+0

@SporeDev Вы хотите реализовать функциональность «запомнить меня»? – hallaji

+0

@SporeDev Вместо этого предлагаю использовать 'bcrypt', см. Этот ответ: http: // stackoverflow.com/a/6337021/1121982 – hallaji

2

Измените запрос $ query_cookie на $.

Try:

$result_cookie = mysql_query($query_cookie); 

Вы имеете в виду $ запроса в вашем mysql_query() заявление. Эта переменная не существует.

+0

Я сделал это, и теперь я получаю следующее предупреждение: Warning: setcookie() ожидает, что параметр 2 будет строкой, массив указан в C: \ xampp \ htdocs \ Registration \ includes \ login.php on line 38 – SporeDev

+0

@SporeDev: Это потому, что вы передаете '$ id', который является массивом, когда вам нужно передать' $ id ['id'] '... –

+0

Хорошо, я отредактировал эту строку, и теперь я Обратите внимание: использование неопределенного константного id - предполагаемого «id» в C: \ xampp \ htdocs \ Registration \ includes \ login.php в строке 37 Идентификатор правильно отображается. – SporeDev

2

из the docs

Для SELECT, SHOW, DESCRIBE, EXPLAIN и другие заявления, возвращающиеся, mysql_query ResultSet() возвращает ресурс при успехе, FALSE при ошибке.

Вы должны всегда проверить, если результат вашего mysql_query вызова не false, прежде чем пытаться извлечь записи из него.

Вы также передаете неправильную переменную на ваш вызов mysql_query. ваш SELECt находится в $query_cookie и вы проходите мимо $query.

1

Вы сделали маленькую ошибку:

$query_cookie = ("SELECT id FROM users WHERE email = '$email' OR username = '$username'"); 
$result_cookie = mysql_query($query_cookie); 
$row_cookie = mysql_fetch_array($result_cookie); 
1

Попробуйте это:

change $id = $row_cookie[id]; instead of $id = $row_cookie; 
0

Проверьте, если записи возвращаются или нет.

if(isset($_POST['remember'])) 
    { 
     $query_cookie = ("SELECT id FROM users WHERE email = '$email' OR username = '$username'"); 
     $result_cookie = mysql_query($query); 
     if($result_cookie === FALSE) { 
      echo "Could not successfully run query ($query) from DB: " . mysql_error(); 
      exit; 
     } 
     $row_cookie = mysql_fetch_array($result_cookie); // LINE 36 
     $id = $row_cookie; // Will be hashed before using 
     setcookie("Remember", $id, strtotime('+30 days')); 
     echo $id; 
    } 
+0

Почему люди злоупотребляют 'die()'? – itachi

Смежные вопросы