我学习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)){
...
}
}
答案 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';
}
为什么呢?因为你不能简单地覆盖连接变量,即使偶然或使用别人的代码。有更好的选择,但这只是一个快速而安全的例子。