2012-05-22 2 views
4

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

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 для вызывая процедуры.

ответ

2

От fine manual:

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

Так говорил это:

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

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

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

Вы также, вероятно, работает в проблему с вашим ИНЕКЕ:

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 
+0

Здравствуйте, @mu результат, который я получаю только один, несмотря на то, что ошибка тоже показывает то же самое – Anish

+0

В таблице меньше строк, вопрос безопасности один, и он дает результаты только 1 строка есть чтобы избежать дублирования. – Anish

+0

@ user1297878: Я думаю, что вы также видите конфликт между именем столбца 'securityans' и именем параметра' securityans', и имя столбца выигрывает. –

0

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

Смежные вопросы