PDO的两个“坑”:端口和bindParam

PDO的两个“坑”:端口和bindParam

第一坑:端口

来看一段代码:

$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