一,遇到问题
pdo这东西搞过很长时间了,熟啊。但是呢,昨天写了一个小代码,同步一下数据,出问题了。
foreach($result as $tmp){
$sqlcheck = "select attribute_id from eav_attribute " .
" where eav_attribute.attribute_code=:attribute_code " .
" and eav_attribute.entity_type_id=:entity_type_id";
$sthcheck = $dbh1->prepare($sqlcheck);
$sthcheck->execute(array('attribute_code'=>$tmp['attribute_code'],'entity_type_id'=>$tmp['entity_type_id']));
$col = $sthcheck->fetch(PDO::FETCH_ASSOC);
// $sql_update = "update catalog_eav_attribute set attribute_id=".$col['attribute_id']." where attribute_id=".$tmp['attribute_id']." ";
// $aaa = $dbh1->exec($sql_update);
$sql_update = "update catalog_eav_attribute set attribute_id = ? where attribute_id = ? ";
$sthupdate = $dbh1->prepare($sql_update);
$aaa=$sthupdate->execute(array($col['attribute_id'],$tmp['attribute_id']));
var_dump($aaa);
if($aaa){
echo "success<br>";
}else{
echo "fail<br>";
}
}
我要更新一下表数据,在windows下面搞死,我用二种方法都试一下都不行,insert也一样不行。我对自己还产生怀疑了,是不是我把pdo的方法记错了,我找了一下pdo的手册,我看了看没错了。郁闷。
二,问题解决
我把代码COPY到linux的环境中,就改了一下,DNS里面的host所对应的IP地址,其他一个字都没动,好了。搞得我很无语。我分几步做了分析:
1,我在window下面去看了一下apache的log,什么报错没有
2,是不是有可能是pdo版本的不同
windows下面pdo
linux下面pdo
3,php版本不同
windows下面的php版本是5.2.0
linux下面的php版本是5.2.6
4,系统不同,一个win,一个linux不过我觉得根系统肯定没多大关系。很可能是php版本和pdo版本不同造成的。
三,pdo的一些简单用法
1,数据库连接
<?php
$dsn = 'mysql:dbname=test1;host=localhost;port=3306';
$user="dbadmin";
$pwd="*****";
$dbh = new PDO($dsn, $user, $pwd);
?>
2,数据查寻
a)用query
<?php
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($conn->query($sql) as $row) {
print $row['name'] . "\t";
print $row['color'] . "\t";
print $row['calories'] . "\n";
}
?>
b)用prepare
<?php
$sqlcheck = "select attribute_id from eav_attribute " .
" where eav_attribute.attribute_code=:attribute_code " .
" and eav_attribute.entity_type_id=:entity_type_id";
//sql语句中的attribute_code对应execute数组中的KEY
$sthcheck = $dbh1->prepare($sqlcheck);
$sthcheck->execute(array('attribute_code'=>$tmp['attribute_code'],'entity_type_id'=>$tmp['entity_type_id']));
$col = $sthcheck->fetch(PDO::FETCH_ASSOC);
?>
c)对比一下b)中sql
<?php
$sqlcheck = "select attribute_id from eav_attribute " .
" where eav_attribute.attribute_code=? " .
" and eav_attribute.entity_type_id=?";
//sql语句中的attribute_code对应execute数组中的KEY
$sthcheck = $dbh1->prepare($sqlcheck);
$sthcheck->execute(array($tmp['attribute_code'],$tmp['entity_type_id']));
$col = $sthcheck->fetch(PDO::FETCH_ASSOC);
?>
3,数据更新/插入
a)
$sql_update = "update catalog_eav_attribute set attribute_id = ? where attribute_id = ? ";
$sthupdate = $dbh1->prepare($sql_update);
$aaa=$sthupdate->execute(array($col['attribute_id'],$tmp['attribute_id']));
b)
$sql_update = "update catalog_eav_attribute set attribute_id = :aaa where attribute_id = :bbb ";
$sthupdate = $dbh1->prepare($sql_update);
$aaa=$sthupdate->execute(array("aaa"=>$col['attribute_id'],"bbb"=>$tmp['attribute_id']));
c)
$sql_update = "update catalog_eav_attribute set attribute_id = ".$col['attribute_id']." where attribute_id = ".$tmp['attribute_id']." ";
$sthupdate = $dbh1->exec($sql_update);
这里以update为例,插入的话,把sql变一下就行了。
4,数据删除
$count = $dbh->exec("DELETE FROM catalog_eav_attribute WHERE attribute_id = 23");
5,取得刚插入数据的ID
function pgsqlLastInsertId($sqlQuery, $pdoObject)
{
// Checks if query is an insert and gets table name
if( preg_match("/^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)/is", $sqlQuery, $tablename) )
{
// Gets this table's last sequence value
$query = "SELECT currval('" . $tablename[1] . "_id_seq') AS last_value";
$sql = 'INSERT INTO table (column) VALUES (\'some_value\');';
$result = $pdoObject->prepare($sql);
$result->execute();
6,查看报错信息
$stmt = $dbh->prepare($sql);
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
还有好多,只举了几个常用的例子,里面的东西还是要自己去实践的。
四,用pdo有什么优点,个人一些看法
1,它能接好多数据库,现有的数据库绝大多数都可以用PDO来连,并且是统一的接口
2,用pdo来封装sql语句很方便。从开发者的工作效率来说会很高,prepare的sql语句当中可以不含有变量,这个挺爽的
3,用pdo封装sql后,对于做memcache也方便了好多,比如直接拿hash过的sql做key。最直接,最土的方法。
echo 'Last Insert ID: ' . pgsqlLastInsertId($sql, $pdoObject);
$temp_q_id = $pdoObject->prepare($query);
$temp_q_id->execute();
if($temp_q_id)
{
$temp_result = $temp_q_id->fetch(PDO::FETCH_ASSOC);
return ( $temp_result ) ? $temp_result['last_value'] : false;
}
}
return false;
} |