第一坑:端口
来看一段代码:
$dsn='mysql:host='.$dbhost.':'.$dbport.';dbname='.$this->dbName.';charset=utf8';
try {
$this->linkID=new PDO($dsn,$this->dbUser,$this->dbPwd); //初始化PDO
} catch (PDOException $e) {
$this->DisplayError('Fail to connect to Database Server');
}
此时,如果 $dbhost 是 127.0.0.1,$dbport 是 3306,是无论如何也链接不上的,进行var_dump($e)后,才发现错误提示是 “未知主机 127.0.0.1:3306”
于是到 OSC 上提问,得到答案:
如果要加端口,需要这样:
$dsn='mysql:host=127.0.0.1;port=3306;
第二坑:bindParam
还是上一段代码:
$st=$this->linkID->prepare($sql);
foreach ($where['bind'] as $keyid=>$val) $st->bindParam($keyid+1,$val);
看上去没什么问题?错!
一个条件的时候自然是没有问题的,但是有两个以上的条件,就会出问题,因为 bindParam 是一个引用,而不是变量的值。所以,在使用 bindParam 的时候,尤其要注意和 foreach 联合使用的这个陷阱。那么正确的作法呢?
- 不用 foreach, 而是手动赋值
$statement->bindParam(1,$where\['bind'\]\[0\]); $statement->bindParam(2,$where\['bind'\]\[1\]);
-
用 bindValue 代替 bindParam(推荐)
-
用 foreach 和 reference (不推荐)
foreach ($where\['bind'\] as $keyid=>&$val) $st->bindParam($keyid+1,$val); //注意有个&
小结
最近在开发一个智能家居的项目,有兴趣的可以去看看:Git@OSC