标签归档:mysql

PHP使用数据库的并发问题

在并行系统中并发问题永远不可忽视。尽管PHP语言原生没有提供多线程机制,那并不意味着所有的操作都是线程安全的。尤其是在操作诸如订单、支付等业务系统中,更需要注意操作数据库的并发问题。

接下来我通过一个案例分析一下PHP操作数据库时并发问题的处理问题。

首先,我们有这样一张数据表:

继续阅读

PHP中PDO数据访问对象处理LIMIT子句的一处BUG

近期的项目中,数据访问层类使用了PDO作为底层,PDO相比mysql_*系列函数具有更高的性能和安全性。在使用时却发现了PDO对象处理带有LIMIT子句的SQL语句时,不能正确处理LIMIT子句中的占位符。例如:

$sql = "SELECT * FROM user LIMIT ?, ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(0, 20));
.... 

在这段代码中,按照PDO文档的说法,两个问号的位置将会被0, 20这两个参数填充,并且类型将会使用和参数类型相匹配的PDO数据类型。但是执行这条语句却返回一个空集合。

var_dump($stmt->fetchAll());
// 输出 empty 

然而将问号的位置直接填写数字,是可以正常取得20条记录的。

在谷歌上搜索发现,有其他人也遇到了同样的BUG:
继续阅读