php - 如何在 PHP/Magento 中捕获这个低级别的 MySQL(?)错误

标签 php magento error-handling

当我在 Magento 中使用非常大的 $sku 执行以下语句时,执行终止而没有抛出任何错误。 Magento、Apache 或 PHP 的错误日志中都没有错误。

Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

问题:如何捕获错误?

我已经尝试设置自定义错误处理程序,并且出于测试目的,我还设法触发调用每个错误处理程序函数的错误情况。但是当运行前面提到的带有大 $sku 的 Magento 代码时,没有执行任何错误处理函数。

error_reporting( -1 );
set_error_handler( array( 'Error', 'captureNormal' ) );
set_exception_handler( array( 'Error', 'captureException' ) );
register_shutdown_function( array( 'Error', 'captureShutdown' ) );

为了完整起见,这是我传递给 loadByAttribute()$sku。 (sku 无效,但这不是问题所在)

1- 9685 0102046|1- 9685 1212100|1- 9685 1212092|1- 9685 1212096|1- 9685 1102100|1- 9685 1102108|1- 9685 1102112|1- 9685 1102092|1- 9685 0102048|1- 9685 0102054|1- 9685 0102056|1- 9685 0102058|1- 9685 1212104|1- 9685 1212108|1- 9685 0212058|1- 9685 0104050|1- 9685 0212050|1- 9685 0212056|1- 9685 0212044|1- 9685 0212048|1- 9685 0212052|1- 9685 0212054|1- 9685 1102104|1- 9685 1102124

非常感谢任何对此问题的见解!

更新: 经过进一步调查,这是代码中执行终止的确切位置。当执行 foreach 时,我猜 Magento 进入了 MySQL 世界并开始从数据库加载数据。

\Mage\Catalog\Model\Abstract.php

 public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
    {
        $collection = $this->getResourceCollection()
            ->addAttributeToSelect($additionalAttributes)
            ->addAttributeToFilter($attribute, $value)
            ->setPage(1,1);

        foreach ($collection as $object) { // <--------------- HERE
            return $object;
        }
        return false;
    }

请注意,我只对找出如何正确捕获这些类型的错误感兴趣,而不是“修复”逻辑。这样我就可以向用户显示正确的错误消息。上面带有格式错误的 sku 的示例是人为设计的,我不想让我的 Magento 应用程序与那些错误的 sku 一起工作。

更新:错误原因

我跟踪了由 foreach 触发的 load() 调用,它归结为 Zend/PHP 的错误。

我跟踪了对\www\lib\Zend\Db\Statement.php _stripQuoted($sql) 的调用,以及以下语句: $sql = preg_replace("/$q($qe|\\\\{2}|[^$q])*$q/", '', $sql);(在线204 在 Magento 1.7.0.2 中)。

preg_replaceload() 语句生成的 SQL 一起运行时,程序就终止了。在 apache 或 php 的日志中都没有踪迹。日志有效,因为它们充满了其他东西。

I found this bug report on the issue .他们在那里指出这是一个段错误。我想有 无法从中恢复(?)。

由于问题明确是关于如何捕获错误情况,并且这里的很多建议更多地是关于清理数据的,所以我认为赏金没有明确的“赢家”。但 Franklin P Strube 至少暗示要在堆栈的更深处进行检查,所以他明白了。

谢谢大家的帮助。如果您对如何处理段错误有任何建议,请分享 =)。

最佳答案

我相信脚本可能会在比您指示的更深的堆栈中终止。当集合开始“foreach”循环时,它必须首先调用“加载”函数,该函数专门用于构建 SQL。

您可以尝试记录 Mage::log((string)$collection->getSelect()); 以查看 SQL 查询是否有问题。

或者,您能否在过滤前对 sku 进行清理?也许使用观察者?

关于php - 如何在 PHP/Magento 中捕获这个低级别的 MySQL(?)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12893610/

相关文章:

php - HTML 链接无法打开到窗口中

php - 尝试在 Amazon AWS 上的 mySQL 数据库上使用 JSON_OBJECT 函数

PHP 不将数据库打印为表

caching - 如何清除 Magento 的数据库架构缓存?

php - PHP in_array检查数组的最佳方法?

python - 删除文件(如果存在)。如果没有,请创建它

python - 我的代码的第 102 行总是出错

php - 使用查询生成器从三个表 codeigniter 获取数据

javascript - 我只想显示所有类别列表中的唯一类别。我应该在 jquery 中使用什么?

php - 将使用 PayPal 支付的 Magento 中不接受的货币转换为美元