PDO MySQL call возвращает ошибку небуферизованных запросов - PullRequest
0 голосов
/ 27 октября 2010

Я исследовал онлайн, но большинство примеров или инструкций, кажется, не относятся к тому, что я пытаюсь выполнить.

Короче говоря, мой код должен выполнить следующее:

Хранимая процедура вызывается из моего php-скрипта, который возвращает набор данных, по которому я хочу пройти цикл, и создать строки в таблице (для целей онлайн-отображения). Однако одно из полей в моей таблице должно вызывать отдельную таблицу (даже не нужно использовать хранимую процедуру в первую очередь) для подсчета общего числа строк, затронутых идентификатором пользователя.

Мой скрипт ниже возвращает эту ошибку:

SQLSTATE [HY000]: общая ошибка: 2014 Невозможно выполнить запросы, когда другие небуферизованные запросы активны. Рассмотрите возможность использования PDOStatement :: fetchAll (). В качестве альтернативы, если ваш код работает только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY.

Код:

<body>
<table border='0' cellpadding='0' cellspacing='1'>
    <thead>
        <tr bgcolor='#E0EBF1'>
            <th>Agent NO</th>
            <th>Comm Lvl</th>
            <th>Agent Name</th>
            <th>Address</th>
            <th>parent_agent_name</th>
            <th>Contacts</th>
            <th>45 Day</th>
            <th>STS</th>
        </tr>
    </thead>
    <tbody>

<?php

$agetnumber = 123456789;


    try {   
            $db = new PDO('mysql:host=localhost;dbname=DBNAME', 'USER', 'PW');
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $db->beginTransaction();

            $stmt = $db->query('CALL hier($agentnumber)');
            foreach($stmt as $row)
            {
                $sql = $db->query("SELECT AGENT FROM activity WHERE AGENT = '$row[AGTNO]");
                $foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();          

                echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                $row["AGTNO"], $row["AGTCOMMLVL"],
                $row["AGTFNAME"]."<br><i>Contracted: ".$row["KDATE"],
                $row["parent_agent_id"],
                $row["parent_agent_name"],
                $row["commission_level"],
                $foundrows,
                $foot);
            }           
            $db->commit();
        }

    catch (PDOException $e)
        {
            $db->rollback();
            echo $e->getMessage();
            exit;
        }

Строки, влияющие на код:

$sql = $db->query("SELECT AGENT FROM activity WHERE AGENT = '$row[AGTNO]");
$foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();

удаление их «избавляет» от ошибки, но я не могу получить переменную $ foundrows, которая мне нужна для каждого набора строк результатов.

Кто-нибудь когда-либо сталкивался с этой проблемой раньше?

1 Ответ

0 голосов
/ 27 октября 2010

Поскольку ваш запрос не содержит LIMIT, я не уверен, почему вы используете FOUND_ROWS () .Не могли бы вы просто SELECT COUNT(*) FROM activity WHERE AGENT = '$row[AGTNO] вместо этого?

РЕДАКТИРОВАТЬ:

На самом деле, если я читаю между строк немного больше, я думаю, вы могли бы получить все, что вам нужно в одном запросе.Это может быть упрощено, так как у меня нет всех деталей процедуры hier, но это будет что-то вроде:

SELECT ag.AGTNO, ag.AGTCOMMLVL, /* etc. */, count(ac.AGENT) as foundrows
    FROM agent ag
        LEFT JOIN activity ac
            on ag.AGTNO = ac.AGENT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...