5

一部のリクエストでのみバッファリングされていないクエリを実行しようとしています。

mysqlで私はこれをやっていました:

$req = mysql_unbuffered_query('SELECT * FROM forum_topics
ORDER BY (topic_id/topic_stick) DESC, topic_last_post DESC');
while($data = mysql_fetch_assoc($req)) {
   // display results...
}

私はphp docを見て、それによると、pdoバッファリングされていないクエリを実行するには、この方法で進める必要があります:

$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$uresult = $pdo->query("SELECT Name FROM City");

if ($uresult) {
   while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
       echo $row['Name'] . PHP_EOL;
   }
}

しかし、すべての pdo インスタンスを unbuffered に設定せずに、「forum_topics」テーブルの結果のみを unbuffered にすることは可能ですか?

4

5 に答える 5

2

MySQL は、ステートメント レベルの属性設定を実装していません。

ソース:

エラーメッセージは次のとおりです。

そして、上記の条件は上記でチェックされますstmt->methods->set_attribute

stmt->methods上で定義されており、型は次の場所で宣言されています。

パラメータは 10 番目のset_attribute構造体エントリです。

MySQL PDO の実装は次のとおりです。ステートメントのメソッドは次のように定義されています。

これは、MySQL PDO モジュールがその機能を実装していることを示しています。

討論:

他の拡張機能をレビューしました。Firebird PDO データベース モジュールのみがその機能をサポートしています。

于 2020-06-01T20:01:19.293 に答える
-2

クエリが SELECT の場合の回避策として、fetchAll 関数を呼び出しません。

                $query = 'SELECT ...... ';
                $arr = explode(' ', $query);
                $query_type = strtolower($arr[0]);
                if ($query_type == 'select') {
                    $query_response = $query_prepare->fetchAll(PDO::FETCH_ASSOC);
                } else {
                    $query_response = '';
                }

また、クエリの先頭に誤ってスペースを入れた場合は、例外を処理する必要があります。これが役に立てば幸いです。

于 2019-06-06T11:48:13.330 に答える