首页 > 解决方案 > MySQL PDO:参数号无效:未定义参数

问题描述

我正在构建一个登录页面,其中用户名可以是学生或教师的用户名,其中学生姓名只是数字(即 45678)。我制作了一个函数account_type($user),如果是数字则只返回“student” $user,否则返回“teacher”。

编辑:为了澄清,学生将输入他们的 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
]);

提前致谢!

标签: phpmysqlpdo

解决方案


有两个功能:

在您的问题的评论中,您发布了一个使用 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();
    }

希望这可以帮助。


推荐阅读