web-dev-qa-db-ja.com

データベーステーブルにユーザーIDが見つからない場合はリダイレクトする

ユーザーがログインしたときに、サードパーティコンポーネントのプロファイルフォームに適切に入力するようにプッシュしようとしています。

フォームに入力すると、ユーザーIDが「#__rbid_users」テーブルに追加されます(ユーザーIDはJoomlaユーザーIDと同じです)。

これは私が作ったものですが、何かが間違っています-コードが一致していません。

<?php 
    $db = JFactory::getDbo();
    $query = $db->getQuery(true)
            ->select($db->quoteName(array('userid')))
            ->from($db->quoteName('#__rbid_users'));
    $rbiduser = $db->loadObjectList();
if (in_array(joomlausers->id, $rbiduser->userid))
{

}
else
{
  echo '<html>
        <head>
            <meta http-equiv="refresh" content="url=profile" />
        </head>
        <body>';
}
?>
2
okisan

最初の問題は、正しくないように見える_joomlausers->id_を使用していることです。 _$joomlausers->id_にする必要があります(先頭に_$_を付けます)。

次に、loadObjectList()はPHPオブジェクトのインデックス付き配列を返すため、_in_array_がこれで動作するとは思わない。

代わりに、$db->loadColumn()を使用することをお勧めします。これにより、次のようにすべてのuseridの配列が返されます。

_$db = JFactory::getDbo();
$query = $db->getQuery(true)
    ->select($db->quoteName('userid'))
    ->from($db->quoteName('#__rbid_users'));
$db->setQuery($query);

$array = $db->loadColumn();

if (in_array($joomlausers->id, $array, true))
{
    // Id exists
}
else
{
    JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_something&view=something'));
}
_

現在のコードで行ったように、どこにもカスタムメタを挿入しようとしないでください。代わりに、上記のようにJoomlaのリダイレクトメソッドを使用します。

お役に立てれば

4
Lodder

SQLがそのようなロジックを実行するために完全に修飾されている場合、結果セットをフィルタリングすることは非常に直接的ではないと思います。

Lodderが修正したので、setQuery()を使用し、欠落している_$_を修正し、結果セット生成メソッド呼び出しを調整して、リダイレクト手法を改善する必要もあります。

生成されるクエリを理解するために役立つ診断行をいくつか含めました。構文エラーがある場合は、それらが表示されます(スクリプトのリダイレクト部分を実行しない限り)。

私のスクリプトを実行した後、あなたはそれを発見するかもしれません:

  1. sQLエラーがあります(たとえば、useridは_user_id_と同じではありません)
  2. あなたは実際にあなたが持っていると思う_$joomlausers->id_値を持っていません
  3. ...または質問に投稿していない何かが問題を引き起こしています。

未テストのスニペット:

_$user = JFactory::getUser();

if ($user->guest) {
    JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_something&view=something'));
}

try {
    $db = JFactory::getDbo();
    $query = $db->getQuery(true)
                ->select("COUNT(1)")
                ->from("#__rbid_users")
                ->where("userid = " . (int)$user->id);

    JFactory::getApplication()->enqueueMessage($query->dump(), 'info');
    //               use only during debuggin -^^^^^^^^^^^^^^

    $db->setQuery($query);
    if (!$db->loadResult()) {  // loadResult() should return either 0 or 1
        // no error and no count, execute redirect
        JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_something&view=something'));
    } else {
        // id matched
    }
} catch (Exception $e) {
    JFactory::getApplication()->enqueueMessage("Query Syntax Error: " . $e->getMessage(), 'error');
    //                                       use only during debugging -^^^^^^^^^^^^^^^^
}
_

サイトのセキュリティの問題として、正確なクエリまたはエラーメッセージを一般に公開してはならないことを述べておくことは重要です。

明確にするために、enqueueMessage()呼び出しは必須ではなく、デバッグを支援するためだけのものです。

3
mickmackusa