未定义的属性和PHP致命错误:通过unixODBC/FreeTDS从PHP查询mssql时,允许的内存耗尽


Undefined Property and PHP Fatal Error: Allowed memory exhausted when querying mssql from php through unixODBC/FreeTDS

在将php从5.2.10版本升级到5.3.3之后,我在使用在5.2.10中运行良好的odbc查询时遇到了一组非常奇怪的错误。

当我运行以下查询时,我得到了很多未定义的属性:stdClass::$username最终以允许内存耗尽错误结束:

    $conn = odbc_connect("dsn", "user", "pw") or die(odbc_error_msg()); 
    $query = "select usr_n as username from usr";
    $rs = odbc_exec($conn,$query);
    while ($rows = odbc_fetch_object($rs)) {
        echo "$rows->username";
        }
    odbc_free_result($rs);
    odbc_close($conn);

奇怪的是,如果我在没有"username"别名的情况下运行这段代码,并使用下面查询中显示的表名,它就可以正常工作:

    $conn = odbc_connect("dsn", "user", "pw") or die(odbc_error_msg()); 
    $query = "select usr_n from usr";
    $rs = odbc_exec($conn,$query);
    while ($rows = odbc_fetch_object($rs)) {
        echo "$rows->usr_n";
        }
    odbc_free_result($rs);
    odbc_close($conn);

此外,如果我在count(*)语句中使用alias,它也可以正常工作,但一旦我用别名替换表名,一切都会出错。

我在iSQL中尝试了使用别名的查询,它的工作原理与预期的一样,所以unixODBC和FreeTDS正在工作。

我已经在这里和谷歌上搜索了所有我能找到的材料,但没有得到任何答案来解释为什么会发生这种情况。

如果这里有人知道这里发生了什么,请不胜感激,因为在我看来,这似乎与别名有关,而且我经常使用别名。

BTW:很遗憾,升级php对我来说不是一个选择。

在我的案例中,问题是重音字符(西班牙语)。我解决了在每个SELECT上用这个字符向每个字段添加Collate SQL_Latin1_General_CP1253_CI_AI的问题。