Ошибка выполнения оператора Mysqli: результат состоит из более чем одной строки

Я извлекаю три значения из TUsers, используя запрос выбора, где я получаю сообщение об ошибке как

Ошибка выполнения оператора Mysqli: результат состоит из более чем одной строки.

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

Вот код:

Процедура:

         CREATE DEFINER=`root`@`` PROCEDURE `spfetchloginid`(in securityans   varchar(50),out email varchar(50),out loginidout varchar(50),out useridout varchar(50))
         BEGIN

         SELECT DISTINCTROW Email,login_id,user_id into email,loginidout,useridout  FROM DB.TUsers where SecurityAns=securityans ;

         END

Вызов процедуры в ZendFramework из контроллера:

            $db=Zend_Db_Table::getDefaultAdapter();
        $spParams = array(1,'NewValue');
        $stmt = $db->query("CALL   spfetchloginid('$securityans',@email,@loginidout,@useridout)");

        print_r($stmt->fetchAll());
        $stmt->closeCursor();   

        $stmtresult10=$db->query("select @email");
        $email_to=$stmtresult10->fetch();
        $stmtresult10->closeCursor();
        $Emails=$email_to["@email"];
         echo $Emails;  

        $stmtresult11=$db->query("select @loginidout");
        $loginid=$stmtresult11->fetch();
        $stmtresult11->closeCursor();

        $loginids=$loginid["@loginidout"];
        echo $loginids; 

        $stmtresult12=$db->query("select @useridout");
        $userid=$stmtresult12->fetch();
        $stmtresult12->closeCursor();

        $userids=$userid["@useridout"]; 

        echo $userids;

Пожалуйста, сообщите мне какие-либо хорошие предложения по использованию Zend и My Sql для вызова процедур.


person Anish    schedule 22.05.2012    source источник


Ответы (2)


Из отличного руководства:

DISTINCT указывает удаление повторяющихся строк из набора результатов. [...] DISTINCTROW является синонимом DISTINCT.

Итак, говоря это:

SELECT DISTINCTROW Email, login_id, user_id
...
where SecurityAns = securityans

просто удаляет дубликаты из набора результатов, но если у вас есть несколько строк с одним и тем же SecurityAns, и все они securityans, тогда ваш запрос вернет несколько строк. Если SecurityAns является ответом на стандартный вопрос, например, "какой ваш любимый цвет" или "какая девичья фамилия у вашей матери", то вы должны ожидать много дубликатов, поэтому SecurityAns определенно недостаточно, чтобы гарантировать уникальность.

Вам нужно добавить больше в предложение WHERE, чтобы гарантировать уникальные результаты. Или вы можете добавить LIMIT 1, но это просто повязка на реальную проблему.

Вы также, вероятно, столкнулись с проблемой с предложением WHERE:

where SecurityAns = securityans

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

create procedure p(in id int, out result int)
begin
    select id into result from t where id = id;
end

но не в этой версии:

create procedure p(in find_id int, out result int)
begin
    select id into result from t where id = find_id;
end
person mu is too short    schedule 22.05.2012
comment
Здравствуйте, @mu, результат, который я получаю, только один, несмотря на то, что он показывает ту же ошибку. - person Anish; 22.05.2012
comment
В таблице меньше строк, контрольный вопрос один, и он дает результаты только в 1 строке, есть ли способ избежать дублирования. - person Anish; 22.05.2012
comment
@ user1297878: Я думаю, вы также видите конфликт между именем столбца securityans и именем параметра securityans, и имя столбца выигрывает. - person mu is too short; 22.05.2012
comment
SELECT DISTINCTROW Email,login_id,user_id to email,loginidout,useridout FROM TUsers, где SecurityAns=securityans LIMIT 1. Я надеюсь, что это правильно, это позволяет избежать дублирования, но когда я вызываю процедуры, это не идеально. Надеюсь, вы работали в среде Zend. слишком - person Anish; 22.05.2012
comment
@ user1297878: Zend не имеет к этому никакого отношения, проверьте мое обновление. Мы на пару секунд рассинхронизированы. - person mu is too short; 22.05.2012
comment
Таким образом, в запросе есть некоторый конфликт, где имя столбца такое же, а параметр такой же .... О, это хороший намек, который изменит это и увидит и даст вам результат - person Anish; 22.05.2012
comment
Если securityans уникален, вам не нужны LIMIT 1 или DISTINCTROW. Но у вас все еще будет конфликт параметра/столбца; это довольно неприятная ошибка, и ее очень трудно обнаружить. - person mu is too short; 22.05.2012
comment
Да, вы правы, метод и запрос идеальны, и получение результата в zend также правильно, но не могу понять, где ошибка. Я также изменил имя параметра, и хотя он не показывает никаких ошибок, это довольно неприятная ошибка - person Anish; 22.05.2012
comment
Мистер мю, есть проблема с получением значения с неизвестным значением, например t1,11 в zend, это какая-то ошибка в базе данных? - person Anish; 22.05.2012
comment
например, SELECT DISTINCTROW Email,login_id,user_id FROM TUsers, где SecurityAns='Sunny' LIMIT 1; - person Anish; 22.05.2012
comment
Я получаю результат, как в MY sql, как Email: [email protected] login_id: User1 user_id: 6, но когда я извлекаю в zend, он получает результат как email: t1 login_id: 1 user_id: 1 это ошибка или что-то еще проблема с запросом перепробовал все методы не могу догадаться почему? - person Anish; 22.05.2012
comment
Спасибо за ответ Му дай Бог тебе здоровья - person Anish; 22.05.2012
comment
@ user1297878: Теперь у вас все работает, верно? Я был занят приготовлением ужина. - person mu is too short; 22.05.2012

Предположим, что все записи имеют одинаковое значение в столбце «SecurityAns», но разные значения для всех других столбцов (обычно у каждого пользователя есть свой адрес электронной почты, верно?), независимо от того, используете ли вы отдельную или отдельную строку, ваш запрос всегда будет получать больше, чем один ряд. Итак, говоря это, как вы хотите присвоить несколько значений «выходным» переменным? Параметры «In» и «out» в процедурах Mysql являются атомарными переменными, которым может быть присвоено только одно и ТОЛЬКО ОДНО значение. Если вы хотите запросить таблицу для более чем одной строки и что-то сделать с полученными данными, я предлагаю вам сделать это с помощью PHP и забыть о хранимых процедурах MySql.

person José Esteves-Pereira    schedule 22.05.2012