0

私の意見では、私は奇妙な問題を抱えています。以下の部分は正常に動作します


$sql = "
    UPDATE 
        ".$table[0]."
    SET 
        p_title = '".$_POST['p_title']."', 
        p_date = '".$_POST['p_date']."' 
    WHERE 
        p_id = '".$_POST['p_id']."'
";
if(!$db->exec($sql)){
    echo($defaults->throwError('MySql error',$sql,implode(":",$db->errorInfo())));
}else{
    $defaults->writeLog($table,$db->lastInsertId(),'update');
}

しかし、以下のコードを試すと、「致命的なエラー: 非オブジェクトのメンバー関数 exec() への呼び出し」が表示されます。


class Defaults{
    [..]
    public function query($sql){
        if(!$db->exec($sql)){
            echo($defaults->throwError('MySql error',$sql,implode(":",$db->errorInfo())));
        }else{
            $defaults->writeLog($table,$db->lastInsertId(),'update');
        }
    }
    [..]
}

そしてマイページへ


$defaults = new Defaults();
$defaults->query("
    UPDATE 
        ".$table[0]."
    SET 
        p_title = '".$_POST['p_title']."', 
        p_date = '".$_POST['p_date']."' 
    WHERE 
        p_id = '".$_POST['p_id']."'
");

どうして?

ああ、それは$dbクラスのことでした。しかし、私が何かをするとき


public function query($sql){
    $db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password);
    if(!$db->exec($sql)){
        echo($defaults->throwError('MySql error',$sql,implode(":",$db->errorInfo())));
    }else{
        $defaults->writeLog($table,$db->lastInsertId(),'update');
    }
}

私は厄介な取得します

致命的なエラー: キャッチされない例外 'PDOException'
「無効なデータ ソース名」というメッセージが表示される
/class.defaults.php:8 で

スタックトレース:
#0 /class.defaults.php(8): PDO->__construct('', NULL, NULL)
#1 /class.form.php(269): Defaults->query('?????????UPDATE...')
#2 /module.projectbeheer.edit.php(25): Form->proceed('update', 'p_id', 'rows', Array, Array, '')
#3 /class.content.php(16): include_once('/パス/')
#4 /administratie.php(72): Content->write('/BraamsArchief/...')
#5 /class.defaults.php の 8 行目に {main} がスローされる
4

2 に答える 2

0

$dbをグローバルまたはクラスプロパティとして提供する必要があります。そうしないと、メソッドスコープでアクセスできません。

だからどちらか:

public function query($sql) {
    global $db;
    // now you can use $db as you would in global scope
}

または、データベース接続オブジェクトでクラスプロパティ($ this-> dbなど)を設定し、メソッドで$this->dbを使用してアクセスする必要があります。

このソリューションを使用する場合globalは、変数が最初に定義されたときに常に$dbと呼ばれるようにする必要があることに注意してください。そうしないと、メソッドがそれを見つけることができず、同じエラーが発生する可能性があります。

于 2012-12-04T16:30:05.880 に答える
0

$db はデフォルト内からアクセスできますか?

global $db;関数内クエリを追加してみてください

于 2012-12-04T16:28:57.197 に答える