3

私はここで本当に混乱しています。

このクエリは、localhost では問題なく機能しますが、実際のライブ サーバーでは機能しません。同じデータベースに対する他のクエリは機能するため、接続や pdo 拡張機能に問題はありません。

基本的にこれはクエリです:

$sql = "SELECT * FROM bksb_Resources";
$query = $this->connection->query($sql, array());

query() メソッドは PDOStatement オブジェクトを返します

次に、ループを呼び出し$this->connection->fetch($query)ます。ループは、「接続」オブジェクトのメソッドにルーティングされます。

function fetch_pdo($st)
{
    return $st->fetch();
}

したがって、基本的には、テーブルからすべてを選択してから最初の行を返します (これはループですが、実際には関係ありません)。

ローカルホストでは、これで問題ありません。問題はありません。

私のライブサーバーでは、次のようになります。

Fatal error: Cannot access empty property in /var/www/html/demo/blocks/elbp/classes/db/MSSQL.class.php on line 652

652 行目は、上記の fetch_pdo メソッドからの戻り値です。

fetch() を実行する前にステートメントを印刷しましたが、両方のサーバーで問題ありません。

PDOStatement Object
(
    [queryString] => SELECT * FROM bksb_Resources
)

私は本当にアイデアがありません。残りのクエリがライブサーバーでも正常に機能する場合、これがあるサーバーでは機能し、別のサーバーでは機能しない理由がわかりません。

(まあ...残りのことを言います。これはもともと、localhost のクエリが正しい結果を返し、ライブのクエリが何も返さないという別の問題でした。 ..しかし、私がこれに出くわしたことをデバッグしようとしている)。

誰でもアイデアはありますか?

ありがとう

編集:

への呼びかけ$this->connection->query($sql, array());

これを呼び出します:

/**
 * Run an SQL query and return a statement - to be used for things like selecting
 * @param type $sql
 * @param type $params
 * @return type
 */
public function query($sql, $params){

    $this->lastSQL = $sql;
    $func = 'query_'.$this->extension;
    return $this->$func($sql, $params);

}

次にこれを呼び出します:

/**
 * Run SQL query using PDO
 * @param type $sql
 * @param type $params
 * @return $st Statement
 */
private function query_pdo($sql, $params)
{
    $st = $this->dbh->prepare($sql);        
    $st->execute($params);
    return $st;
}

また、必要に応じて、これはフェッチを呼び出すループです。

     $results = array();
     while($row = $this->connection->fetch($query)){
         $results[] = $row;
     }
4

1 に答える 1

5

最近、PDO と MySQL バックエンドでこのエラーが発生しました。これは、次のクエリのように、クエリが空のエイリアスを持つ列を返していたためです。

SELECT name as "" FROM users;

これは (MySQL が完全に解釈して実行するという意味で) 完全に有効なクエリですが、PDO がデータをフェッチしようとして FetchMode が PDO::FETCH_OBJ に設定されている場合、「空のプロパティにアクセスできません」という致命的なエラーが発生します。

これは、同じ問題を抱えている人に、それを修正する方法についてのヒントを与えるはずです. ある時点で、PDO は stdClass をインスタンス化し、クエリによって返された各列のプロパティを設定しようとします。空の名前の列が返されると、PDO は基本的に次のコードを実行します。

// $obj is an stdClass instance
$prop = ''; // the name of the query column
$obj->$prop = $value; // the value of the query columns

これにより、「空のプロパティにアクセスできません」という致命的なエラーが発生します。

于 2014-01-08T13:45:36.657 に答える