php - MySQL 查询在 mysql 中返回行,但在 PHP 中返回空集

标签 php mysql mediawiki

以下 MySQL 查询在 PHP 中运行没有错误,但结果集为空。直接将查询字符串输出到文件并使用“source [filename]”在 MySQL 客户端中运行查询会按预期返回多行结果。

有没有什么东西会导致此查询不适用于 PHP? categorylinks.cl_to 和 smw_spec2.value_string 都是 varbinary(255)。 Show create table表示engine=InnoDB,默认charset=binary。

我尝试过但没有成功的事情:

  • $sql = preg_replace("/[\n\t]+/", "", $sql);
  • 将“_wpg”和“Derp”更改为 CAST('_wpg' AS BINARY(255))
  • 将“_wpg”和“Derp”更改为BINARY“_wpg”

我正在使用 MediaWiki DatabaseMysql 类来执行查询和获取行,但这是一个非常薄的抽象,我确定这不是问题所在(见下文)。

SELECT 
    prop.name AS prop_name, prop.count AS prop_count, prop.type AS prop_type,
    val.value AS val_value, val.unit AS val_unit, val.count AS val_count
FROM
(
    SELECT 
        s_id, name, type, COUNT(foo.name) AS count
    FROM (  
        (
            SELECT
                cl.cl_to AS cat_name, s.smw_id AS s_id, s.smw_sortkey AS name, spec.value_string AS type
            FROM `smw_ids` s 
            INNER JOIN (`categorylinks` cl, `page` p, `smw_ids` s2, `smw_atts2` a)
                ON (cl.cl_from = p.page_id AND 
                    p.page_title = s2.smw_title AND 
                    s2.smw_id = a.s_id AND 
                    a.p_id = s.smw_id)
            LEFT JOIN `smw_spec2` spec ON s.smw_id = spec.s_id
        )

        UNION ALL           

        (
            SELECT 
                cl.cl_to AS cat_name, s.smw_id AS s_id, s.smw_sortkey AS name, '_wpg' AS type
            FROM `smw_ids` s 
            INNER JOIN (`categorylinks` cl, `page` p, `smw_ids` s2, `smw_rels2` a)
                ON (cl.cl_from = p.page_id AND 
                    p.page_title = s2.smw_title AND 
                    s2.smw_id = a.s_id AND 
                    a.p_id = s.smw_id)
        )
    ) AS foo

    WHERE foo.cat_name = 'Derp'
    GROUP BY name
    ORDER BY count DESC 
    LIMIT 10
) AS prop


INNER JOIN

(
    SELECT 
        bar.p_id AS p_id, bar.value AS value, bar.unit AS unit, COUNT(bar.value) AS count,
        IF( @prev != p_id, @rownum := 1, @rownum := @rownum+1 ) AS rank, 
        @prev := p_id 
    FROM (  
        (SELECT a.p_id AS p_id, a.value_xsd AS value, a.value_unit AS unit FROM `smw_atts2` a)
            UNION ALL
        (SELECT r.p_id AS p_id, s.smw_sortkey AS value, NULL AS unit
            FROM `smw_rels2` r INNER JOIN `smw_ids` s ON r.o_id = s.smw_id)
    ) AS bar

    GROUP BY value, unit
    ORDER BY count DESC

) AS val    
ON prop.s_id = val.p_id

WHERE val.rank <= 50

ORDER BY prop_count DESC, prop_name, val_count DESC, val_value  

编辑:以下测试脚本不输出任何内容。 query.sql 完全包含上面的查询,在 MediaWiki 的数据库类中调用 mysql_query() 之前立即写入文件。

$db = mysql_connect('localhost', 'root', '');
mysql_select_db('mediawiki', $db);

$res = mysql_query(file_get_contents("query.sql"), $db);

while ($row = mysql_fetch_assoc($res)) {
    var_dump($row);
}
echo mysql_error($db);

编辑:我导入了一个巨大的数据库转储,之后,当我加载 PHP 页面时,有一个明显的等待,似乎表明查询正在运行,但仍然没有显示结果。我最终修改了查询,并且不再有这个问题。

最佳答案

试试这个以更好地检测和报告错误:

$db = mysql_connect('localhost', 'root', '');
mysql_select_db('mediawiki', $db);

$res = mysql_query(file_get_contents("query.sql"), $db);
if (!$res) {
  print "SQL Error ".mysql_errno().":".mysql_error().", from query: '".file_get_contents("query.sql")."'";
} else {
  while ($row = mysql_fetch_assoc($res)) {
    var_dump($row);
  }
}

关于php - MySQL 查询在 mysql 中返回行,但在 PHP 中返回空集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5023268/

相关文章:

php - 无法使用 laravel 5 连接到数据库

PHP:跟踪用户和产品品牌的请求?

javascript - Media Wiki 页面中的 jQuery(不仅仅在 Monobook.js 或扩展中)

javascript - IE8 中的 MediaWiki/jQuery 交替表行颜色

php - 如何将数据插入一个表并获取主键作为外键插入另一个表?

php - 网页未从页面顶部显示

php - CakePHP:在插入数据之前向外部 API 发出请求

php - 如何获取用户交互的日期之间的日期

mysql - 在MySQL数据库中查找特殊字符

mediawiki - 如何检查用户是否是 Sysop 在 Mediawiki 中使用 Php?