MySQL PDO: неверный номер параметра: параметр не был определен - PullRequest
0 голосов
/ 26 июня 2018

Я создаю страницу входа, где имя пользователя может быть именем учащегося или учителя, где имена учеников просто числовые (т.е. 45678). Я сделал функцию account_type($user), которая просто возвращает «ученик», если $user числовой, и «учитель», если нет.

Изменить: Чтобы уточнить, учащиеся будут вводить свой SID (т. Е. 12345) для входа в систему, и поэтому моя функция account_type() определит, что они являются студентами. Таким образом, запрос MySQL для доступа к учетной записи учащегося отличается от запроса на доступ к учетной записи учителя, где требуется адрес электронной почты.

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

Invalid parameter number: parameter was not defined

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

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

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Есть две функции:

В комментариях к вашему вопросу вы разместили ссылку , в которой используется mysql_real_escape_string, но в вашем коде вы используете mysql i _real_escape_string

Поэтому, если вы используете или более раннюю версию, вы можете использовать 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();
    }

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

0 голосов
/ 26 июня 2018

Если ваше соединение пустое ($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']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...