it-swarm.com.de

Umschreiben von Code wie in der Joomla-Anleitung beschrieben, aber Seite mit 404-Fehler

Ich schreibe einen alten Code gemäß der neuesten Referenz um, obwohl die Seitenbeschreibung im alten Code korrekt wiedergegeben wird.

Beim Umschreiben in neuen Code wird die Seite jedoch zu 404 umgeleitet, da die Seite nicht gefunden wurde.

Alter Code

function loadProduct($vid){
    $db = JFactory::getDbo();

    $sql = "Select *, 
            (select prod_name from #__usedtoy_products where id=v.v_prod_id)
            as prod_name  from #__usedtoy_variants AS v
            Where v.state='1' and v.id = " . $db->quote($vid);
    $db->setQuery($sql);

    if ($rows = $db->loadObjectlist()) {
        return $rows[0];
    } else {
        if ($db->getErrorNum()) {
            JError::raiseError(500, "Something went horribly wrong, the query returned the error ". $db->getErrorMsg());
        } else {
            JError::raiseError(404, "404, Page does not Exists ". $db->getErrorMsg());
        }
    }
}

zu

Verbesserter Code - es funktioniert

function loadProduct($vid){
    $mainframe =JFactory::getApplication();
    $option = JRequest::getCmd('option');
    $db =JFactory::getDBO();
    global $Itemid;
    $query = $db->getQuery(true);

    $query->select('#__usedtoy_variants.id');
    $query->from($db->quoteName('#__usedtoy_variants'));
    $query->where($db->quoteName('#__usedtoy_variants.id')." = ".$db->quote($vid), 'AND');
    $query->where($db->quoteName('#__usedtoy_variants.v_prod_id')." = ".$db->quote($pid));
    $query = "Select *, 
              (select prod_name from #__usedtoy_products where id=v.v_prod_id)
              as prod_name  from #__usedtoy_variants AS v
              Where v.state='1' and v.id = " . $db->quote($vid);
    $db->setQuery($query);

    if ($rows = $db->loadObjectlist()) {
        return $rows[0];
    } else {
        if ($db->getErrorNum()) {
            JError::raiseError(500, "Something went horribly wrong, the query returned the error ". $db->getErrorMsg());
        } else {
            JError::raiseError(404, "404, Page does not Exists ". $db->getErrorMsg());
        }
    }
}

Final New Code - es funktioniert nicht

function loadProduct($vid){
    $mainframe =JFactory::getApplication();
    $option = JRequest::getCmd('option');
    $db =JFactory::getDBO();
    global $Itemid;
    $query = $db->getQuery(true);

    $query->select('#__usedtoy_variants.id');
    $query->from($db->quoteName('#__usedtoy_variants'));
    $query->where($db->quoteName('#__usedtoy_variants.id')." = ".$db->quote($vid), 'AND');
    $query->where($db->quoteName('#__usedtoy_variants.v_prod_id')." = ".$db->quote($pid));

    $query->select(array('v.*', 'p.prod_name'))
          ->from($db->quoteName('#__usedtoy_variants', 'v'))
          ->join('LEFT', $db->quoteName('#__usedtoy_products', 'p') . ' ON (' . $db->quoteName('p.id') . ' = ' . $db->quoteName('v.v_prod_id') . ')')
          ->where($db->quoteName('v.state')." = ".$db->quote(1), 'AND')
          ->where($db->quoteName('v.id')." = ".$db->quote($vid));

    $db->setQuery($query);

    if ($rows = $db->loadObjectlist()) {
        return $rows[0];
    } else {
        if ($db->getErrorNum()) {
            JError::raiseError(500, "Something went horribly wrong, the query returned the error ". $db->getErrorMsg());
        } else {
            JError::raiseError(404, "404, Page does not Exists ". $db->getErrorMsg());
        }
    }
}

Referenz - https://docs.joomla.org/Selecting_data_using_JDatabase#Selecting_Records_from_Multiple_Tables

Kann jemand darauf hinweisen, worum es geht?

1
Ruchika

Die kurze Antwort ist, weil Sie zwei Fragen haben, die diese Art von Brei zusammen haben. In Ihrer Version mit verbessertem Code erstellen Sie das Abfrageobjekt und ersetzen es durch eine Zeichenfolgenabfrage.

Ich habe den gesamten Code entfernt, der keine solche Rolle hat:

function loadProduct($vid){
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);
    $query->select('v.*, p.prod_name')
      ->from($db->qn('#__usedtoy_variants', 'v'))
      ->join('LEFT', $db->qn('#__usedtoy_products', 'p') . ' ON (' . $db->qn('p.id') . ' = ' . $db->qn('v.v_prod_id') . ')')
      ->where($db->qn('v.state')." = 1 AND " . $db->qn('v.id')." = ".$db->q($vid));
    $db->setQuery($query);  

    if ($result = $db->loadObject()) {
        return $result;
    } else {
        if ($db->getErrorNum()) {
            JError::raiseError(500, "Something went horribly wrong, the query returned the error ". $db->getErrorMsg());
        } else {
            JError::raiseError(404, "404, Page does not Exists ". $db->getErrorMsg());
        }
    }
}

Hinweis: qn und q sind praktische Kurznamen für quoteName und quote. Wenn Sie nur maximal 1 Datensatz möchten, verwenden Sie $ db-> loadObject () anstelle von objectList.

2
jamesgarrett

Ich halte die Antwort von @ jamesgarrett für völlig ausreichend. Ich möchte den Forschern nur eine alternative Syntax anbieten.

$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select("A.*, B.prod_name")
                ->from("#__usedtoy_variants A")
                ->leftJoin("#__usedtoy_products B ON A.id = B.v_prod_id")
                ->where("A.state = 1 AND A.id = " . (int)$vid);
    $db->setQuery($query);
    if (!$result = $db->loadObject()) {  // one-dimensional, not multi-dimensional
        JFactory::getApplication()->enqueueMessage('Potential Logic Failure - No Rows Returned', 'notice');
        return false;
    }
    return $result;
} catch (Exception $e) {
    JFactory::getApplication()->enqueueMessage('Syntax Failure', 'error');  // use these to debug: $query->dump() && $e->getMessage()
    return false;
}
  • Ich bevorzuge try {} catch {} - Blöcke, weil sie meiner Meinung nach die Fehlerbehandlung einfacher und übersichtlicher machen.
  • Die Methodenverkettung kann über getQuery() erfolgen. Dadurch entfällt die Notwendigkeit, $query Für jeden Aufruf der Abfragemethode zu wiederholen.
  • Ich habe alle nicht wesentlichen qn() und q() entfernt, um das Aufblähen des Codes zu verringern, und aus Sicherheitsgründen $vid Als Ganzzahl mit der Annahme, dass vid steht für eine Tabellen-ID (Ganzzahl). Wenn $vid Keine Ganzzahl ist, verwenden Sie q().
  • leftJoin() ist eine dedizierte Join-Methode.
  • Ich überprüfe mit ! Auf eine leere Ergebnismenge und gebe eine JFactory::getApplication()->enqueueMessage() -Notiz aus, die dann false zurückgibt, wenn keine Zeilen vorhanden sind. Abhängig von Ihrem Projektdesign ist dieses Ergebnis möglicherweise kein "Logikfehler".
  • Ich biete eine vage "Syntaxfehler" -Antwort an, wenn die Abfrage aus Gründen der Best Practice unterbrochen wird. Wenn Sie den Text enqueueMessage() beim Debuggen mit etwas Informativerem füllen möchten, verwenden Sie die Aufrufe dump() und/oder getMessage(), die ich als Inline-Kommentare hinterlassen habe . Entfernen Sie nach dem Debuggen die spezifischen Abfrage-/Fehlerdetails aus der Ansicht.
  • Als nicht-assoziierten Vorschlag möchte ich Sie dringend bitten, die Verwendung von global in Ihrem Funktionsaufruf zu vermeiden. Viele Entwickler betrachten dies als "schlampig" und fügen dem globalen Bereich unnötigerweise Variablen hinzu. Wenn Sie den gleichen Effekt erzielen können, indem Sie Variablen als Argumente in der Funktion übergeben - tun Sie das.
0
mickmackusa