MySQL PDO:参数编号无效:未定义参数



我正在构建一个登录页面,其中用户名可以是学生或教师的用户名,其中学生姓名只是数字(即 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
]);

提前感谢!

有两个函数:

  • mysqli_real_escape_stringPHP 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的链接,但在您的代码中,您使用的是 mysqli_real_escape_string

因此,如果您使用的是PHP 7 <</strong>或更早版本,您可以使用 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: %sn", 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: %sn", $sid, $name, $password);
$stmt->close();
}

希望这有帮助。

最新更新