第一坑:端口
来看一段代码:
$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