MySQL PDO: неверный номер параметра: параметр не был определен

0

Я создаю страницу входа, где имя пользователя может быть как учеником, так и преподавателем, где имена учеников просто численные (т.е. 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
]);

Заранее спасибо!

  • 1
    Почему вы используете mysqli_real_escape_string когда вы также используете подготовленный оператор PDO ?!
  • 1
    Вы используете PDO или MySQL? Что делает var_dump($link); вернуть? У вас не должно быть 2 соединений, и если вы не можете смешивать их функции.
Показать ещё 4 комментария
Теги:
pdo

2 ответа

0

Существуют две функции:

В комментариях к вашему вопросу вы разместили ссылку, которая использует 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();
    }

Надеюсь это поможет.

-2

Если ваше соединение пуст ($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']);
  • 0
    Ну, ссылка $ на самом деле не пустая, она установлена в отдельном файле. Я могу подтвердить это, потому что я могу повторить $ pass после того, как он установлен
  • 1
    Вы не можете использовать mysqli_real_escaoe_string с PDO.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню