PHP复习_PDO数据库连接属性和防SQL注入

博客介绍了数据库操作相关内容。通过getAttribute()可设置数据库连接属性,如自动提交、错误处理模式等,部分属性可能因数据库驱动不支持而不存在。还提到用quote()方法防止SQL注入,强调要过滤用户输入的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

getAttribute()设置数据库连接属性

PHP复习_PDO数据库连接属性和防SQL注入24.png

先确认可以得到那些属性,然后在设置一下

PHP复习_PDO数据库连接属性和防SQL注入46.png

PHP复习_PDO数据库连接属性和防SQL注入48.png

1表示默认情况下自动提交时开启的

 

PHP复习_PDO数据库连接属性和防SQL注入68.png

PHP复习_PDO数据库连接属性和防SQL注入70.png

0代表错误模式默认的是静默模式

 

那么,我们可以通过setAttribute()设置自动提交的属性为0

PHP复习_PDO数据库连接属性和防SQL注入124.png

那么,我们可以设置哪些属性呢??

PHP复习_PDO数据库连接属性和防SQL注入143.png

PHP复习_PDO数据库连接属性和防SQL注入145.png

常用的是前三个:

第一个是是否自动提交PDO::ATTR_AUTOCOMMIT,自动提交为1,否则为0

第二个是错误处理模式PDO::ATTR_ERRMODE,静默模式为0

第三个是字段名称是否大小写转换PDO::ATTR_CASE,不开启大小写为0

 

注意:如果部分属性是没有的,表示数据库驱动不支持这种属性

PHP复习_PDO数据库连接属性和防SQL注入303.png

数据库的一些链接属性可以放在$options

PHP复习_PDO数据库连接属性和防SQL注入329.png

 

 

quote()方法防止SQL注入

PHP复习_PDO数据库连接属性和防SQL注入350.png

PHP复习_PDO数据库连接属性和防SQL注入352.png

一定要过滤用户输入的数据

PHP复习_PDO数据库连接属性和防SQL注入367.png

PHP复习_PDO数据库连接属性和防SQL注入369.png

 

 

 

<think>好的,用户之前已经询问过PHP连接数据库并执行查询的代码示例,我给出了详细的回答,包括使用PDO连接MySQLAccess的例子。现在用户再次提出同样的问题,可能是在复习时需要更多的示例或不同的方法。需要结合用户提供的引用内容,看看是否有其他方式可以补充,比如使用mysqli面向对象的方式,或者ThinkPHP8的配置方法。 用户提供的引用中提到了不同的方法,比如引用24中的mysqli面向对象方式,引用3中的ThinkPHP8配置,引用5中的基础连接参数设置。虽然用户的主要需求是PHP原生代码,但可能需要覆盖不同的扩展,比如PDOmysqli,并比较它们的优缺点。此外,用户可能希望代码示例更全面,包含错误处理最佳实践,比如预处理语句SQL注入。 需要确保回答结构清晰,分点说明不同方法,并强调安全性,比如使用预处理。同时,注意用户之前的回答中已经提到了PDOAccess的例子,这次可能需要补充mysqli的方式,以及ThinkPHP框架的示例,但用户可能主要关注原生PHP,所以可能将框架部分作为扩展内容简要提及。 另外,用户提供的引用中有一些代码片段,需要检查是否有重复或需要补充的地方。例如,引用4中的mysqli示例可以整合到回答中,作为另一种连接方式。同时,要确保所有代码示例符合当前的最佳实践,比如使用异常处理、正确的字符集设置等。 最后,生成相关问题时要围绕连接方式、错误处理、预处理语句、事务处理等方面,帮助用户深入复习相关知识点。</think>### PHP连接数据库及执行查询的代码示例(MySQL) 以下是基于原生PHP的两种主流数据库连接方式(**PDO****mysqli**)的代码示例,包含错误处理安全实践。 --- #### 方式一:使用PDO扩展(推荐) ```php <?php // 数据库配置 $servername = "localhost"; $username = "root"; $password = ""; $dbname = "test_db"; try { // 1. 创建PDO连接(启用异常处理) $pdo = new PDO( "mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); // 2. 使用预处理语句执行查询(SQL注入) $sql = "SELECT * FROM users WHERE email = :email"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':email', 'user@example.com', PDO::PARAM_STR); $stmt->execute(); // 3. 获取结果(关联数组格式) $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "用户名: {$row['username']}, 邮箱: {$row['email']}<br>"; } } catch (PDOException $e) { // 4. 错误处理 die("数据库连接失败: " . $e->getMessage()); } ?> ``` --- #### 方式二:使用mysqli扩展(面向对象方式) ```php <?php // 数据库配置 $servername = "localhost"; $username = "root"; $password = ""; $dbname = "test_db"; // 1. 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 2. 检查连接是否成功 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 3. 使用预处理语句(SQL注入) $sql = "SELECT id, username FROM users WHERE age > ?"; $stmt = $conn->prepare($sql); $minAge = 18; $stmt->bind_param("i", $minAge); $stmt->execute(); // 4. 获取结果 $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { echo "ID: {$row['id']}, 用户名: {$row['username']}<br>"; } } else { echo "未找到记录"; } // 5. 关闭连接 $stmt->close(); $conn->close(); ?> ``` --- ### 关键点说明 1. **PDO优势** - 支持多种数据库(MySQL、PostgreSQL等) - 内置预处理语句异常处理[^1] - 推荐用于新项目开发 2. **安全实践** - 必须使用预处理语句(`prepare` + `bindParam`)SQL注入攻击[^2] - 设置字符集(如`utf8mb4`)避免乱码 3. **错误处理** - PDO需设置`ERRMODE_EXCEPTION`以捕获异常[^1] - mysqli通过`connect_error`属性检查连接状态 --- ### 扩展:ThinkPHP8框架示例 ```php // 1. 配置数据库(config/database.php) return [ 'default' => 'mysql', 'connections' => [ 'mysql' => [ 'type' => 'mysql', 'hostname' => '127.0.0.1', 'database' => 'test_db', 'username' => 'root', 'password' => '', 'charset' => 'utf8mb4', ], ], ]; // 2. 控制器中查询数据 use think\Model; class User extends Model { protected $table = 'users'; } // 查询年龄大于18的用户 $users = User::where('age', '>', 18)->select(); foreach ($users as $user) { echo $user->username; } ``` --- ### 常见问题解答 **Q1: 连接数据库时出现`Access denied`错误?** - 检查用户名/密码是否正确 - 确认数据库用户是否拥有远程连接权限(若连接非本地数据库) **Q2: 为什么推荐PDO而不是mysqli?** PDO提供统一的数据库操作接口,支持预处理事务管理,适合需要跨数据库迁移的项目[^1][^4]。 **Q3: 如何SQL注入攻击?** 务必使用预处理语句绑定参数,避免直接拼接SQL字符串(如`$sql = "SELECT * FROM users WHERE id = $_GET[id]"`是危险操作)[^2][^4]。 --- ### 相关问题 1. 如何在PHP中处理数据库事务? 2. PDOmysqli预处理语句的实现原理有何不同? 3. 如何优化PHP连接数据库的性能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值