-1

私のコード:

class db_mysqls
{

private $host;
private $user;
private $password;
private $db_name;
private $port;



/** Constructor sets the object of DB_MySQL*/
public function __construct($host, $port, $user, $password, $db_name)
{
    $this->host = $host;
    $this->port = $port;
    $this->user = $user;
    $this->password = $password;
    $this->db_name = $db_name;

}



/**getFromDB($statement) gets information from DB*/
public function getFromDB($query)
{

    try
    {
        $con = new PDO("mysql:host=$this->host;port=$this->port;dbname=$this->db_name", $this->user, $this->password);
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch (PDOException $e)
    {
        echo 'Connection failed: ' . $e->getMessage();
    }


    try
    {
        $resp = $con->query($query);
        return $resp;

    }
    catch (PDOException $e)
    {
        echo 'Connection failed: ' . $e->getMessage();
    }

}

接続を処理する同じクラスに別のメソッドを作成したいと考えてclass db_mysqlsいます。

そんな感じ:

private $con;

private function connect()
{
   global $con;
    try
    {
      $con = new PDO("mysql:host=$this->host;port=$this->port;dbname=$this->db_name", $this-  >user, $this->password);
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
     catch (PDOException $e)
    {
        echo 'Connection failed: ' . $e->getMessage();
    }
}

    /**getFromDB($statement) gets information from DB*/
public function getFromDB($query)
{
    global $con;

    connect(); //the call to the new function that handles connection.

    try
    {
        $resp = $con->query($query);
        return $resp;

    }
    catch (PDOException $e)
    {
        echo 'Connection failed: ' . $e->getMessage();
    }

}

問題は、範囲外になるとすぐに切断されるconnect()ことです。何が間違っていますか?

4

3 に答える 3

0

クラスについて知っておくべきこと - クラスには、そのクラスのみに属する独自の「グローバル」変数があります。したがって、それらを使用する必要があります。

この変数を次のように変更global $conprotected $conてアドレス指定するだけ$this->con です。この方法では、専用の connect() メソッドや、$host などの無駄な 1 回限りの変数は必要ありません。これにより、実際に多くのコードの繰り返しを回避できます。

また、アクションを実行しない場合は、try..catch の使用を避けてください。他のすべてのコードは、エラー報告を役に立たなくして台無しにします

class db_mysqls
{
    protected $con;

    /** Constructor sets the object of DB_MySQL*/
    public function __construct($user, $password, $db_name, 
                                $host='localhost', $port = 3306, charset = 'utf8')
    {
        $dsn = "mysql:host=$host;dbname=$db_name;port=$port;charset=$charset";
        $opt = array(
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        );
        $this->con = new PDO($dsn, $user, $password, $opt);
    }

    /**getFromDB($statement) gets information from DB*/
    public function getFromDB($query)
    {
        return $this->con->query($query);
    }
}

必要なコードはこれだけです

$db = new db_mysqls("root", "", "test");
$result = $db->getFromDB("SELECT * FROM table");
于 2013-07-17T11:12:39.417 に答える