了解pdo和oop

时间:2016-03-19 17:53:54

标签: php mysql pdo

我学习oop并希望使用pdo来执行mysql查询。我在函数内部有一个查询,我想执行。当我这样做时,我收到一个错误:

  

致命错误:在非对象上调用成员函数exec()

我做错了什么?

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

function testDuplicate($model) {

    $SQL = "SELECT product_id FROM " . DB_PREFIX . "product WHERE model LIKE '" .$model . "'";
    $result = $conn->exec($SQL);
    if ($result->rows) return false;
    return true;
  }

function testDuplicateCat($cat) {

    $SQL = "SELECT category_id FROM " . DB_PREFIX . "category WHERE category_id = '" .$cat . "'";
    $result = $conn->exec($SQL);
    if ($result->rows) return false;
    return true;
}

foreach ($xml->PRODUCT as $child) {

if(testDuplicate($child->ID)){

...

}

}

1 个答案:

答案 0 :(得分:1)

引发此问题是因为$conn函数中的testDuplicate变量未在函数范围内定义。

你可以这样做:

  function testDuplicate($model) {
    global $conn;
    ...
  }

然而,建议不能这样做,最好使用静态变量。

function getconn(){
  static $conn;
  if(!isset($conn)){
    $conn = new PDO(...);
  } 

  return $conn;
}

function foobar(){
  $result = getconn()->query($sql);
  while($row = $result->fetch()){
    $ids[] = $row['category_id'];
  }

  return sizeof($ids) > 0 ? $ids : false;
}

if(($list = foobar()) == false){
  echo "products " . var_export($list) . ' are duplicate values';
}

为什么呢?因为你不能简单地覆盖连接变量,即使偶然或使用别人的代码。有更好的选择,但这只是一个快速而安全的例子。