Php 如何修复sql查询中的504网关超时nginx错误?

Php 如何修复sql查询中的504网关超时nginx错误?,php,sql,joomla,virtuemart,Php,Sql,Joomla,Virtuemart,我是初学者,正在尝试更新Joomla(3.8)数据库中的表,在以下sql查询中,我发现504网关超时nginx错误: $db = JFactory::getDbo(); $query = $db->getQuery(true); $condition = array( $db->quoteName('B.virtuemart_product_id') . ' >= '.$product_id_from, $db->quoteName('B.virtuema

我是初学者,正在尝试更新Joomla(3.8)数据库中的表,在以下sql查询中,我发现504网关超时nginx错误:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$condition = array(
    $db->quoteName('B.virtuemart_product_id') . ' >= '.$product_id_from,
    $db->quoteName('B.virtuemart_product_id') . ' <= '.$product_id_to);

$query->select(array('B.virtuemart_product_id, A.product_sku, 
A.price_CZK, A.price_EUR'))
      ->from($db->quoteName('#__watrex_price_list_temp', 'A'))
      ->join('INNER' , $db->quoteName('#__virtuemart_products', 'B') . ' 
ON (' . $db->quoteName('B.product_sku') . ' = ' . $db- 
>quoteName('A.product_sku') . ')')
      ->where($condition,'AND');
$db->setQuery($query);
$num_rows = $db->getNumRows();
$results = $db->loadObjectList();
...
$db=JFactory::getDbo();
$query=$db->getQuery(true);
$condition=array(
$db->quoteName('B.virtuemart\u product\u id')。>='.$product\u id\u from,
$db->quoteName('B.virtuemart_product_id')。我怀疑这就是罪魁祸首。当我在本地主机上运行call
echo$db->getNumRows()
并成功查询返回非空结果集以复制问题时,我得到:

警告:mysqli_num_rows()要求参数1为mysqli_result,在C:\wamp64\www\blah\libraries\joomla\database\driver\mysqli.php第##

NULL

要解决这个问题,请在
$db->getNumRows()
之前的行中添加
$db->execute();
,这样一切都可以正常工作。也就是说,我建议只需在
$results
上调用
count()
sizeof()
,因为不必添加
execute()
调用,就可以获得相同的输出


如果这不是原因,这可能在您的控制范围内,也可能不在您的控制范围内。您可能希望完成以下建议清单:


至于如何以更少的内存消耗来处理结果集,您可能会感到高兴


至于对您的查询的细微改进:

  • SELECT子句的呈现方式恰当,但语法似乎是为了创建列数组而设计的。事实是,您有一个包含所有四列的单元素数组。只有在您决定将
    quoteName()
    应用于数组时,这才有问题

  • 我建议使用小写的表别名,这样它们就不会像MySQL关键字那样“引人注目”

  • 上的
    声明不需要附加包装

  • 您的表或列实际上都不需要调用
    quoteName()
    ,以保持稳定性/安全性。您可以选择省略它们以使代码更易于阅读,但Joomla编码标准要求100%使用调用(我个人不喜欢这种立场)

    表名和表列名应始终包含在quoteName()方法中,以转义表名和表列

  • 它可能对性能没有帮助,但在两者之间是“包容的”,专门设计用于在条件需要时满足您的两个需求

  • 我推荐的代码片段:

    $db = JFactory::getDbo();
    $query = $db->getQuery(true)
        ->select($db->quoteName(["b.virtuemart_product_id", "a.product_sku", "a.price_CZK", "a.price_EUR"]))
        ->from($db->quoteName("#__watrex_price_list_temp", "a"))
        ->innerJoin($db->quoteName("#__virtuemart_products", "b") . " ON " . $db->quoteName('b.product_sku') . " = " . $db>quoteName("a.product_sku"))
        ->where($db->quoteName("b.virtuemart_product_id") . " BETWEEN " . (int)$product_id_from . " AND " . (int)$product_id_to);
    $db->setQuery($query);
    if (!$results = $db->loadObjectList()) {
        echo "No Rows";
    } else {
        // if you need to know the count...
        echo count($results);
    
        // iterate the result set
        foreach ($results as $row) {
            // ... yatta-yatta ...
        }
    }
    
    如果以上所有操作都失败了,我建议您重新考虑您的项目。也许您应该限制结果集的容量,并在必要时使用分页技术


    p、 s.Rick James有。

    你有没有办法提取执行的查询并查看是否缺少索引?@Michal自从我发布我的综合答案后,你似乎消失了。这个问题解决了吗?如果你正在进行Joomla开发,请加入我们的Stack Exchange。