2011-08-23 75 views
1

我使用IIS的SQLSRV驱动程序,以便我可以连接到PHP中的MS SQL服务器。奇怪的错误“sqlsrv_fetch_array():16是不是有效的ss_sqlsrv_stmt资源”,因为ReturnDatesAsStrings

我已经成功地转换了很多我原来mysql_代码和所有进展顺利,直到我试图从数据库中选择一些日期时间字段。他们赶回来,在PHP Date对象而不是字符串,我发现这是增加这个到连接阵列修复:

“ReturnDatesAsStrings” => 1

因为这样做,当尝试,虽然我的代码被打破填充我的记录:

function row_read($recordset) { 

    if (!$recordset) { 
     die('<br><br>Invalid query :<br><br><bold>' . $this->sql . '</bold><br><br>' . sqlsrv_error()); 
    } 

    $rs = sqlsrv_fetch_array($recordset); 
    return $rs; 
} 

的错误是:sqlsrv_fetch_array():16是不是有效的ss_sqlsrv_stmt资源

有帮助在谷歌的错误这样的小金额,所以这是我唯一的机会!我只是不明白。

row_read从内而被称为:而($行= $ DB-> row_read($ RS)){

任何想法?

只是为了增加更多的代码和逻辑 - 我做我的所有订单的简单选择,然后为它遍历他们,我做的是另2 SELECT的Orders表,然后客户表。它倒下时,我尝试这些额外的2“获取”:

 $this->db->sql = "SELECT * FROM TicketOrders"; 

    $rs = $this->db->query($this->db->sql); 

    $this->htmlList->path("skin/search.bookings"); 

    if ($this->db->row_count != 0) { 
     while ($row = $this->db->row_read($rs)) { 

      // Load the order row 
      $this->TicketOrders->get($this->db, $row['Id']);     

      // Load the customer row 
      $this->Customers->get($this->db, $row['CustomerId']); 

回答

0

sqlsrv_fetch_array需要ss_sqlsrv_stmt资源。您的SQL必须有问题。

+0

感谢您的回答,但是当我回声出2我的SQL的语句然后将它们粘贴回SQL Studio,它们执行得很好? 选择ID,客户ID,NightId,ClubName,NightName,NightDate,数量TicketType,价钱,CancelledDate,订购日期,QuoteNumber,已完成,状态,txn_id,EmailSent FROM TicketOrders其中id = 1086730 选择ID,名字,姓氏, EmailAddress,订阅从客户那里Id = 10068 –

+0

@詹姆斯威尔逊:也许你可以使用'sqlsrv_errors()'得到错误的细节。 – xdazz

+0

嗯,不是细节:sqlsrv_fetch_array():16是不是一个有效的ss_sqlsrv_stmt资源?我已经尝试过在那条线之前和之后的呼应,它是空的 –

4

你另一个功能通过这个资源变量?如果是,您可以通过执行sqlsrv_query并在一个函数中执行sqlsrv_fetch_array来尝试;请勿通过其他功能传递ss_sqlsrv_stmt资源。希望它会有所帮助。

+0

@wasimchy,为什么$ RecordSet不能被函数传递?为什么会通过ref传递失败?而且你是非常正确的,它是这个问题的原因。 –

+0

我上面的条目(作为答案出现)应该是一个评论!我无法弄清楚。你如何为现有评论添加评论? –

+0

如果我能早点看到你的答案会更好。我可能在几个星期前的短时间内找到了这个问题。现在,我记得迄今为止,这可能是SQL Server新的PHP驱动程序的一个限制或缺陷。我用其他PHP驱动程序和FreeTDS测试了这个相同的函数(将资源变量作为参数传递),这两种情况都没有问题。它可能会返回不同的资源类型ss_sqlsrv_stmt(如果我现在不忘记),在我的情况下,不能与PHP资源类型匹配。由于时间不足,我只是改变了我的函数风格,尽管代码的美感略逊一筹。 – Agilox

2

请问您的计划包括嵌套查询功能?

如果是这样,接下来的问题是:你在内部查询功能打开同一个数据库?

尝试这些变化:

  1. 评论指出,打开数据库的行,包括{和}围绕该功能,
  2. 变化外环和之间的连接和数组变量的名称内循环。

换句话说,外环可以有:

$tring = sqlsrv_query($myConn, $dbx_str1);  
while($rs_row1 = sqlsrv_fetch_array($tring, SQLSRV_FETCH_ASSOC)) 

和内环路将有:

$tring2 = sqlsrv_query($myConn, $dbx_str2);  
while($rs_row2 = sqlsrv_fetch_array($tring2, SQLSRV_FETCH_ASSOC)) 
相关问题