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