php - 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
]);
提前致谢!
解决方案
有两个功能:
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();
}
希望这可以帮助。
推荐阅读
- hook-woocommerce - 如果我想在 Woocommerce 批量编辑页面上更改我的自定义价格,我可以使用哪种挂钩?
- elasticsearch - 如何在弹性搜索中按月分组
- elasticsearch - 如何通过对象键而不是对象属性使用 Elastic Search 嵌套查询
- php - Laravel 中的这种 SQL 语法有什么问题?
- python - 熊猫在一列中的累积减法
- json - Flutter 中使用 Json_Serializable 进行本地 JSON 反序列化
- python - 如何更改字母的颜色?
- javascript - 重构 MongoDB $lookup Query 的数据。
- swift - 应用不断被 user_friends 拒绝 - Facebook
- android - 导航栏覆盖颜色