Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接正忙,出现另一个hstmt错误的结果_Php_Sql_Sql Server 2005_Odbc_Connection - Fatal编程技术网

Php 连接正忙,出现另一个hstmt错误的结果

Php 连接正忙,出现另一个hstmt错误的结果,php,sql,sql-server-2005,odbc,connection,Php,Sql,Sql Server 2005,Odbc,Connection,我是新手。我的大部分查询都是用PHP编写的。我创建了一个连接对象,然后点击sql server function navigation($sel_subject, $sel_page,$filter=false) { $subject_set = get_all_subjects(); $page_set = get_pages_for_subject($subject["id"],$sec_wp,$filter); } function get_all_subjects()

我是新手。我的大部分查询都是用PHP编写的。我创建了一个连接对象,然后点击sql server

function navigation($sel_subject, $sel_page,$filter=false) {

    $subject_set = get_all_subjects();
    $page_set = get_pages_for_subject($subject["id"],$sec_wp,$filter);
}

function get_all_subjects() {
    global $connection;
    $query = "  SELECT * FROM subjects ORDER BY position ";
    return odbc_exec($connection,$query);
}
现在,我正在更新几个只需要从数据库中获取数据的简单查询。我正在将它们升级到存储过程

function get_all_subjects() {    global $connection;
    $query = "  EXEC get_all_subjects ";  
 return odbc_exec($connection,$query); }
我收到一条错误消息。 连接正忙,出现另一个hstmt错误的结果

我正在使用SQLServer2005和ODBC连接器

解决这个问题的最好办法是什么。或者问管理员是否可以,这是一个更好的主意 做点像 奥塔·霍尔斯塔德说。。。 当使用BDE通过ODBC连接到MS SQL Server时,可以(有时?)通过使用SQL本机客户端而不是用于ODBC的SQL Server驱动程序来解决此问题


我想知道,它是更好地激活火星(多个活跃的结果集)。如果是这样,请帮助我提供一个逐步的过程来启用相同的功能。

当您完成一个
odbc\u exec
的结果时,是否可以尝试添加
odbc\u free\u result
调用?

我建议使用其他框架,例如

  • PDO
  • ADOdB
这些应该比odbc更灵活、更先进。odbc_exec致力于返回服务器端游标,这不允许在同一连接上运行另一个查询。客户端游标将所有数据作为静态快照一次性发送到客户端,因此连接对于其他查询是免费的


使用odbc,如果在第一个结果集处于活动状态时需要另一个结果集,则可以创建多个连接句柄并使用不同的连接句柄。

我认为潜在的解决方案有三个部分

首先是更好地优化SQL语句

尝试使用LIMIT语句,不要使用*并仅定义所需的字段。这两件事可以帮助减少SQL语句的内存负载

其次,尝试更好地优化您的数据库表结构(即:减少Keyname/索引值等)。如果您的数据库大小很大(比如50000行或更大),可以尝试切换到InnoDB以防止行锁定。您还可以尝试从辅助(temp)db表执行一些表复制和查询,以减少主db的负载。显然,在我们不知道您的DB模式的情况下,这只是我“抛出一个建议”

第三,除非你碰到一个超过一百万行的数据库,并且你遇到了一个连接繁忙的错误,否则你很有可能需要和你的主机提供商谈谈。即使在共享服务器中,这些类型的错误消息(如果您的代码尽可能优化)也几乎总是由于您的服务器没有分配足够的内存造成的

正如cyberkiwi所指出的,您可以尝试将ADOdb放入ftp并运行一个简单的循环,看看ADOdb的内部内存分配是否有帮助。上传ADOdb(包括ADOdb)并运行以下循环将非常简单:

$Data = $connection->Execute("SELECT field1, field2, field2 FROM subjects ORDER BY position ASC LIMIT 0, 10");
if (is_object($Data)&&(!$Data->EOF))
{
    while (!$Data->EOF)
    {
        //
        // string, array, echo, whatever here
        //
    $Data->MoveNext();
    }
}
unset($Data);

最后,尽管这些类型的错误要么是由于编写糟糕的SQL语句导致多个连接暂停(在这种情况下,要求增加“最大并发连接”),要么是板载内存或php分配的内存不足(在这种情况下,要求增加“内存限制”).

您必须启用默认禁用的MARS(多个活动结果集)。您可以通过切换到“SQL本机客户端”来避免此错误消息。有关更多信息

感谢您的回复。odbc_free_result清除结果集。如果它是一个更新函数,则可以解决该问题。当我从中检索数据时,我需要调用第二个函数。我不能用这个:(我在这里写的代码是示例代码。所以我写了select*,而不是select独立字段。测试时表中的记录数只有10。所以我怀疑我们是否还需要限制数量。链接死了!