Я создаю страницу входа, где имя пользователя может быть как учеником, так и преподавателем, где имена учеников просто численные (т.е. 45678). Я создал функцию account_type($user)
которая просто возвращает "ученик", если $user
является числовой, и "учитель", если в противном случае.
Изменить. Чтобы уточнить, учащиеся будут вводить свой SID (т.е. 12345) для входа в систему, и поэтому моя функция account_type()
определит их как учащегося. Таким образом, запрос MySQL для доступа к учетной записи студента отличается от запроса доступа к учетной записи учителя, в котором требуется адрес электронной почты.
Вход в журнал работает отлично с указанными параметрами, но когда я пытаюсь использовать строку и ищу электронную почту, я получаю сообщение об ошибке:
Invalid parameter number: parameter was not defined
Я пробовал помещать кавычки вокруг :user
в запросе, но это не помогло. Я triple проверил, что запросы правильные, и они работают на MySQL. Любые идеи, что я должен делать? Очевидным ответом является использование mysqli или не использование именованных параметров, но я надеюсь, что он будет работать с именованными параметрами для более сложных запросов позже.
Вот мой код:
try {
$pdo = new PDO($dsn, DB_USERNAME, DB_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
die("Could not connect to database. " . $e->getMessage());
}
$user = mysqli_real_escape_string($link, $_POST['user']);
$pass = mysqli_real_escape_string($link, $_POST['pass']);
$account_Type = account_type($user);
if ($account_Type == "student") {
$query = "SELECT id, password FROM students WHERE sid = :user";
}
else if ($account_Type == "teacher") {
$query = "SELECT id, password FROM staff WHERE email = :user";
}
$stmt = $pdo->prepare($query);
$stmt->execute([
':user' => $user
]);
Заранее спасибо!
Существуют две функции:
mysqli_real_escape_string, который поддерживается в PHP 5 и 7 и должен использоваться с mysqli: http://php.net/manual/en/mysqli.real-escape-string.php
И mysql_real_escape_string, который устарел в PHP 5.5.0, и был удален в PHP 7.0.0, и вы можете использовать соединение mysqli: http://php.net/manual/en/function.mysql-real-escape-string.php
В комментариях к вашему вопросу вы разместили ссылку, которая использует mysql_real_escape_string, но в вашем коде вы используете mysql i _real_escape_string
Поэтому, если вы используете <PHP 7 или раньше, вы можете использовать mysql_real_escape_string для повышения безопасности без mysqli, например:
$user = mysql_real_escape_string($_POST['user']);
но если вы используете > PHP 7, то вы должны использовать mysqli, как в примере ниже:
<?php
//create a connection
$mysqli = new mysqli("localhost", "root", "", "school");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
//mysqli_real_escape_string is the procedural version of the function below
$user = $mysqli->real_escape_string('1');
$pass = $mysqli->real_escape_string('student1');
//verify if is a student or teacher
$is_student = is_numeric($user);
if ($is_student == true) {
$query = "SELECT sid, name, password FROM students WHERE sid =? AND password =?";
}
else {
$query = "SELECT sid, name, password FROM staff WHERE email =? AND password =?";
}
if ($stmt = $mysqli->prepare($query)) {
if($is_student){
//i for integer and s for string
$stmt->bind_param("is", $user, $pass);
}else{
//s for string and s for string
$stmt->bind_param("ss", $user, $pass );
}
$stmt->execute();
$stmt->bind_result($sid, $name, $password);
$stmt->fetch();
printf("sid: %s; name: %s; password: %s\n", $sid, $name, $password);
$stmt->close();
}
Надеюсь это поможет.
Если ваше соединение пуст ($link
), mysqli_real_escape_string($link, $_POST['user'])
вернет пустую строку.
Идентификатор соединения хранится в $pdo
.
Примените следующие изменения:
$user = mysqli_real_escape_string($pdo, $_POST['user']);
$pass = mysqli_real_escape_string($pdo, $_POST['pass']);
mysqli_real_escaoe_string
с PDO.
mysqli_real_escape_string
когда вы также используете подготовленный оператор PDO ?!var_dump($link);
вернуть? У вас не должно быть 2 соединений, и если вы не можете смешивать их функции.