数据库,字符流和异常处理

说实话,今天的数据库这章不是很满意,感觉讲的还不是很具体,有时间我还要单独看下数据库。还有两块字符流和异常的处理写的还行,不过异常处理以前有看过一点。

数据库

  • 这里建议直接使用 PDO 了,而且不要过多的写某些其他数据库特有的特性,这样如果以后从这个数据库变更到其他数据库时可能要改很多代码。
  • 还有就是数据库的配置文件单独放一块,不要和核心代码放在一起,要不然上传仓库或者被别人攻击的时候很容易将密码泄漏出去。
  • 千万!千万!不要忘了将字符集设置为 UTF-8 ,要不然会出现乱码和很多不兼容问题。
  • 要进行 SQL 语句的预处理,防止 SQL 注入。这里用预处理防 SQL 注入的原理是 PDO 会先将预处理语句解析成 SQL 模板,然后再接受你的值,这时候如果你的值里有 SQL 语句了也没用了,因为语句已经解析出来了,你已经改不了了,只能填值。

简单配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
require(dirname(__FILE__).'/../settings.php');
// var_dump('../settings.php');
$pdo = new PDO(
sprintf(
'mysql:host=%s;dbname=%s;port=%s;charset=%s',
$settings['host'],
$settings['name'],
$settings['port'],
$settings['charset']
),
$settings['username'],
$settings['password']
);
?>

下面是预处理语句

1
2
3
4
5
6
7
8
9
<?php
$sql = 'SELECT email FROM users WHERE id = :id';
$statement = $pdo->prepare($sql);//预处理,解析成 sql 模板

// $userId = filter_input('1', 'id');
$userId = 1;
$statement->bindValue(':id', $userId ,PDO::PARAM_INT);//绑定模板里的值
$statement->execute();//执行语句
?>

循环输出值

1
2
3
4
5
6
<?php
while (($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {
echo $result['email'];
}
var_dump($pdo);
?>

字符流处理

1
2
3
4
5
6
7
8
<?php
$handle = fopen(dirname(__FILE__).'\text.txt', 'rb');
// var_dump($handle);
while (feof($handle) !== true) {
echo fgets($handle);
}
fclose($handle);
?>

简单的写了个例子,大致是 file_get_contents(),fopen(),fgets(),fwrite()这些函数的使用。

异常处理

可以自己 new 一些异常,debug 的时候可以定位的更精确一点,也容易解决一些问题

1
2
3
4
5
<?php
$exception = new Exception('Danger, Robinson!', 100);
echo $exception->getCode();
echo $exception->getMessage();
?>

多使用 try-catch 语句块捕获异常,以及出现异常后的处理方法

1
2
3
4
5
6
7
8
9
10
11
<?php
try {
$pdo = new PDO('mysql://host=wronghost;dbname=wrong_name');
} catch (Exception $e) {
echo $e->getCode();
echo PHP_EOL;
echo $e->getMessage();
}finally {
echo PHP_EOL."alwayys";
}
?>

那个 filp/whoops 组件真不错,laravel5.5 好像也要用这个了。

最后

明天开始看最后一大块内容,大概需要四天左右,是关于部署,开发和测试的内容。