4

エラーが発生している選択クエリを使用して、TUsers から 3 つの値をフェッチしています。

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 を使用する場合の良い提案を教えてください。

4

2 に答える 2

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
于 2012-05-22T04:44:27.017 に答える
0

すべてのレコードが「SecurityAns」列の値が同じで、他のすべての列の値が異なると仮定すると (通常、各ユーザーは独自の電子メール アドレスを持っていますよね?)、個別の行または個別の行を使用しても、クエリは常にそれ以上を取得します一列。つまり、「out」変数に複数の値をどのように代入しますか? Mysql プロシージャの 'In' および 'out' パラメータは、1 つの値のみを指定できるアトミック変数です。複数の行に対してテーブルをクエリし、取得したデータで何かをしたい場合は、PHP を使用してそれを行い、MySql ストアド プロシージャを忘れることをお勧めします。

于 2012-05-22T05:52:10.007 に答える