2016-03-19 18 views
-1

Mop öğrenmek ve mysql sorgusunu yürütmek için pdo kullanmak istiyorum. Yürütmek istediğim işlevin içinde bir sorgum var. Bunu yaptığımda bir hata iletisi alırım:pdo ve oop'u anlama

Fatal error: Call to a member function exec() on a non-object

Ne yapıyorum? testDuplicate işlevi içinde $conn değişken fonksiyonunun kapsamı içine tanımlı değil çünkü

$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

Soruyu şu şekilde düzenlediniz: ** soru artık anlam vermiyor ** artık. Aşağıdaki yanıtın bir parçası olan 'global $ conn' içine eklediniz. Lütfen soruyu orijinal formuna geri koyun, bu yüzden mantıklı ve gelecekteki ziyaretçilere yardımcı olacaktır. –

+1

PDO'ya gelince, her zaman bu kılavuza bakın, ki bu epik https://phpdelusions.net/pdo – DTH

cevap

1

Bu sorun yükseltilir.

Bunu yapabilirsiniz:

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

bunu yapabilmek tavsiye edilmez Ancak, onun daha iyi statik değişkenleri kullanmak.

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'; 
} 

Neden? Çünkü, bağlantı değişkeninin üzerine, kazayla bile olsa veya bir başkasının kodunu kullanarak yazamazsınız. Daha iyi alternatifler var ama bu sadece hızlı ve güvenli bir örnek.

+0

teşekkür ederim, şimdi görüyorum ki fonksiyonumda başka problemler de var. Şimdi bu hatayı alıyorum Önemli hata: 'SQLOSTATE [HY000] iletisiyle yakalanmamış özel durum' PDOException ': Genel hata: 2014 Diğer arabelleğe almayan sorgular etkinken sorgular yürütülemiyor. PDOStatement :: fetchAll() öğesini kullanmayı düşünün. Alternatif olarak, kodunuz yalnızca mysql'e karşı çalıştırılacaksa, PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY özniteliğini ayarlayarak sorgu arabelleklemeyi etkinleştirebilirsiniz. – user3514052

+1

içinde 'exec' kullanıyorsunuz, bunu yapmak için kullanabileceğiniz bir [PDOStatement] (http://php.net/manual/en/class.pdostatement.php) döndürdüğü için' 'query' olarak değiştirin. fetchAll] (http://php.net/manual/en/pdostatement.fetchall.php) açık. Daha sonra, 'sizeof ($ result-> fetchALl())> 0' – Xorifelse

+0

' a çok teşekkür ederim, şimdi işe yarıyor! :) – user3514052