PHP远程MySQL数据获取大小限制问题

时间:2014-05-22 12:31:02

标签: php mysql blob lob

我试图远程连接到服务器的MySQL数据库并拉一行。但是我遇到了这个问题:

我能够提取一些特定的列数据但不能拉出整行。

示例:

这有效:

-- Query 1
SELECT  id, name, link, cat, image, title, features
FROM products 
WHERE data_ready=1 
ORDER BY id ASC
LIMIT 0,1

但这不起作用:

-- Query 2
SELECT *
FROM products
WHERE data_ready=1
ORDER BY id ASC
LIMIT 0,1  

这也不是

-- Query 3
SELECT  id, name, link, cat, image, title, features, description
FROM products
WHERE data_ready=1
ORDER BY id ASC
LIMIT 0,1

请注意,在第三个查询中,我试图仅提取一个不在查询1中的列description。说明字段的长度为1314.

有些东西限制了我可以获取的数据量,但我如何找到解决方法以及如何修复它?

顺便说一下,SELECT @@max_allowed_packet得出1048576。


修改

不工作'表示查询没有返回任何内容,但页面继续加载并最终超时。

是的,我已经在Mysql中直接测试了查询,它运行正常,

实际上我喜欢中央数据库服务器和许多客户端服务器,他们都从中央服务器获取数据。我能够将所有客户端服务器的整个数据提取到除了一个,我正面临这个问题。所以我相信它与某种php.ini设置有关。我比较了所有服务器中的phpinfo()设置,但无法确定可能导致此限制的原因。

SHOW TABLE STATUS的结果,如'产品&#39 ;;

Space usage
Data    438.8   MiB
Index   7.5 MiB
Total   446.3   MiB

Row Statistics
Format  Compact
Collation   latin1_swedish_ci
Next autoindex  2,015,640
Creation    May 19, 2014 at 01:46 PM

---更多信息--- 我的Php代码很简单:

<?php

$conn=@mysql_pconnect("xx.xx.xx.xx","DBNAME","DBPASS")or die("ERROR CONNECTING TO MYSQL SERVER");
@mysql_select_db("DBUSERNAME",$conn)or die("ERROR CONNECTING TO DATABASE");

$sql="select  id,pid,name,link,cat,image,title,features,price,description from products order by id asc limit 0,1";
$execute=mysql_query($sql,$conn);
$row=mysql_fetch_assoc($execute);
print_r($row);

?>

另外两个查询返回数据:

Query 4 - select  id,pid,name,link,cat,image,title,features from products order by id asc limit 0,1
Query 5 - select  id,pid,name,link,cat,image,title,description from products order by id asc limit 0,1

但如果我尝试同时获取功能和描述,则脚本永远不会完成并最终超时。即。

Query 6 - select  id,pid,name,link,cat,image,title,features ,description from products order by id asc limit 0,1

我在其他两台服务器上使用相同的代码。但我无法弄清楚这个服务器配置有什么问题:/

2 个答案:

答案 0 :(得分:0)

我认为您应该使用反引号`来逃避您要查询的字段:

-- Query 3
SELECT  `id`, `name`, `link`, `cat`, `image`, `title`, `features`, `description`
FROM products
WHERE data_ready=1
ORDER BY id ASC
LIMIT 0,1

因为MySQL可能会错误地解释descriptiontitlematch等关键字。

答案 1 :(得分:0)

一些疑难解答问题

有可能,但不确定,您遇到了一个名为max_allowed_pa​​cket的MySQL服务器设置问题。

尝试此操作,找出您未能获取的特定行的description字段的大小。

SELECT id, name, link, cat, image, title, features, 
       LENGTH(description)
  FROM products
 WHERE data_ready=1
 ORDER BY id ASC
 LIMIT 0,1

如果description的长度非常大,这可能是您的问题。 这是1314,这不是问题

发出此命令:

SELECT @@max_allowed_packet : **it's 1 048 576 which is plenty** 

对于description,它是否太小或太小?见:

http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

下一步:查看驱动MySQL的特定php代码

你为什么使用mysql_pconnect?你有充分的理由吗?如果没有,请切换到mysql_connect。无论如何,让这段代码使用mysql_connect,然后切换回来。

为什么要在pconnect中提供数据库名称,在select_db中提供用户名?你确定那些是对的吗?

需要清理问题中发布的代码,正确检查错误并跟踪可能遇到的问题。完成后,您还需要释放结果集。尝试这样的代码。请注意,我没有调试它,这取决于你。

 $execute=mysql_query($sql,$conn);
 if (!$execute) {
     die "Query ($sql) failed: " . mysql_error();
 }
 while ($row=mysql_fetch_assoc($execute)) {
    /* loop through a result set even if you don't think you need to. */
    print_r($row);
 }
 mysql_free_result($execute);