我试图远程连接到服务器的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
我在其他两台服务器上使用相同的代码。但我无法弄清楚这个服务器配置有什么问题:/
答案 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可能会错误地解释description
,title
或match
等关键字。
答案 1 :(得分:0)
有可能,但不确定,您遇到了一个名为max_allowed_packet的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);