【问题标题】:Segmentation Fault from PHP PDO FreeTDS ODBC executionPHP PDO FreeTDS ODBC 执行的分段错误
【发布时间】:2015-04-06 21:08:59
【问题描述】:

我目前正在将一个 PHP 项目从使用 PHP 的 mssql 库迁移到使用带有 FreeTDS 的 PDO 库。我已经修改了所有的数据库调用,但是在 SQL Server 数据库上执行准备好的语句时遇到了一个非常奇怪的问题。

下面是我遇到问题的一段代码。

public static function gift_cards_exist($start_number, $end_number = null) {
    global $sol_donations;
    $db = $sol_donations->get_db();

    $store_id = get_option('pos-store-id', false);
    //$store_id = '01';  // Won't work if value assigned this way
    $payment_method = 'Gift';

    if (empty($end_number)) {
        $end_number = $start_number;
    }

    $query = '
        SELECT * FROM dbo.tblPmtSerialHdr
        WHERE SerialId BETWEEN ? AND ?
        AND   StoreId = ?';
        //AND   PmtMethodId = ?';

    $stmt = $db->prepare($query);
    $stmt->bindParam(1, $start_number, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    $stmt->bindParam(2, $end_number, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    $stmt->bindParam(3, $store_id, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    //$stmt->bindParam(4, $payment_method, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    $result = $stmt->execute();

    $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    $stmt->closeCursor();

    /* Nothing printed from this
    echo $stmt->errorCode();
    echo '<br />';
    echo $stmt->errorInfo();
    */
    var_dump($result);
    exit();

    if ($result) {
        return true;
    }
    return false;
}

这就是问题所在。以这种形式运行代码(所有注释行都保留注释)会导致正确执行查询并获得预期的结果,尽管对于我的程序来说不正确。

但是,如果我修改查询以使用第二个 AND 语句并取消注释最后一个 bindParam 语句以与该语句一起使用,则脚本将失败,从而导致分段错误。我在 apache 错误日志中得到的实际错误消息是:

[Fri Feb 06 10:43:05.406772 2015] [core:notice] [pid 1415] AH00051: child pid 1541 exit signal Segmentation fault (11), possible coredump in /etc/apache2

我完全不知道为什么为准备好的语句添加这个额外的参数会导致问题。

有关情况的一些额外信息:

FreeTDS安装正确,可用于连接数据库查询数据。

我尝试过同时使用bindParambindValue 并给出相同的结果。

我尝试过使用和不使用按位或PDO::PARAM_INPUT_OUTPUT 运行语句。

最后,我检查以确保记录集中没有应返回的 NULL,以确保 NULL 值不是原因。

【问题讨论】:

  • 您可能应该与 freetds 人员交谈并报告他们软件中的错误。

标签: php sql-server pdo odbc freetds


【解决方案1】:

所以,事实证明这是 FreeTDS ODBC 驱动程序中的某种错误。我切换到使用 dblib 驱动程序,我的所有查询都正常工作,没有分段错误。

【讨论】:

    【解决方案2】:

    有一个类似的问题,我通过 PDO 和 DBLIB 运行的查询返回一个货币类型值。 我必须使用的 DBLIB 版本导致 apache 和 google 中的分段错误导致我这样做。

    简单地将货币类型值转换为小数意味着我可以解决这个问题,同时仍保持小数精度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2019-08-17
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多