php Exception异常类备注

本文介绍了PHP中异常处理的基本方法,包括使用内置的Exception类来创建和处理异常。通过实例展示了如何定义异常处理函数并捕获异常,同时记录异常信息到日志文件。

<?php


function ExceptionLogger($exception)
{
    $file='ExceptionLog.log';  //定义log文件名
    file_put_contents($file,$exception->getMessage(),FILE_APPEND);//参数1,log文件名,参数2,获取的异常,参数3,写入方式
}
set_exception_handler('ExceptionLogger');//设置用户自定义的异常处理函数。处理函数必须在调用之前声明


throw new Exception('又抛出了');//抛出异常
会员注册要求按照下面示例进行编写通过post提交用户需要添加的信息到registerResult.php,将用户信息添加到数据库里 image.png (1)在registerResult.php页面通过post获取表单提交的数据 $userName 获取用户名称 $password 获取用户密码 $checkPwd 获取用户确认密码 (2)使用 PDO 方式,链接操作 MySQL 数据库,执行 insert 语句,将表单提交数据的用户名和密码,插入 admin 表 备注:数据表 admin 结构: id 自增序号 username 用户名 password 用户密码 对以下代码进行补充<?php header("content-type:text/html;charset=utf-8"); //$host,$dbname,$user,$pwd是自动生成的数据库相关信息,不能修改 //连接数据库时不需要写端口号 //数据库默认数据不能更改 $host = "mysql";//MySQL所在的服务器的IP $dbname = "database_46541_19_91471";//数据库名称 $user = "46541_19_91471";//数据库用户 $pwd = "54ff8238176b694a46b85e7981dfadb6";//数据库密码 示例:会员登录通过 post 提交用户信息到 loginUser.php,查询 admin 用户表用户数据,如果匹配的话登录成功 image.png 1)loginUser.php 页面通过 post 获取传递过来的参数 $userName 获取用户名称 $password 获取用户密码 2)使用 PDO 方式,连接 MySQL 数据库,通过表单提交数据的用户名和密码查询 admin 表,将通过fetch()查询出的结果集赋值给变量 $rs 备注:数据表 admin 结构: id 自增序号 username 用户名 password 用户密码 代码<?php header("content-type:text/html;charset=utf-8"); //$host,$dbname,$user,$pwd是自动生成的数据库相关信息,不能修改 //连接数据库时不需要写端口号 $host = "mysql";//MySQL所在的服务器的IP $dbname = "database_46551_19_91472";//数据库名称 $user = "46551_19_91472";//数据库用户 $pwd = "b89b80210837d4790dea8a9dd994dfc8";//数据库密码 $userName = $_POST['userName'] ?? ''; $password = $_POST['password'] ?? ''; $dsn = "mysql:host={$host};dbname={$dbname};"; $pdo = new PDO($dsn, $user, $pwd); $stmt = $pdo->prepare("SELECT * FROM admin WHERE username=? AND password=?"); $stmt->execute([$userName, $password]); $rs = $stmt->fetch(); // 4. 验证结果 if ($rs) { echo "登录成功"; } else { echo "用户名或密码错误"; }?>
06-13
<think>我们正在使用PHP和PDO实现用户注册功能,将数据插入到MySQL数据库的admin表中。根据引用内容,我们需要以下步骤:1.创建数据库连接(使用PDO)2.获取用户通过POST提交的用户名和密码3.对参数进行必要的验证(例如非空检查)4.准备SQL插入语句,使用预处理语句(PreparedStatement)来防止SQL注入5.绑定参数并执行插入操作6.根据执行结果给出反馈注意:根据引用[1],为了安全,我们应该禁用PDO的模拟预处理,设置错误模式为异常。同时,引用[4]也强调了预处理语句的重要性。另外,我们还需要考虑密码的安全存储。引用[3]中使用了`password_hash`函数进行密码加密,这是推荐的做法。因此,我们也会对密码进行哈希处理。下面我们将编写一个完整的注册页面(register.php)的代码示例。假设我们的数据库表名为`admin`,包含字段`admin_name`和`admin_password`。步骤:1.创建PDO连接,并设置属性(禁用模拟预处理,启用异常)2.检查POST请求,获取用户名和密码3.验证用户名和密码是否为空4.对密码进行哈希处理5.准备插入语句,使用命名占位符(:admin_name,:admin_password)6.绑定参数并执行7.根据执行结果输出成功或失败信息注意:在实际应用中,还应该检查用户名是否已经存在(如引用[3]中的`checkName`函数),但根据问题要求,我们只完成注册逻辑,这里为了简化,我们先不包含重复性检查,但会在代码中注释说明。完整代码示例:```php<?php//设置响应头为html,字符编码为utf-8header('Content-Type:text/html;charset=utf-8');//数据库配置$host='localhost';$dbname='your_database_name';//替换为你的数据库名$username='root';//替换为你的数据库用户名$password='root';//替换为你的数据库密码//创建PDO连接try{$pdo=newPDO("mysql:host=$host;dbname=$dbname;charset=utf8",$username,$password);//设置PDO属性:禁用模拟预处理,使用真正的预处理$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);//设置错误模式为异常$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException$e){die("数据库连接失败:".$e->getMessage());}//初始化变量$message='';//检查是否通过POST提交if($_SERVER['REQUEST_METHOD']=='POST'){//获取表单提交的数据$adminName=$_POST['admin_name']??'';$adminPassword=$_POST['admin_password']??'';$confirmPassword=$_POST['confirm_password']??'';//确认密码,用于验证两次输入是否一致//验证非空if(empty($adminName)||empty($adminPassword)||empty($confirmPassword)){$message='用户名、密码和确认密码不能为空!';}elseif($adminPassword!==$confirmPassword){$message='两次输入的密码不一致!';}else{//检查用户名是否已存在(可选,但推荐)try{$checkStmt=$pdo->prepare("SELECTadmin_nameFROMadminWHEREadmin_name=:admin_name");$checkStmt->bindParam(':admin_name',$adminName);$checkStmt->execute();if($checkStmt->fetch(PDO::FETCH_ASSOC)){$message='用户名已存在!';}else{//对密码进行哈希处理$passwordHash=password_hash($adminPassword,PASSWORD_BCRYPT);//准备插入语句$sql="INSERTINTOadmin(admin_name,admin_password)VALUES(:admin_name,:admin_password)";$stmt=$pdo->prepare($sql);//绑定参数$stmt->bindParam(':admin_name',$adminName);$stmt->bindParam(':admin_password',$passwordHash);//执行插入if($stmt->execute()){$message='注册成功!';//注册成功后的操作,例如跳转到登录页面//header("refresh:3;url=login.php");//3秒后跳转到登录页}else{$message='注册失败!';}}}catch(PDOException$e){$message='数据库操作错误:'.$e->getMessage();}}}?><!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>用户注册</title></head><body><h1>用户注册</h1><?phpif(!empty($message)):?><p><?phpecho$message;?></p><?phpendif;?><formmethod="post"><div><labelfor="admin_name">用户名:</label><inputtype="text"name="admin_name"id="admin_name"required></div><div><labelfor="admin_password">密码:</label><inputtype="password"name="admin_password"id="admin_password"required></div><div><labelfor="confirm_password">确认密码:</label><inputtype="password"name="confirm_password"id="confirm_password"required></div><div><buttontype="submit">注册</button></div></form></body></html>```代码说明:1.首先进行数据库连接,并设置PDO属性(禁用模拟预处理,启用异常)。2.检查是否为POST请求,如果是,则获取表单中的用户名、密码和确认密码。3.进行基本的验证:非空和两次密码一致性。4.检查用户名是否已经存在(避免重复注册)。5.如果用户名不存在,则对密码进行哈希处理(使用`password_hash`函数,采用`PASSWORD_BCRYPT`算法)。6.使用预处理语句插入数据,绑定参数,执行插入操作。7.根据操作结果输出提示信息。注意:在实际部署时,请替换数据库配置($host,$dbname,$username,$password)为实际的值。安全提示:-使用预处理语句有效防止SQL注入。-密码存储使用哈希处理,而不是明文存储。此示例包含了前端表单和后端处理逻辑,可以直接保存为一个PHP文件(如register.php)运行。相关问题:1.如何验证用户名是否已存在?2.密码哈希处理有哪些方法?为什么要使用`password_hash`?3.如何防止注册表单的重复提交?4.用户注册后如何实现自动登录?</think>### 如何通过PHP和PDO实现用户注册功能 下面是一个完整的用户注册实现方案,使用PDO预处理语句防止SQL注入,包含表单提交、参数验证和数据插入逻辑: ```php <?php // 注册页面 register.php session_start(); // 数据库配置 $host = 'localhost'; $dbname = 'your_database'; $username = 'db_username'; $password = 'db_password'; $error = ''; $success = ''; // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $adminName = trim($_POST['admin_name'] ?? ''); $adminPassword = trim($_POST['admin_password'] ?? ''); $confirmPassword = trim($_POST['confirm_password'] ?? ''); // 验证输入 if (empty($adminName) || empty($adminPassword)) { $error = '用户名和密码不能为空'; } elseif ($adminPassword !== $confirmPassword) { $error = '两次输入的密码不一致'; } elseif (strlen($adminPassword) < 6) { $error = '密码长度至少6位'; } else { try { // 创建PDO连接 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); // 禁用模拟预处理,使用真正的预处理语句[^1] $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 检查用户名是否已存在 $checkStmt = $pdo->prepare("SELECT admin_name FROM admin WHERE admin_name = :name"); $checkStmt->bindParam(':name', $adminName); $checkStmt->execute(); if ($checkStmt->fetch(PDO::FETCH_ASSOC)) { $error = '用户名已存在'; } else { // 密码哈希加密 $passwordHash = password_hash($adminPassword, PASSWORD_BCRYPT); // 准备插入语句 $sql = "INSERT INTO admin (admin_name, admin_password) VALUES (:name, :pass)"; $stmt = $pdo->prepare($sql); // 绑定参数 $stmt->bindParam(':name', $adminName); $stmt->bindParam(':pass', $passwordHash); // 执行插入 if ($stmt->execute()) { $success = '注册成功!'; // 可添加跳转逻辑:header('Location: login.php'); } else { $error = '注册失败,请重试'; } } } catch (PDOException $e) { $error = '数据库错误: ' . $e->getMessage(); } } } ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>会员注册</title> <style> .error { color: red; } .success { color: green; } </style> </head> <body> <h1>管理员注册</h1> <?php if ($error): ?> <p class="error"><?= htmlspecialchars($error) ?></p> <?php endif; ?> <?php if ($success): ?> <p class="success"><?= $success ?></p> <?php endif; ?> <form method="post"> <div> <label for="admin_name">用户名:</label> <input type="text" id="admin_name" name="admin_name" required value="<?= htmlspecialchars($_POST['admin_name'] ?? '') ?>"> </div> <div> <label for="admin_password">密码:</label> <input type="password" id="admin_password" name="admin_password" required> </div> <div> <label for="confirm_password">确认密码:</label> <input type="password" id="confirm_password" name="confirm_password" required> </div> <button type="submit">注册</button> </form> </body> </html> ``` ### 关键实现细节 1. **安全连接配置** ```php $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 禁用模拟预处理 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 启用错误异常 ``` 确保使用MySQL真正的预处理语句,防止SQL注入攻击[^1] 2. **密码安全处理** ```php $passwordHash = password_hash($adminPassword, PASSWORD_BCRYPT); ``` 使用`password_hash()`进行强哈希加密,推荐`PASSWORD_BCRYPT`算法 3. **参数化查询** ```php $stmt = $pdo->prepare("INSERT ... VALUES (:name, :pass)"); $stmt->bindParam(':name', $adminName); ``` 通过命名占位符绑定参数,彻底避免SQL注入[^4] 4. **输入验证** - 非空检查 - 密码长度验证(≥6位) - 密码一致性验证 - 用户名重复检查 5. **错误处理** - 使用`try/catch`捕获数据库异常 - 友好的用户错误提示 - HTML特殊字符转义(`htmlspecialchars()`) ### 数据库表结构建议 ```sql CREATE TABLE admin ( id INT AUTO_INCREMENT PRIMARY KEY, admin_name VARCHAR(50) NOT NULL UNIQUE, admin_password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### 安全增强建议 1. 添加验证码防止机器人注册 2. 实现密码强度策略(大小写字母、数字、特殊字符) 3. 记录注册IP和注册时间 4. 重要操作添加日志记录 5. 使用HTTPS传输数据
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值