2016-03-19 7 views
-1

私はoopを学び、pdoを使ってmysqlクエリを実行したいと思っています。私は実行したい機能の中にクエリを持っています。私がこれを行うと、エラーが発生します:pdoとoopを理解する

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

私は間違っていますか?

$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

あなたは質問を編集して**質問が意味をなさない**ようにしました。あなたは以下の答えの一部である 'global $ conn'を追加しました。質問を元の形式に戻してください。それは意味があり、将来の訪問者を助けるでしょう。 –

+1

PDOに関しては、いつも叙事詩であるこのガイドを参照してください。https://phpdelusions.net/pdo – DTH

答えて

1

testDuplicate関数内$conn変数は、関数のスコープ内に定義されていないため、この問題が発生します。

あなたはこれを行うことができます:

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

なぜですか?偶然や他の人のコードを使用しても、接続変数を単純に上書きすることはできないからです。より良い選択肢がありますが、これは簡単で安全な例です。

+0

ありがとう、今私は私の機能に他の問題もあることがわかります。今度はエラーが発生する致命的なエラー: 'SQLSTATE [HY000]:一般的なエラー:2014メッセージで'キャッチされない例外 'PDOException'他のバッファされていないクエリがアクティブな間にクエリを実行できません。 PDOStatement :: fetchAll()の使用を検討してください。あるいは、あなたのコードがmysqlに対してしか実行されない場合は、PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性を設定してクエリのバッファリングを有効にすることができます。 – user3514052

+1

あなたは 'exec'を使っています。これは' query'に変更します。[PDOStatement](http://php.net/manual/en/class.pdostatement.php)を返します。 fetchAll](http://php.net/manual/en/pdostatement.fetchall.php)をオンにします。その後、 'sizeof($ result-> fetchALl())> 0' – Xorifelse

+0

がありがとうございました。 :) – user3514052

関連する問題