bindParam & amp; bindValue не работает?

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

$username = $_POST['uLogin'];
$usernameLC = strtolower($username);
$query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin=':login';");
$query1->bindValue(":login", $usernameLC, PDO::PARAM_STR);

Но это не работает. Я могу создать столько пользователей с тем же именем пользователя, сколько захочу. Кроме того, он также не позволяет мне подключаться к веб-сайту, поскольку он не привязывает значения или что-либо еще, поэтому он не может сравнивать мое имя пользователя с именем в БД.

Проверка, если имя пользователя не используется, когда я использовал его, как это

$username = $_POST['uLogin'];
$usernameLC = strtolower($username);
$query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin='$usernameLC';");

Но это не правильный путь: /

Кто-нибудь может помочь? 🙂

3

Решение

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

$query1 = $db0->prepare("SELECT userLogin FROM tbuser WHERE userLogin= :login");

затем $query1->execute(), подготовленное заявление после привязки, итого всего:

$username = $_POST['uLogin'];
$usernameLC = strtolower($username);
$query1 = $db0->prepare('SELECT userLogin FROM tbuser WHERE userLogin = :login'); // prepare
$query1->bindValue(':login', $usernameLC, PDO::PARAM_STR); // bind
$query1->execute(); // execute
5

Другие решения

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

userLogin=':login'

как

userLogin=:login

«Проверка, если имя пользователя не работает, когда я использовал его, как это»

WHERE userLogin='$usernameLC'
  • Вы должны удалить кавычки в привязке, как уже было указано сверху, и убедитесь, что вы используете PDO для подключения, как указано ниже; если это тот случай.

С помощью setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) сигнализировал бы об ошибках синтаксиса.

Узнайте, как использовать подготовленные операторы в PDO, чтобы подготовить и выполнить:


Понимание:

Убедитесь, что вы действительно используете соединение PDO, а не mysqliна основе (неизвестно). Я часто вижу подобные вопросы, где используются ОП mysqli_ связаться с и запросить с PDO.

Эти разные API MySQL не смешиваются друг с другом.

Если вы используете mysqli_ Чтобы связаться с:


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

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

Примечание: Отчеты об ошибках должны выполняться только на стадии подготовки, а не на производстве.


Редактировать:

«Спасибо, это прекрасно работает. Хотя при входе в систему сравнение отправленного пароля с паролем в БД возвращает false. Я пытаюсь сохранить полученный пароль в $ _SESSION [‘test’], чтобы увидеть, что он получает, и print_r ($ _ SESSION); возвращает; мне это: Array ([test] => Array ([userPwd] => test12 [0] => test12)) (test12 — мой пароль, userPwd — поле пароля в БД) Есть идеи? ^^ «

Что касается комментария, который вы оставили об использовании паролей.

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

Смотрите это Q&А на стеке по хешированным паролям:

Использование PHP password_hash() функция и password_verify() функция.

Для PHP < 5.5 использовать password_hash() compatibility pack.


Примечание о типе и длине столбца при хранении хешированного пароля.

  • Столбец пароля должен быть VARCHAR,
  • Он также должен быть достаточно длинным, чтобы хранить хеш.
  • С помощью VARCHAR(255) лучший.
8