0

MySQL データベース接続を使用して PHP スクリプトを開発しています。私が抱えている問題は、大量の情報を処理するためにクエリを最適化する必要があり、そのために大きなクエリを作成していることです。

例を書くために、大きなクエリは書きませんが、必要なものを確認できるようにします。

SELECT db1.name, db1.pass, db1.user_id, db2.datetime, db2.user_id 
FROM database1 db1, database2 db2 
WHERE db1.name = 'name' 
AND db1.pass = 'pass' 
AND db1.user_id = db2.user_id

必要なのは、名前とパスが正しくないためにクエリが失敗したかどうか、または両方のテーブルで user_id が等しくないために失敗したかどうかを知ることです。

基本的に、クエリ内のエラーを識別し、 「ユーザーとパスワードが正しくありません」というカスタム メッセージを出力できるようにするには、エラー番号などをクエリ内で返す必要があります 。 または 「データベース 2 の権限がありません。」

前もって感謝します!

4

1 に答える 1

1

SQL SELECT ステートメントは、特定の述語が満たされていないために行が返されない場合に、「エラー番号」または「エラー メッセージ」を返すようには設計されていません。

(「クエリの失敗」および「クエリのエラー」とは、実際のMySQLではなく、述語が満たされていないため(つまり、行がWHERE句に「一致」したかどうか)、クエリが行を返さないことを指していると思いますエラー。)

質問の例のクエリを考えると、この種のチェックを行うために書き直すことができます。

例えば:

SELECT IF(db1.name IS NULL
         ,'Your user and password are incorrect.'
         ,IF(db2.user_id IS NULL
           ,'You don''t have permissions in database2.'
           ,''
       ) AS message
     , db1.name
     , db1.pass
     , db1.user_id
     , db2.datetime
     , db2.user_id 
  FROM (SELECT 1 AS i) i
  LEFT
  JOIN database1 db1
    ON db1.name = 'name' 
   AND db1.pass = 'pass' 
  LEFT
  JOIN database2 db2
    ON db1.user_id = db2.user_id

しかし、そのようなステートメントを書くことができるという事実は、これが良いアプローチであるとは限りません。(このアンチパターンには何らかの名前が必要です。)

于 2013-07-24T16:18:51.260 に答える