资讯专栏INFORMATION COLUMN

PHP最佳实践之数据库

cnTomato / 1650人阅读

摘要:扩展原生提供了扩展,意思是数据对象。数据库链接和是指数据源名称,提供数据库链接的详细信息。如果数据库需要认证,则需要提供这两个参数。让和返回一个对象,对象的属性是数据库的列名。事务的原子性能保证数据的一致性安全性和持久性。

PDO扩展

PHP原生提供了PDO扩展,意思是PHP数据对象。

数据库链接和DSN

DSN是指数据源名称,提供数据库链接的详细信息。一般包含以下信息:

主机名或者IP地址

端口号

数据库名

字符集

以上信息构成的DSN可以用于PDO类构造函数的第一个参数,第二个和第三个参数分别是数据库的用户名和密码。如果数据库需要认证,则需要提供这两个 参数。


保证密码凭证的安全

把数据库凭证保存在一个位于文档根目录之外的配置文件中,然后在需要的文件中导入这个文件。

预处理语句

在SQL中使用用户的输入时,一定要过滤。因此需要使用PDO扩展的预处理语句和参数绑定,这项操作非常简单。预处理语句是PDO对象的实例,不过我们很少直接去实例化这个类,而是通过PDO实例的prepare方法获得预处理语句的对象。这个方法得第一个参数是一个sql语句字符串,返回值是一个PDOStatement实例:

prepare($sql);

在这个SQL语句中,email这个值可以安全的绑定任何值。

prepare($sql);
$email =  filter_input(INPUT_GET, "email");
$statement->bindValue(":email", $email);

预处理语句会自动过滤$email的值。PDOStatement的第三个参数可以制定绑定值的类型,不填的话默认就是字符串类型。可选的常量类型如下

PDO::PARAM_BOOL

PDO::PARAM_NULL

PDO::PARAM_INT

PDO::PARAM_STR(默认值)

查询结果

如果执行的是select方法,返回的数据我们需要使用fetch()、fetchAll()、fetchColumn()和fetchObject()方法获取查询结果。

//把预处理语句获得的结果当成关联数组处理
$sql = "SELECT id, email FROM users WHERE email = :email";
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, "email");
$statement->bindValue(":email", $email);
$statement->execute();
//迭代结果
while(($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {
    echo $result["email"];
}

fetch、fetchAll方法的参数可选

PDO::FETCH_ASSOC:返回一个关联数组

PDO::FETCH_NUM:返回一个键为数字的数组,数组的键是数据库列在查询结果中的索引

PDO::FETCH_BOTH:返回一个既有键为列名又有键为数字的数组。

PDO::FETCH_OBJ:让fetch()和fetchAll()返回一个对象,对象的属性是数据库的列名。
不推荐使用fetchAll(),除非你可以十分确定可用内存放得下整个查询结果。如果只关心查询结果中的一列,可以使用fetchColumn()方法,这个方法的作用和fetch()方法类似,返回查询结果中下一行的某一列,该方法只有一个参数用于制定所需要的索引。

// 构建并执行SQL查询
$sql = "SELECT id, name FROM users WHERE email = :email";
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, "email");
$statement->bindValue(":email",  $email);
$statement->execute();

while(($emal = $statament->fetchCoulmn(1)) !== false) {
    echo $email;
}

因为在SQL语句中,email出现在了第二个字段的位置,所以这里使用索引1取出来。我们还可以使用fetchObj()方法来获取查询结果中的行,这个方法把行行当成对象,对象的属性是查询结果中的列。

// 构建并执行SQL查询
$sql = "SELECT id, name FROM users WHERE email = :email";
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, "email");
$statement->bindValue(":email",  $email);
$statement->execute();

while(($result = $statament->fetchObj()) !== false) {
    echo $result->email;
}
事务

事务是指把一系列数据库语句当成单个的逻辑执行单元执行,也就是说事务中的一系列SQL查询要么都成功,要么不执行。事务的原子性能保证数据的一致性、安全性和持久性。事务还有一个很好的副作用就是提升性能,因为事务是把多个查询排成队列,一次性全部执行。

专题系列

PHP专题系列目录地址:https://github.com/xx19941215/webBlog
PHP专题系列预计写二十篇左右,主要总结我们日常PHP开发中容易忽略的基础知识和现代PHP开发中关于规范、部署、优化的一些实战性建议,同时还有对Javascript语言特点的深入研究。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23290.html

相关文章

  • PHP最佳实践过滤、验证、转义和密码

    摘要:过滤验证和转义不要相信任何来自不受自己直接控制的数据源中的数据。加密和哈希不是一回事,加密是双向算法,加密的数据可以被解密。使用密码哈希简化计算密码哈希和验证密码的操作。密码的哈希值存储在类型的数据库列中。 过滤、验证和转义 1).不要相信任何来自不受自己直接控制的数据源中的数据。包括但不限于: $_GET $_POST $_REQUEST $_COOKIE $argv php://...

    HitenDev 评论0 收藏0
  • PHP最佳实践多字节字符串、字符编码

    摘要:多字节字符串假设字符串中的每一个字符都是八位字符,占用一个字节的内存。如果使用原生的字符串函数处理这些多字节字符串,会得到意外的错误。字符编码一定要知道数据的字符编码。扩展不仅可以处理字符串,还可以在不同的字符编码之间转换多字节字符串。 多字节字符串 1).PHP假设字符串中的每一个字符都是八位字符,占用一个字节的内存。但是,你有可能会遇到多字节字符串。2).这里所说的多字节字符串是指...

    Cympros 评论0 收藏0
  • PHP最佳实践系列标准

    摘要:框架之间通过接口自动加载和标准的编码风格进行合作。该规范的精髓是把命名空间的前缀和系统中的目录对应起来。 PHP-FIG 1).即PHP Framework Interop Group。这个组织发布推荐的规范,而不是强制规范。2).PHP-FIG的使命是实现框架的互操作性。框架的互操作性指的是通过自动加载机制、接口和标准的风格,让框架互相合作。3).框架之间通过接口、自动加载和标准的编...

    DoINsiSt 评论0 收藏0
  • PHP最佳实践异常和错误

    摘要:预测和捕获并处理异常是我们自己的责任,因为未捕获的异常可能会导致应用终止运行,显示错误信息。处理并记录异常你的代码还原成之前的异常处理程序错误我们可以使用函数或者在文件中使用指令告诉报告或者忽略那些错误。 异常 1).异常是Exception类的对象,在遇到无法修复的状况时抛出,例如远程API没有响应或者数据库查询失败再或者是无法满足程序运行的前置条件。出现问题的时候异常用于主动出击,...

    TigerChain 评论0 收藏0
  • PHP最佳实践上线准备

    摘要:简单来说,就是我们创建一对密钥,其中一个是私钥保存在本地设备中,另一个是公钥,传到你的中,之所以叫做密钥对,是因为使用公钥加密的消息只能使用对应的私钥解密。 配置 1).如果你使用的不是Pass,那么先配置VPS或者专用的服务器才能运行PHP应用。本文假设你会使用vim或者nano编辑器。2).我们选择nginx服务器来作为我们的web服务器。 首次登录 ssh root@123.45...

    sumory 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<